我们发现在后台驻留程序部署描述符中定义的端口未反映在正在运行的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
但是,如果我们不重新启动广告连播,请尝试删除3000x的广告连播,即:
ports:
- containerPort: 80
hostPort: 20003
- containerPort: 8080
hostPort: 20002
最后我们得到的是 no 容器端口! :
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主机端口处于活动状态。
这看起来像个虫子吗?
谢谢!
答案 0 :(得分:0)
我转载了您在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