每天5分钟玩转Kubernetes | Health Check在Scale Up中的应用

Posted COCOgsta

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了每天5分钟玩转Kubernetes | Health Check在Scale Up中的应用相关的知识,希望对你有一定的参考价值。

书籍来源:cloudman《每天5分钟玩转Kubernetes》

一边学习一边整理老师的课程内容及试验笔记,并与大家分享,侵权即删,谢谢支持!


对于多副本应用,当执行Scale Up操作时,新副本会作为backend被添加到Service的负载均衡中,与已有副本一起处理客户的请求。考虑到应用启动通常都需要一个准备阶段,比如加载缓存数据、连接数据库等,从容器启动到真正能够提供服务是需要一段时间的。我们可以通过Readiness探测判断容器是否就绪,避免将请求发送到还没有准备好的backend。

示例应用的配置文件如下所示。

[root@k8s-master ~]# cat healthycheck2.yml 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: web
spec:
  replicas: 3
  selector:
    matchLabels:
      run: web
  template:
    metadata:
      labels:
        run: web
    spec:
      containers:
      - name: web
        image: httpd
        ports:
        - containerPort: 8080
        readinessProbe:
          httpGet:
            scheme: HTTP
            path: /healthy
            port: 8080
          initialDelaySeconds: 10
          periodSeconds: 5
---
apiVersion: v1
kind: Service
metadata:
  name: web-svc
spec:
  selector:
    run: web
  ports:
  - protocol: TCP
    port: 8080
    targetPort: 80
[root@k8s-master ~]# 

重点关注readinessProbe部分。这里我们使用了不同于exec的另一种探测方法httpGet。Kubernetes对于该方法探测成功的判断条件是http请求的返回代码在200~400之间。

  • schema指定协议,支持HTTP(默认值)和HTTPS。
  • path指定访问路径。
  • port指定端口。

上面配置的作用是:

(1)容器启动10秒之后开始探测。

(2)如果http://[container_ip]:8080/healthy返回代码不是200~400,表示容器没有就绪,不接收Service web-svc的请求。

(3)每隔5秒探测一次。

(4)直到返回代码为200~400,表明容器已经就绪,然后将其加入到web-svc的负载均衡中,开始处理客户请求。

(5)探测会继续以5秒的间隔执行,如果连续发生3次失败,容器又会从负载均衡中移除,直到下次探测成功重新加入。

对于http://[container_ip]:8080/healthy,应用则可以实现自己的判断逻辑,比如检查所依赖的数据库是否就绪,示例代码如下所示。

http.HandleFunc("/healthy", func(w http.ResponseWriter, r *http.Request) 
    healthy = True;
    
    // Check Database
    db = connect(dbIP, dbPort, dbUser, dbPassword)
    
    if db != NULL 
        try 
            db.Query("SELECT test;")
         catch (e) 
            err = e.message
        
    
    
    if db == NULL || err != NULL 
        healthy = False
        errMsg += "Database is not ready."
    
    
    if healthy 
        w.Write([]byte("OK"))
     else 
        // Send 503
        http.Error(w, errMsg, http.StatusServiceUnavailable)
    
)

http.ListenAndServe("8080")

① 定义/healthy的处理函数。

② 连接数据库并执行测试SQL。

③ 测试成功,正常返回,代码200。

④ 测试失败,返回错误代码503。

⑤ 在8080端口监听。

对于生产环境中重要的应用,都建议配置Health Check,保证处理客户请求的容器都是准备就绪的Service backend。

以上是关于每天5分钟玩转Kubernetes | Health Check在Scale Up中的应用的主要内容,如果未能解决你的问题,请参考以下文章

每天5分钟玩转Kubernetes | Kubernetes Dashboard安装

每天5分钟玩转Kubernetes | Deployment

每天5分钟玩转Kubernetes | Heapster

每天5分钟玩转Kubernetes | Deployment

每天5分钟玩转Kubernetes | 先把Kubernetes跑起来

每天5分钟玩转Kubernetes | Network Policy