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

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

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

附上汇总贴:每天5分钟玩转Kubernetes | 汇总_COCOgsta的博客-CSDN博客


对于多副本应用,当执行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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值