【问题标题】:Ports in the pod and not the same as in the deployment descriptorpod 中的端口,与部署描述符中的端口不同
【发布时间】:2019-11-26 21:42:04
【问题描述】:

我们发现在我们的 daemonset 部署描述符中定义的端口并没有反映在正在运行的 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 主机端口处于活动状态。

这看起来像错误吗?

谢谢!

【问题讨论】:

  • 您使用的是哪个云提供商,您的 kubernetes 和 kubectl 的版本是什么?
  • 我可以在 OpenStack 环境中复制问题,使用这些版本Client Version: version.Info{Major:"1", Minor:"13", GitVersion:"v1.13.2", GitCommit:"cff46ab41ff0bb44d8584413b598ad8360ec1def", GitTreeState:"clean", BuildDate:"2019-01-10T23:35:51Z", GoVersion:"go1.11.4", Compiler:"gc", Platform:"linux/amd64"} Server Version: version.Info{Major:"1", Minor:"13", GitVersion:"v1.13.2", GitCommit:"cff46ab41ff0bb44d8584413b598ad8360ec1def", GitTreeState:"clean", BuildDate:"2019-01-10T23:28:14Z", GoVersion:"go1.11.4", Compiler:"gc", Platform:"linux/amd64"}
  • 作为一个兴趣点,如果我在最后一个部署描述符上使用 'kubectl apply' - 这导致主机端口消失 - 主机端口设置正确
  • 您的 kubernetes 版本是多少? $ kubectl version
  • kubectl version 的输出在我上面的回复中给出 - 据我所见,服务器和客户端都是 1.13.2。抱歉,我没有说清楚这是 kubernetes 版本而不是 OpenStack

标签: kubernetes


【解决方案1】:

我在 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

【讨论】:

  • 感谢您调查这个问题,知道它可以被复制是很有用的。也感谢您的链接!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多