太长不看版:下面这张图可以帮助你调试 Kubernetes 中的 Deployment。

当你想要在 Kubernetes 中部署应用程序时,通常需要定义 3 个组件:

  • Deployment:创建 Pod 副本的方法;
  • Service:内部负载均衡器,将流量路由到 Pod;
  • Ingress:描述流量如何从外部集群流向 Service;

可以用下面的示意图来简单说明。

Kubernetes 中应用程序通过内部和外部两层负载均衡器暴露


内部负载均衡器叫 Service,外部负载均衡器叫 Ingress

Pod 不是直接部署的。相反,Deployment 会创建 Pod,并监控 Pod

假设你希望部署一个简单的 Hello World 应用程序,这个应用程序的 YAML 应该类似于如下内容:

定义很长,很容易忽略组件之间的相互关系。例如:

  • 何时应使用端口 80,何时应使用端口 8080?
  • 是否应该为每个服务创建一个新端口,以免冲突?
  • 标签(label)名称重要吗?应该保持标签名称一致吗?

在进行调试之前,让我们回顾一下这三个组件之间的关系。我们从 Deployment 和 Service 开始。

连接 Deployment 和 Service

令人惊讶的是,Deployment 和 Service 之间根本没有连接。相反,Service 直接指向 Pod,完全跳过了 Deployment。因此,你应该关注的是 Pod 和 Service 之间是如何相互关联的。

请记住以下三件事:

  • Service selector 应至少匹配 Pod 的一个标签;
  • Service 的 targetPort 应该与 Pod 的 containerPort 匹配;
  • Service 端口可以是任何数字。多个 Service 可以使用同一个端口,因为每个 Service 分配到的 IP 地址不同;

下图总结了如何连接端口:

考虑通过 Service 暴露的以下 Pod

在创建 Pod 时,需要为 Pod 中的每个容器定义端口 containerPort