3.5 [kustz] 为 Container 添加健康检查方法

简介: 添加 健康检查探针。 完成上线准备。

3.5. [kustz] 为 Container 添加健康检查方法

大家好, 我是老麦。
kustz 终于到了准生产的地步了。 今天的健康检查接口, 就为我们解决这个问题。

image.png

我们要知道, 确定一个应用能不能对外提供服务之前, 需要进行一个 可用性 检测。 而这个检测通常被我们称为 健康检查

image.png

代码还是放在 Github
https://github.com/tangx/kustz/tree/chapter/10-container-probes

Kubernetes 的健康检查

在 Kubernetes 中, 为我们提供了 主要3类状态 的健康检查。

  1. startup: 等待探针。 如果执行成功, 则再执行 liveness, readienss。 如果执行失败, 则遵循 restartPolicy 规则。
  2. liveness: 存活探针, 如果失败, 服务将被重新发布(redeploy)。
  3. readiness: 就绪探针, 如果失败, 服务不会加入到 service backend endpoints 中对外提供服务。
https://kubebyexample.com/learning-paths/application-development-kubernetes/lesson-4-customize-deployments-application-2

image.png

此外, Kubernetes 支持 4种类型 的检查方式

  1. httpGet: 检查 GET 接口返回值。
  2. tcp: tcp 端口是否打开。
  3. exec: 命令执行是否成功。
  4. grpc: grpc 端口是否打开。

kustz.yml 配置

一如既往, 我们需要抽象一个简单明了的方法定义健康检查方法。 剩下的就交给 kustz 处理。

# kustz.yml

service:
  probes:
    liveness:
      action: http://:8080/healthy
      headers:
        token: "token123"
      initialDelaySeconds: 30 
    readiness:
      action: tcp://0.0.0.0:8080
    startup:
      action: cat /tmp/healthy

从配置中可以看到, 通过 action 我们提供了其中三种检查方法 httpGet, tcp, exec

grpc 现在还属于 1.24 还 beta 状态。 对于 grpc 我也不熟, 所以就不讨论了。

编码

这节不难

数据结构定义

对应的在 /pkg/kustz/kustz.go 中添加如下结构。

type Service struct {
    Probes    ContainerProbes   `json:"probes,omitempty"`
}


type ContainerProbe struct {
    ProbeHandler                  `json:",inline"`
    InitialDelaySeconds           int32  `json:"initialDelaySeconds,omitempty"`
    TimeoutSeconds                int32  `json:"timeoutSeconds,omitempty"`
    PeriodSeconds                 int32  `json:"periodSeconds,omitempty"`
    SuccessThreshold              int32  `json:"successThreshold,omitempty"`
    FailureThreshold              int32  `json:"failureThreshold,omitempty"`
    TerminationGracePeriodSeconds *int64 `json:"terminationGracePeriodSeconds,omitempty"`
}

其中 ContainerProbe 基本上就是从 corev1.Probe 中直接复制过来的, 但又对 ProbeHandler 进行了一些本地化处理。

type ProbeHandler struct {
    Action  string            `json:"action,omitempty"`
    Headers map[string]string `json:"headers,omitempty"`
}

处理 Action 生成 Handler

对于 Action 的值, 我们需要进行类型处理, 并返回相应的 corev1.ProbeHandler

/pkg/tokube/container_probe.go 中, 定义函数 ProbeHandler 处理 actionheaders 的值并返回结果。

// ProbeHandler action
//
// http(s)://:8080/healthy
// tcp://:8080
// cat /tmp/healthy
func ProbeHandler(action string, headers map[string]string) corev1.ProbeHandler {
    if strings.HasPrefix(action, "tcp://") {
        return toTCPProbeHandler(action)
    }

    if strings.HasPrefix(action, "http://") || strings.HasSuffix(action, "https://") {
        return toHTTPProbeHandler(action, headers)
    }

    return toExecProbeHandler(action)
}

可以看到, 通过判断 action 的前缀字符串的值, 确认了健康检查的方法。 而只有 httpGet 方法接受了 headers 参数。

toTCPProbeHandler()toHTTPProbeHandler() 中, 使用 url.Parse() 方法, 很简单的提取了所有字段数据。

toExecProbeHandler 中, 直接使用 strings.Split() 方法分割。

为 Container 添加健康检查

/pkg/kustz/k_container.go 中, 为 ContainerProbe 为添加方法 kubeProbe 创建健康检查, 这时添加所有附加参数。

// kubeProbe return Kube Probe without handler
func (cp *ContainerProbe) kubeProbe() *corev1.Probe {
    handler := tokube.ProbeHandler(cp.Action, cp.Headers)
    return &corev1.Probe{
        ProbeHandler:                  handler,
        InitialDelaySeconds:           cp.InitialDelaySeconds,
        TimeoutSeconds:                cp.TimeoutSeconds,
        PeriodSeconds:                 cp.PeriodSeconds,
        SuccessThreshold:              cp.SuccessThreshold,
        FailureThreshold:              cp.FailureThreshold,
        TerminationGracePeriodSeconds: cp.TerminationGracePeriodSeconds,
    }
}

ContainerProbes 添加 kubeProbe 方法, 解决 ContainerProbe 的为 nil 的问题。

func (cps ContainerProbes) kubeProbe(cp *ContainerProbe) *corev1.Probe {
    if cp == nil {
        return nil
    }
    return cp.kubeProbe()
}

测试

执行命令, 检查结果

$ make test.deployment
相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
Kubernetes Unix Shell
Kubernetes:为容器设置启动时要执行的命令及其入参
Kubernetes:为容器设置启动时要执行的命令及其入参
2324 1
|
7月前
|
应用服务中间件 nginx 容器
error: a container name must be specified for pod pod-base, choose one of: [nginx busybox]
error: a container name must be specified for pod pod-base, choose one of: [nginx busybox]
89 0
|
7月前
|
Dragonfly Kubernetes Devops
Containerd 如何配置 Proxy?
Containerd 如何配置 Proxy?
|
7月前
|
Kubernetes Docker 容器
Kubernetes学习笔记-Part.10 容器回退
Part.01 Kubernets与docker Part.02 Docker版本 Part.03 Kubernetes原理 Part.04 资源规划 Part.05 基础环境准备 Part.06 Docker安装 Part.07 Harbor搭建 Part.08 K8s环境安装 Part.09 K8s集群构建 Part.10 容器回退
109 0
|
网络安全 Docker 容器
docker启动容器时报错:iptables: No chain/target/match by that name
【已解决】docker启动容器时报错:iptables: No chain/target/match by that name
5882 2
|
网络协议 应用服务中间件 Docker
docker启动容器报错iptables failed:....docker0: iptables: No chain/target/match by that name.
docker启动容器报错iptables failed:....docker0: iptables: No chain/target/match by that name.
160 0
|
Kubernetes Ubuntu Devops
Kubectl debug 调试容器
Kubectl debug 调试容器
2115 0
Kubectl debug 调试容器
|
JSON 运维 Kubernetes
2 [kustz] 先从模仿创建 Deployment、service、ingress开始
2 [kustz] 先从模仿创建 Deployment、service、ingress开始
|
缓存 Kubernetes 数据库
【kubernetes】Service: 将外部服务定位为 Service
【kubernetes】Service: 将外部服务定位为 Service
128 0
|
运维 安全 API
3.1. [kustz] 为 Container 添加环境变量
3.1. [kustz] 为 Container 添加环境变量 > 大家好, 我是老麦。 一个运维小学生。 > 今天为容器添加环境变量。
163 0
3.1. [kustz] 为 Container 添加环境变量