Citadel 的健康检查

您可以启用 Citadel 的健康检查功能来检测 Citadel CSR(证书签名请求)服务的故障。 Citadel 定期向其 CSR 服务端发送 CSR 请求并验证响应。

Citadel 中的 _prober client_ 探测客户端模块会周期性地检查 Citadel CSR gRPC 服务的健康状态。如果 Citadel 是健康的,探测客户端会更新 _health status file_ 健康状态文件的 _modification time_ 更新时间。否则就什么都不做。Citadel 依赖 Kubernetes 的健康和就绪检测功能,会周期性的使用命令行检查健康状态文件的更新时间。如果这个文件有一段时间不更新了,Citadel 容器就会被 Kubelet 重新启动。

注意:Citadel 的健康检查目前只提供了对 CSR 服务 API 的支持,如果没有使用 SDSIstio Mesh Expansion 就没有必要使用这个功能了。

开始之前

要完成此任务,您可以使用以下方式之一安装 Istio:

  • 不使用 Helm 安装,请遵照 Kubernetes 安装指南的指引部署。 请记得启用全局双向 TLS 支持:

    $ kubectl apply -f install/kubernetes/istio-demo-auth.yaml
    
  • 使用 Helm 进行部署,设置 global.mtls.enabledtrue

部署启用健康检查的 Citadel

为了启用健康检查,使用 istio-citadel-with-health-check.yaml 的配置重新部署 Citadel:

$ kubectl apply -f install/kubernetes/istio-citadel-with-health-check.yaml

确认健康检查器是否工作

Citadel 会记录健康检查的结果,运行下面的命令行:

$ kubectl logs `kubectl get po -n istio-system | grep istio-citadel | awk '{print $1}'` -n istio-system | grep "CSR signing service"

会看到类似下面这样的输出:

... CSR signing service is healthy (logged every 100 times).

上面的日志表明周期性的健康检查已经启动。可以看到,缺省的健康检查的时间周期是 15 秒,而且每 100 次检查记录一次日志。

(可选) 配置健康检查

本节讨论如何修改健康检查的配置。打开文件 install/kubernetes/istio-citadel-with-health-check.yaml,找到下面的内容(注释已汉化,非原文):

...
  - --liveness-probe-path=/tmp/ca.liveness # 健康检查状态文件的路径
  - --liveness-probe-interval=60s # 健康状态文件的更新周期
  - --probe-check-interval=15s    # 健康检查的周期
livenessProbe:
  exec:
    command:
    - /usr/local/bin/istio_ca
    - probe
    - --probe-path=/tmp/ca.liveness # 健康状态文件的路径
    - --interval=125s               # 文件修改时间和当前系统时钟的最大时间差
  initialDelaySeconds: 60
  periodSeconds: 60
...

liveness-probe-pathprobe-path 是到健康状态文件的路径。 你应该同时更新 Citadel 以及 livenessProbe 上配置的路径。 如果 Citadel 是健康的,liveness-probe-interval 的值决定了更新健康状态文件的时间间隔。 Citadel 健康检查控制器使用 probe-check-interval 的值作为 Citadel 健康检查的间隔时间。 interval 是从上次更新健康状态文件到检测器认为 Citadel 健康的最长时间。 initialDelaySecondsperiodSeconds 是初始化延迟以及 livenessProbe 检测运行周期。

延长 probe-check-interval 会减少健康检查的开销,但是一旦遇到故障情况,健康监测器也会更晚地得到故障信息。为了避免检测器因为临时故障重启 Citadel,检测器的 interval 应该设置为 liveness-probe-intervalN 倍,这样就让检测器能够容忍持续 N-1 次的检查失败。

清理

  • 在 Citadel 上禁用健康检查:

    $ kubectl apply -f install/kubernetes/istio-demo-auth.yaml
    
  • 移除 Citadel:

    $ kubectl delete -f install/kubernetes/istio-citadel-with-health-check.yaml