使用 Kubernetes 的主要优势之一是它能够维护在集群中运行的容器:只需创建一个 Pod 资源,让 Kubernetes 为其选择一个工作节点,它就会在该节点上运行 Pod 的容器。但是,如果容器或 Pod 失败了怎么办?
一旦 Pod 被调度到一个节点,该节点上的 kubelet 将运行其容器,并在 Pod 存在期间保持它们运行。如果容器的主进程崩溃,kubelet 将重新启动容器。但是,如果容器中的应用程序存在缺陷,导致每次都重新启动,Kubernetes 可以对其进行修复。
kubelet 使用存活探针来了解何时重新启动容器。例如,存活探针可以修复应用程序正在运行但无法取得进展的情况。在这种情况重新启动容器可以帮助使应用程序在存在错误的情况下仍然可用。
kubelet 使用就绪探针来了解容器何时准备好开始接受流量。当 Pod 的所有容器都准备就绪时,该 Pod 被认为是就绪的。此信号的一个用途是控制哪些 Pod 用作服务的后端。当 Pod 未就绪时,它将从服务负载均衡器中移除。
Kubernetes 存活探针
Kubernetes 可以通过三种方式探测容器
-
HTTP GET 探针在容器的 IP 上执行 HTTP GET 请求。
-
TCP 套接字探针尝试打开与指定容器的 TCP 连接。
-
Exec 探针在容器内运行命令。
HTTP Get 存活探针
以下 YAML 清单创建一个包含 HTTP GET 存活探针的 Pod
apiVersion: v1
kind: Pod
metadata:
labels:
test: liveness
name: liveness-http
spec:
containers:
- name: liveness
image: k8s.gcr.io/liveness
args:
- /server
livenessProbe:
httpGet:
path: /healthz
port: 8080
httpHeaders:
- name: X-Custom-Header
value: Awesome
initialDelaySeconds: 3
periodSeconds: 3
Pod 描述符定义了一个 httpGet
存活探针,它告诉 Kubernetes 定期对路径 /healthz
上的端口 8080
执行 HTTP Get 请求,以确定容器是否仍然健康。
periodSeconds
字段指定 kubelet 应每 3 秒执行一次存活探针。initialDelaySeconds
字段告诉 kubelet 在执行第一次探针之前等待 3 秒。
TCP 套接字存活探针
以下 YAML 清单创建一个包含 TCP 套接字存活探针的 Pod
apiVersion: v1
kind: Pod
metadata:
name: goproxy
labels:
app: goproxy
spec:
containers:
- name: goproxy
image: k8s.gcr.io/goproxy:0.1
ports:
- containerPort: 8080
readinessProbe:
tcpSocket:
port: 8080
initialDelaySeconds: 5
periodSeconds: 10
livenessProbe:
tcpSocket:
port: 8080
initialDelaySeconds: 15
periodSeconds: 20
Exec 存活探针
以下 YAML 清单创建一个包含 Exec 存活探针的 Pod
apiVersion: v1
kind: Pod
metadata:
labels:
test: liveness
name: liveness-exec
spec:
containers:
- name: liveness
image: k8s.gcr.io/busybox
args:
- /bin/sh
- -c
- touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600
livenessProbe:
exec:
command:
- cat
- /tmp/healthy
initialDelaySeconds: 5
periodSeconds: 5
Kubernetes 就绪探针
有时应用程序会暂时无法服务流量——例如,如果应用程序需要在启动期间加载大型数据或配置文件。在这种情况下,您不想杀死应用程序,但也不想向其发送请求。Kubernetes 提供了就绪探针来检测和缓解这些情况。
就绪探针的配置方式与存活探针类似。唯一的区别是您使用 readinessProbe
字段而不是 livenessProbe
字段。
HTTP Get 就绪探针
以下 YAML 清单创建一个包含 HTTP Get 就绪探针的 Pod
apiVersion: v1
kind: Pod
metadata:
labels:
test: readiness
name: readiness-http
spec:
containers:
- name: readiness
image: k8s.gcr.io/liveness
args:
- /server
readinessProbe:
httpGet:
path: /healthz
port: 8080
httpHeaders:
- name: X-Custom-Header
value: Awesome
initialDelaySeconds: 3
periodSeconds: 3
TCP 套接字就绪探针
以下 YAML 清单创建一个包含 TCP 套接字就绪探针的 Pod
apiVersion: v1
kind: Pod
metadata:
name: goproxy
labels:
app: goproxy
spec:
containers:
- name: goproxy
image: k8s.gcr.io/goproxy:0.1
ports:
- containerPort: 8080
readinessProbe:
tcpSocket:
port: 8080
initialDelaySeconds: 5
periodSeconds: 10
livenessProbe:
tcpSocket:
port: 8080
initialDelaySeconds: 15
periodSeconds: 20
Exec 就绪探针
以下 YAML 清单创建一个包含 Exec 就绪探针的 Pod
apiVersion: v1
kind: Pod
metadata:
labels:
test: readiness
name: readiness-exec
spec:
containers:
- name: readiness
image: k8s.gcr.io/busybox
args:
- /bin/sh
- -c
- touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600
readinessProbe:
exec:
command:
- cat
- /tmp/healthy
initialDelaySeconds: 5
periodSeconds: 5
Kubernetes 通过在容器崩溃或其存活探针失败时重新启动它们来保持容器运行。这项工作由托管 Pod 的节点上的 kubelet 执行。
如果节点本身崩溃,控制平面必须替换在该节点上运行的所有 Pod。在这种情况下,您可以使用复制机制在集群内的另一个节点上重新创建 Pod。我将在我的下一篇文章中介绍这个主题。
1 条评论