Pod中的端口,与部署描述符中的端口不同

时间:2019-11-18 15:53:04

标签: kubernetes

我们发现在后台驻留程序部署描述符中定义的端口未反映在正在运行的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主机端口处于活动状态。

这看起来像个虫子吗?

谢谢!

1 个答案:

答案 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

如果您想深入了解其在后台的工作方式,请参阅文档herehere