最近我正在配置一个由3个节点(master、worker1和worker2(组成的k8s集群,该集群将承载UDP应用程序(它的8个副本(。一切都完成了,集群运行得很好,但只有一个问题。
基本上有一个描述Pod的部署,它看起来像:
apiVersion: apps/v1
kind: Deployment
metadata:
name: <name>
labels:
app: <app_name>
spec:
replicas: 8
selector:
matchLabels:
app: <app_name>
template:
metadata:
labels:
app: <app_name>
spec:
containers:
- name: <name>
image: <image>
ports:
- containerPort: 6000
protocol: UDP
还有一项服务用于访问UDP应用程序:
apiVersion: v1
kind: Service
metadata:
name: <service_name>
labels:
app: <app_name>
spec:
type: NodePort
ports:
- port: 6000
protocol: UDP
nodePort: 30080
selector:
app: <app_name>
当我尝试访问服务时,可能会出现两种不同的情况:
- 请求被分配给接收请求的同一节点中的POD
- 请求被分配给另一个节点中的POD
在第二种情况下,请求正确到达POD,但源IP以0结束(例如10.244.1.0(,因此响应永远不会正确传递。
我想不通,我真的尝试了一切,但这个问题仍然存在。此时,为了使集群正常工作,我以这种方式将externalTrafficPolicy: Local
和internalTrafficPolicy: Local
添加到服务中,请求将保留在本地,因此当向worker1发送请求时,它将被分配给在worker1上运行的Pod,worker2也是如此。
你对这个问题有什么想法吗?感谢大家。
您是否确认第二个场景的响应没有正确传递?在这种情况下,源IP地址应该是请求第一次到达的节点的IP地址。
我的印象是,您假设由于IP地址以0结尾,这必然是一个网络地址,这可能是一个错误的假设,因为这取决于为分配节点的子网络配置的网络掩码;例如,如果节点位于子网10.244.0.0/23中,则网络地址为10.244.0.0,10.244.1.0只是可以分配给节点的另一个可用地址。
现在,如果您的应用程序需要保留客户端的IP地址,那么这可能是一个问题,因为默认情况下,在目标容器中看到的源IP不是客户端的原始源IP。在这种情况下,除了将externalTrafficPolicy
配置为本地外,还需要按照"保留客户端源IP"文档中的指定配置healthCheckNodePort
。