前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >「走进k8s」Kubernetes1.15.1的POD健康检查(19)

「走进k8s」Kubernetes1.15.1的POD健康检查(19)

作者头像
IT架构圈
发布2019-08-19 15:26:40
9990
发布2019-08-19 15:26:40
举报
文章被收录于专栏:IT架构圈IT架构圈

上次一起学习了pod的2个钩子函数:PostStart 和 PreStop。PostStart是容器创建后执行的(异步的),PreStop是容器终止之前执行的(同步的)。其实容器还有个强大功能,就是健康检查功能。原来在做web开发的时候,都是通过shell脚本或者开发个小应用检测应用是否存在,是否挂了。其实对于k8s的这种编排工具自带了对pod的健康检查配置,这个很方便。

(一)健康检查

用过nginx的老铁,应该都知道nginx就有健康检查的机制,当服务不可用负载均衡。负载均衡帮助解决单台服务器的访问压力,同时提高了系统的高可用性,而健康检查常常作为当前实例是否“可用”的判断标准。即:当系统发现某台实例健康检查不通过,负载均衡器将不会把流量导向该实例。

  • ① liveness probe(存活探针)

可以用来检查容器内应用的存活的情况来,如果检查失败会杀掉容器进程,是否重启容器则取决于Pod的[重启策略]。

  • ② readiness probe(可读性探针)

检查容器内的应用是否能够正常对外提供服务,如果探测失败,则Endpoint Controller会将这个Pod的IP从服务中删除。

  • ③ 针对上边的2个的Handler操作

Kubelet通过调用Pod中容器的[Handler]来执行检查的动作,Handler有三种类型。

  1. ExecAction,在容器中执行特定的命令,命令退出返回0表示成功。
  2. TCPSocketAction,使用此配置, kubelet 将尝试在指定端口上打开容器的套接字。如果可以建立连接,容器被认为是健康的,如果不能就认为是失败的。实际上就是检查端口。
  3. HTTPGetAction,根据容器IP、端口及访问路径发起一次HTTP请求,如果返回码在200到400之间表示成功。

每种检查动作都可能有三种返回状态。

  1. Success,表示通过了健康检查。
  2. Failure,表示没有通过健康检查。
  3. Unknown,表示检查动作失败。
  • ④ 测试 livenessProbe的exec的方式
  1. initialDelaySeconds表示在第一次执行探针的时候要等待5秒,这样能够确保我们的容器能够有足够的时间启动起来。这个时间一定要设置的够长,保证容器启动起来,如果就设置1秒,服务还没启动呢,就重启了。
  2. periodSeconds 每隔5秒执行一次存活探针,也就是每5秒执行一次上面的cat /tmp/healthy命令,如果命令执行成功了,将返回0,那么kubelet就会认为当前这个容器是存活的并且很健康,如果返回的是非0值,那么kubelet就会把该容器杀掉然后重启它。
  3. 启动服务后,创建/tmp/healthy,睡眠30秒删除/tmp/healthy,然后在睡眠600秒。
代码语言:javascript
复制
apiVersion: v1
kind: Pod
metadata:
  labels:
    test: liveness
  name: liveness-exec
spec:
  containers:
  - name: liveness
    image: docker.io/nginx
    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
代码语言:javascript
复制
vi liveness.yaml
kubectl apply -f liveness.yaml
kubectl describe pod liveness-exec

服务自动重启下。通过健康检查。

已经重启了5次了

  • ④ 测试 livenessProbe的http的方式

创建一个Apache服务器,通过访问 index 来判断服务是否存活。通过手工删除这个文件的方式,可以导致检查失败,从而重启容器。

代码语言:javascript
复制
apiVersion: v1
kind: Pod
metadata:
  labels:
    test: liveness
    app: httpd
  name: liveness-http
spec:
  containers:
  - name: liveness
    image: docker.io/httpd
    ports:
    - containerPort: 80
    livenessProbe:
      httpGet:
        path: /index.html
        port: 80
        httpHeaders:
        - name: X-Custom-Header
          value: Awesome
      initialDelaySeconds: 5
      periodSeconds: 5
代码语言:javascript
复制
vi http.yaml
kubectl apply -f http.yaml
kubectl describe pod liveness-http

删除index文件,报404http服务

代码语言:javascript
复制
kubectl exec -it liveness-http -- /bin/bash
cd htdocs/
rm index.html
exit
kubectl  get pod
  • ⑤ TCP Socket
代码语言:javascript
复制
apiVersion: v1
kind: Pod
metadata:
  name: goproxy
  labels:
    app: goproxy
spec:
  containers:
  - name: goproxy
    image: docker.io/googlecontainer/goproxy:0.1
    ports:
    - containerPort: 8080
    readinessProbe:
      tcpSocket:
        port: 8080
      initialDelaySeconds: 5
      periodSeconds: 10
    livenessProbe:
      tcpSocket:
        port: 8080
      initialDelaySeconds: 15
      periodSeconds: 20

TCP 检查的配置与 HTTP 检查非常相似。此示例同时使用了 readiness 和 liveness probe。容器启动后5秒钟,kubelet将发送第一个 readiness probe。这将尝试连接到端口8080上的 goproxy 容器。如果探测成功,则该 Pod 将被标记为就绪。Kubelet 将每隔10秒钟执行一次该检查。除了 readiness probe之外,该配置还包括 liveness probe。容器启动15秒后,kubelet 将运行第一个 liveness probe。就像readiness probe一样,这将尝试连接到 goproxy 容器上的8080端口。如果 liveness probe 失败,容器将重新启动。

  • ⑥探针参数总结
  1. initialDelaySeconds:检查开始执行的时间,以容器启动完成为起点计算。
  2. periodSeconds:检查执行的周期,默认为10秒,最小为1秒。
  3. timeoutSeconds:检查超时的时间,默认为1秒,最小为1秒。
  4. successThreshold:从上次检查失败后重新认定检查成功的检查次数阈值(必须是连续成功),默认为1。
  5. failureThreshold:从上次检查成功后认定检查失败的检查次数阈值(必须是连续失败),默认为1。

PS:这里socket端口的方式没有演示,只是提供了源码跟http基本一样的。这就是存活探针和可读性探针的使用方法,pod的这个健康检查对提高应用程序的稳定性健壮性很有必要,一般线上的程序都需要部署这2个参数 liveness probe 和 readiness probe。pod 是一个逻辑单位,可以包含 n 个 container,他们共享 something。docker的container 就是单个container。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-08-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 编程坑太多 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • (一)健康检查
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档