本文将帮助你厘清在 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 应该能够匹配
如果你的容器暴露端口 3000, 那么 targetPort 应该与该数字相匹配.
如果你查看了 YAML, 标签与 ports 或 targerPort 应该匹配:
- 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:
- any-name: my-App
那么在 Deployment 顶部的 track: canary 标签呢? 也应该匹配吗?
那个标签属于 deployment, 并且 Service selector 不使用它来路由流量. 换言之, 你可以安全地将其移除或者给它分配不同的值.
那么 matchLabelsselector 呢? 它需要与 Pod 标签匹配并且 Deployment 使用它来跟踪 Pod.
- apiVersion: v1
- kind: Service
- metadata:
- name: my-service
- spec:
- ports:
- - port: 80
- targetPort: 8080
- selector:
- any-name: my-App
- ---
- apiVersion: networking.k8s.io/v1beta1
- kind: Ingress
- metadata:
- name: my-ingress
- spec:
- rules:
- - http:
- paths:
- - backend:
- serviceName: my-service
- servicePort: 80
- path: /
- kubectl get pods --all-namespaces
- NAMESPACE NAME READY STATUS
- kube-system coredns-5644d7b6d9-jn7cq 1/1 Running
- kube-system etcd-minikube 1/1 Running
- kube-system kube-apiserver-minikube 1/1 Running
- kube-system kube-controller-manager-minikube 1/1 Running
- kube-system kube-proxy-zvf2h 1/1 Running
- kube-system kube-scheduler-minikube 1/1 Running
- kube-system nginx-ingress-controller-6fc5bcc 1/1 Running
- kubectl describe pod nginx-ingress-controller-6fc5bcc \
- --namespace kube-system \
- | grep Ports
- Ports: 80/TCP, 443/TCP, 18080/TCP
- kubectl get pods
- NAME READY STATUS RESTARTS AGE
- app1 0/1 ImagePullBackOff 0 47h
- app2 0/1 Error 0 47h
- app3-76f9fcd46b-xbv4k 1/1 Running 1 47h
- ImagePullBackoff
- ImageInspectError
- ErrImagePull
- ErrImageNeverPull
- RegistryUnavailable
- InvalidImageName
- CrashLoopBackOff
- RunContainerError
- KillContainerError
- VerifyNonRootError
- RunInitContainerError
- CreatePodSandboxError
- ConfigPodSandboxError
- KillPodSandboxError
- SetupNetworkError
- TeardownNetworkError
- kubectl get pods --all-namespaces
- NAMESPACE NAME READY STATUS
- kube-system coredns-5644d7b6d9-jn7cq 1/1 Running
- kube-system etcd-minikube 1/1 Running
- kube-system kube-apiserver-minikube 1/1 Running
- kube-system kube-controller-manager-minikube 1/1 Running
- kube-system kube-proxy-zvf2h 1/1 Running
- kube-system kube-scheduler-minikube 1/1 Running
- kube-system nginx-ingress-controller-6fc5bcc 1/1 Running
- kubectl describe pod nginx-ingress-controller-6fc5bcc
- --namespace kube-system \
- | grep Ports
来源: https://www.cnblogs.com/rancherlabs/p/12330916.html