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

标签 kubernetes

我们发现在我们的 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

如果您想深入了解这是如何在后台工作的,请参阅文档 herehere .

关于kubernetes - Pod 中的端口与部署描述符中的端口不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58918421/

相关文章:

Kubernetes - 在污染/容忍上启用自动 pod 重新调度

kubernetes - 如何处理 couchbase 集群中的 IP 地址更改?

java - 使用Java kubernetes-client从kubernetes入口删除路径

kubernetes - 如何通过--packages在Kubernetes托管集群中进行Spark提交?

go - Go中的编码(marshal)Yaml错误

kubernetes - 在k8s中查找admin_ca,cluster_ca和admin_cert的位置

docker - 一项微服务执行许多转换还是许多微服务执行一项转换?

kubernetes - 无法使用 `kubectl logs` 或 `kubectl exec` 解析主机名

postgresql - Postgres/K8S : PANIC could not locate a valid checkpoint record/CrashLoopBackOff

docker - Kubernetes 节点 ulimit 设置