我有一个带有指向它的服务的 DaemonSet。当一个 Pod 访问我的服务的 ClusterIP 时,它会获取本地 Pod 运行在同一节点上还是服务中的任何 Pod?
有什么办法可以做到这一点?我的理解是,这与externaltrafficpolicy: local
内部流量相同。
我有一个带有指向它的服务的 DaemonSet。当一个 Pod 访问我的服务的 ClusterIP 时,它会获取本地 Pod 运行在同一节点上还是服务中的任何 Pod?
有什么办法可以做到这一点?我的理解是,这与externaltrafficpolicy: local
内部流量相同。
默认情况下,发送到 ClusterIP 或 NodePort 服务的流量可以路由到服务的任何后端地址。从 Kubernetes 1.7 开始,可以将“外部”流量路由到运行在接收流量的节点上的 Pod,但是 ClusterIP 服务不支持这种方式,并且更复杂的拓扑(例如区域路由)是不可能的。服务拓扑功能通过允许服务创建者定义基于源节点和目标节点的节点标签路由流量的策略来解决此问题。
需要用到:服务拓扑
一个喜欢本地 pod 的示例服务:
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app: my-app
ports:
- protocol: TCP
port: 80
targetPort: 9376
topologyKeys:
- "kubernetes.io/hostname"
- "*"
更新 1:
还有另一个选项可以确保发送到某个特定节点的端口的请求将在同一个节点上处理 - 它是hostPort
.
一个例子:
kind: Pod
apiVersion: v1
metadata:
name: test-api
labels:
app: test-api
spec:
containers:
- name: testapicontainer
image: myprivaterepo/testapi:latest
ports:
- name: web
hostPort: 55555
containerPort: 80
protocol: TCP
上面的 pod 将暴露容器端口- 如果你有80
这些pod - 那么你可以确定它们将在每个节点上运行,并且每个请求都将在接收它的节点上处理。hostPort: 55555
DaemonSet
但是,请小心使用它并阅读以下内容:配置最佳实践