Citadel 的健康检查

本文中的任务展示了如何在 Kubernetes 中为 Citadel 启动健康检查,注意,这一功能仍处于 Alpha 阶段。

从 Istio 0.6 开始,Citadel 具备了一个可选的健康检查功能。缺省情况下的 Istio 部署过程没有启用这一特性。目前健康检查功能通过周期性的向 API 发送 CSR 的方式,来检测 Citadel CSR 签署服务的故障。很快会实现更多的健康检查方法。

Citadel 包含了一个检测器模块,它会周期性的检查 Citadel 的状态(目前只是 gRPC 服务器的健康情况)。如果 Citadel 是健康的,检测器客户端会更新健康状态文件(文件内容始终为空)的更新时间。否则就什么都不做。Citadel 依赖 Kubernetes 的健康和就绪检测功能,会周期性的使用命令行检查健康状态文件的更新时间。如果这个文件有一段时间不更新了,Citadel 容器就会被 Kubelet 的重新启动。

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

开始之前

  • 根据快速开始的指引部署 Istio 并启用全局双向 TLS 支持。
  1. $ kubectl apply -f install/kubernetes/istio-demo-auth.yaml

或者

Helm 进行部署,设置 global.mtls.enabledtrue

部署启用健康检查的 Citadel

下面的命令用来部署启用健康检查的 Citadel:

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

部署 istio-citadel 服务,这样健康检查器才能找到 CSR 服务.

  1. $ kubectl create -f - <<EOF
  2. apiVersion: v1
  3. kind: Service
  4. metadata:
  5. name: istio-citadel
  6. namespace: istio-system
  7. labels:
  8. istio: citadel
  9. spec:
  10. ports:
  11. - port: 8060
  12. selector:
  13. istio: citadel
  14. EOF

确认健康检查器的是否工作

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

  1. $ kubectl logs `kubectl get po -n istio-system | grep istio-citadel | awk '{print $1}'` -n istio-system

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

  1. ...
  2. 2018-02-27T04:29:56.128081Z info CSR successfully signed.
  3. ...
  4. 2018-02-27T04:30:11.081791Z info CSR successfully signed.
  5. ...
  6. 2018-02-27T04:30:25.485315Z info CSR successfully signed.
  7. ...

上面的日志表明周期性的健康检查已经启动。可以看到,缺省的健康检查的时间周期是 15 秒。

(可选) 健康检查的配置

还可以根据需要调整健康检查的配置。打开文件 install/kubernetes/istio-citadel-with-health-check.yaml,找到下面的内容(注释已汉化,非原文):

  1. ...
  2. - --liveness-probe-path=/tmp/ca.liveness # 健康检查状态文件的路径
  3. - --liveness-probe-interval=60s # 健康状态文件的更新周期
  4. - --probe-check-interval=15s # 健康检查的周期
  5. - --logtostderr
  6. - --stderrthreshold
  7. - INFO
  8. livenessProbe:
  9. exec:
  10. command:
  11. - /usr/local/bin/istio_ca
  12. - probe
  13. - --probe-path=/tmp/ca.liveness # 健康状态文件的路径
  14. - --interval=125s # 文件修改时间和当前系统时钟的最大时间差
  15. initialDelaySeconds: 60
  16. periodSeconds: 60
  17. ...
  • liveness-probe-pathprobe-path:到健康状态文件的路径,在 Citadel 以及检测器上进行配置;
  • liveness-probe-interval:是更新健康状态文件的周期;
  • probe-check-interval:是 Citadel 健康检查的周期;
  • interval:从上次更新健康状态文件至今的时间,也就是检测器认为 Citadel 健康的时间段;
  • initialDelaySeconds 以及 periodSeconds:初始化延迟以及检测运行周期;
    延长 probe-check-interval 会减少健康检查的开销,但是一旦遇到故障情况,健康监测器也会更晚的得到故障信息。为了避免检测器因为临时故障重启 Citadel,检测器的 interval 应该设置为 liveness-probe-intervalN 倍,这样就让检测器能够容忍持续 N-1 次的检查失败。

清理

  • 在 Citadel 上禁用健康检查:
  1. $ kubectl apply -f install/kubernetes/istio-demo-auth.yaml
  2. $ kubectl delete svc istio-citadel -n istio-system
  • 移除 Citadel:
  1. $ kubectl delete -f install/kubernetes/istio-citadel-with-health-check.yaml
  2. $ kubectl delete svc istio-citadel -n istio-system