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
相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
Kubernetes Cloud Native 应用服务中间件
【云原生】使用k8s创建nginx服务—通过yaml文件svc类型暴露
【云原生】使用k8s创建nginx服务—通过yaml文件svc类型暴露
559 0
|
SQL 机器学习/深度学习 分布式计算
Python之pyspark:pyspark的简介、安装、使用方法之详细攻略
Python之pyspark:pyspark的简介、安装、使用方法之详细攻略
Python之pyspark:pyspark的简介、安装、使用方法之详细攻略
|
11月前
|
存储 开发工具 数据安全/隐私保护
「Mac畅玩鸿蒙与硬件9」鸿蒙开发环境配置篇9 - 使用Git进行版本控制
在 HarmonyOS 项目开发中,Git 版本控制可以帮助开发者规范地管理代码变更,确保协作流程顺畅。本篇将详细介绍从创建项目、提交代码到 Git 远程仓库,再到修改、推送更新的完整操作流程,重点演示如何使用 Git 和 GitHub 进行身份验证和版本管理。
482 3
「Mac畅玩鸿蒙与硬件9」鸿蒙开发环境配置篇9 - 使用Git进行版本控制
|
Prometheus 监控 Cloud Native
Prometheus 安全性与数据隐私
【8月更文第29天】Prometheus 是一个开源的监控系统,广泛应用于各种规模的企业中。随着 Prometheus 的普及,确保其安全性变得尤为重要。本文将详细探讨如何确保 Prometheus 服务器的安全性,包括认证、授权、加密通信等方面的措施,并提供相应的配置示例。
590 2
|
8月前
|
消息中间件 Kafka Docker
docker compose 安装 kafka
通过本文的步骤,您可以快速在本地使用 Docker Compose 安装并配置 Kafka 和 Zookeeper。Docker Compose 简化了多容器应用的管理,方便快速搭建和测试分布式系统。
1027 2
|
11月前
|
消息中间件 NoSQL Java
Spring Boot整合Redis
通过Spring Boot整合Redis,可以显著提升应用的性能和响应速度。在本文中,我们详细介绍了如何配置和使用Redis,包括基本的CRUD操作和具有过期时间的值设置方法。希望本文能帮助你在实际项目中高效地整合和使用Redis。
612 2
|
弹性计算 负载均衡 网络架构
搞懂链路负载及入口带宽和出口带宽
搞懂链路负载及入口带宽和出口带宽
498 7
|
测试技术 Android开发 数据安全/隐私保护
脚本 | 手机大麦网脚本使用说明
这篇文章主要针对上篇文章的代码做一个使用说明
3414 0
|
NoSQL Java MongoDB
MongoDB 读写分离——SpringBoot读写分离
MongoDB 读写分离——SpringBoot读写分离
301 0
|
负载均衡 应用服务中间件 nginx
nginx配置kibana访问用户名和密码认证、及无认证访问配置
nginx配置kibana访问用户名和密码认证、及无认证访问配置
644 0