本文共 4388 字,大约阅读时间需要 14 分钟。
[root@k8s-master01 ~]# kubectl explain pods.spec.containers.lifecycle.postStart.tcpSocket #健康主机的端口sock
许多应用程序经过长时间运行,最终过渡到无法运行的状态,除了重启,无法恢复。通常情况下,K8S会发现应用程序已经终止,然后重启应用程序/pod。 有时应用程序可能因为某些原因(后端服务故障等)导致暂时无法对外提供服务,但应用软件没有终止,导致K8S无法隔离有故障的pod,调用者可能会访问到有故障的pod,导致业务不稳定。K8S提供livenessProbe来检测应用程序是否正常运行,并且对相应状况进行相应的补救措施。[root@k8s-master01 ~]# kubectl explain pods.spec.containers.livenessProbe
exec 在用户容器内执行一次命令,如果命令执行的退出码为0,则认为应用程序正常运行,其他任务应用程序运行不正常。 httpGet 调用容器内Web应用的web hook,如果返回的HTTP状态码在200和399之间,则认为应用程序正常运行,否则认为应用程序运行不正常。每进行一次HTTP健康检查都会访问一次指定的URL。 initialDelaySeconds:容器启动后第一次执行探测是需要等待多少秒。 periodSeconds: 执行探测的频率。默认是10秒,最小1秒。 timeoutSeconds:探测超时时间。默认1秒,最小1秒。 successThreshold:探测失败后,最少连续探测成功多少次才被认定为成功。默认是1。对于liveness必须是1。最小值是1。 failureThreshold:探测成功后,最少连续探测失败多少次才被认定为失败。默认是3。最小值是1。 TCPSocket: 将会尝试打开一个用户容器的Socket连接(就是IP地址:端口)。如果能够建立这条连接,则认为应用程序正常运行,否则认为应用程序运行不正常。
[root@k8s-master01 ~]# cat busybox_LivenesProbe.yaml apiVersion: v1 kind: Pod metadata: labels: test: liveness-exec name: liveness-exec spec: containers: - name: liveness-demo image: busybox args: - /bin/sh - -c - touch /tmp/healthy; sleep 30;rm -fr /tmp/healthy;sleep 600 livenessProbe: exec: command: - test - -e - /tmp/healthy [root@k8s-master01 ~]# kubectl describe pods/liveness-exec
等待一段时间 发现重启了一次 状态发生过更改随着时间更改 会重启多次
[root@k8s-master01 ~]# cat http_get_nginx.yaml apiVersion: v1 kind: Pod metadata: labels: test: liveness name: liveness-httpget namespace: prod spec: containers: - name: liveness-nginx image: nginx ports: - name: http containerPort: 80 lifecycle: postStart: exec: command: - /bin/sh - -c - 'echo Healty > /usr/share/nginx/html/healthz' livenessProbe: httpGet: path: /healthz port: http scheme: HTTP periodSeconds: 2 #每隔2秒检测一次 failureThreshold: 2 #失败2次 证明此节点是失败了 timeoutSeconds: 2 #超时时间2秒 代表失败 initialDelaySeconds: 3 #容器启动开始延迟3秒开始检测[root@k8s-master01 ~]# kubectl apply -f http_get_nginx.yaml[root@k8s-master01 ~]# kubectl get pods -n prod[root@k8s-master01 ~]# kubectl get pods -n prod -w -w 等同于shell的 watch 打印详细信息 [root@k8s-master01 ~]# kubectl describe pods -n prod
手动使其检测失败 [root@k8s-master01 ~]# kubectl exec -it liveness-httpget -n prod -- /bin/bash root@liveness-httpget:/# cd /usr/share/nginx/html/ root@liveness-httpget:/usr/share/nginx/html# mv healthz healthz_back 再次查看详细信息[root@k8s-master01 ~]# kubectl describe pods -n prod会发现又重启了一次,在等登录查看 发现healthz 再次生成,并且值为:Healty
[root@k8s-master01 ~]# kubectl explain pods.spec.containers.livenessProbe.httpGet host #要连接的主机名,默认为pod IP,配合httpHeaders使用 httpHeaders #要在请求中设置的自定义头。HTTP允许重复报头。 比如post 请求 path #访问HTTP服务器的路径 port #要在容器上访问的端口的名称或编号。数字必须在范围1到65535。名称必须是IANA_SVC_NAME scheme 用于连接到主机的方案。默认为HTTP
检测容器是否启动完毕 不具有重启容器的权限,如果容器启动完毕 但是容器内服务没有就绪,会删掉移除此容器 [root@k8s-master01 ~]# kubectl explain pods.spec.containers.readinessProbe 语法使用方式参考:https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probeexec
[root@k8s-master01 ~]# vim readinessProbe_nginx.yaml apiVersion: v1 kind: Pod metadata: labels: test: readinessProbe name: readinessprobe-exec namespace: prod spec: containers: - name: readiness-probe-busybox image: busybox args: ["/bin/sh","-c","while true; do rm -f /tmp/ready; sleep 30; touch /tmp/ready;sleep 300; done"] readinessProbe: exec: command: ["test","-e","/tmp/ready"] initialDelaySeconds: 5 periodSeconds:
上面的图可以看出 虽然容器已经启动了,但是容器里面的服务器还是没有启动状态, 每隔5秒检测一次 检测5次,当这个文件存在的时候 容器和服务启动完毕
转载于:https://blog.51cto.com/9025736/2400591