我们发现在我们的 daemonset 部署描述符中定义的端口没有反射(reflect)在正在运行的 pod 中。
我们使用的镜像是 NGINX,我们将这些主机端口路由到 80 和 8080:
ports:
- containerPort: 80
hostPort: 30003
- containerPort: 8080
hostPort: 30002
没有错,部署历史显示这些端口在 pod 中处于事件状态:
daemonset.extensions/nginx-licensed with revision #25
Pod Template:
Containers:
nginx-licensed:
Image: nginx-licensed:1.0.117
Ports: 80/TCP, 8080/TCP
Host Ports: 30003/TCP, 30002/TCP
我们想更改使用的主机端口,并允许逐步更改基础架构,我们将旧主机端口和新主机端口分配给相同的容器端口:
ports:
- name: new80
containerPort: 80
hostPort: 20003
- name: old80
containerPort: 80
hostPort: 30003
- name: new8080
containerPort: 8080
hostPort: 20002
- name: old8080
containerPort: 8080
hostPort: 30002
此时,“kubectl apply”只会导致 2000x 端口处于事件状态:
daemonset.extensions/nginx-licensed with revision #26
Pod Template:
Containers:
nginx-licensed:
Image: nginx-licensed:1.0.119
Ports: 80/TCP, 8080/TCP
Host Ports: 20003/TCP, 20002/TCP
请注意,如果我们重新启动 pod,所有四个端口都将变为事件状态:
daemonset.extensions/nginx-licensed with revision #1
Pod Template:
Containers:
nginx-licensed:
Image: nginx-licensed:1.0.119
Ports: 80/TCP, 80/TCP, 8080/TCP, 8080/TCP
Host Ports: 20003/TCP, 30003/TCP, 20002/TCP, 30002/TCP
但是,如果我们不重新启动 pod,并尝试删除 3000x pod,即:
ports:
- containerPort: 80
hostPort: 20003
- containerPort: 8080
hostPort: 20002
我们最终没有容器港口! :
daemonset.extensions/nginx-licensed with revision #27
Pod Template:
Containers:
nginx-licensed:
Image: nginx-licensed:1.0.119
Ports: 80/TCP, 8080/TCP
Host Ports: 0/TCP, 0/TCP
任何想法为什么会这样,或者我们做错了什么?我们回滚到定义了四个端口的版本(即 2000x 和 3000x),这导致只有 2000x 主机端口处于事件状态。
这看起来像一个错误吗?
谢谢!
最佳答案
我在 GKE 上重现了您的场景,我的症状与您相同。
有一种方法可以实现您的需求,为此您需要patch你的对象。您需要使用补丁类型merge-patch+json
作为补丁,您需要提供完整/所需的 containerPort 列表。
首先,您需要导出 yaml 文件并进行必要的更改:
$ kubectl get deployments <your-deployment> -o yaml --export > patch-file.yaml
进行更改后,对其进行修补:
$ kubectl patch deployments <your-deployment> --type merge --patch "$(cat patch-file.yaml)"
这样做后,我有你想要的状态:
$ kubectl describe deployments nginx-deployment | grep -i ports
Ports: 80/TCP, 80/TCP, 8080/TCP, 8080/TCP
Host Ports: 20003/TCP, 30003/TCP, 20002/TCP, 30002/TCP
如果您想深入了解这是如何在后台工作的,请参阅文档 here和 here .
关于kubernetes - Pod 中的端口与部署描述符中的端口不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58918421/