本文将帮助你厘清在Kubernetes中调试 deployment的思路。下图是完整的故障排查思路,如果你想获得更清晰的图片,请在公众号后台(RancherLabs)回复“troubleshooting”。
当你希望在Kubernetes中部署一个应用程序,你通常需要定义三个组件:
-
Deployment——这是创建名为Pods的应用程序副本的方法
-
Serivce——内部负载均衡器,将流量路由到Pods
-
Ingress——可以描述流量如何从集群外部流向Service
接下来,我们通过图片快速回顾一下。
在Kubernetes中,你的应用程序通过两层负载均衡器暴露:内部和外部。
内部负载均衡器称为Service,而外部负载均衡器则称为Ingress。
Pod未直接部署,因此,Deployment创建Pod并监视它们。
假设你想部署一个简单的Hello World应用程序,那么对于此类应用程序,其YAML文件与以下类似:
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-deployment
labels:
track: canary
spec:
selector:
matchLabels:
any-name: my-app
template:
metadata:
labels:
any-name: my-app
spec:
containers:
- name: cont1
image: learnk8s/app:1.0.0
ports:
- containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
ports:
- port: 80
targetPort: 8080
selector:
name: app
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: my-ingress
spec:
rules:
- http:
paths:
- backend:
serviceName: app
servicePort: 80
path: /
这个定义很长,容易忽略组件之间的相互关系。
例如:
-
你什么时候应该使用80端口,什么时候使用端口8080?
-
你是否应该为每个服务创建一个新端口,以免它们冲突?
-
标签(label)名称重要吗?是否应该每一处都一样?
在进行debug之前,我们先来回顾一下这三个组件之间的关系如何。
首先,我们从Deployment和Service开始。
连接Deployment和Service
实际上,Deployment和Service根本没有连接。相反,该Service直接指向Pod,并完全跳过Deployment。所以,你应该关注的是Pod和Service是如何与彼此关联的。你应该记住三件事:
-
Service selector至少与Pod的一个标签匹配
-
Serivce
targetPort
应该与Pod内的容器的containerPort
相匹配 -
Serviceport可以是任何数字。多个Service可以使用同一个端口,因为它们已经被分配了不同的IP地址
以下图片总结了如何连接端口:
考虑由Service暴露的pod
当你创建一个pod,你应该在你的Pod中为每个容器定义端口containerPort
当你创建一个Service时,你能够定义一个port
和一个targetPort
。但你应该将哪一个连接到容器呢?
targetPort
与containerPort
应该能够匹配
如果你的容