Istio Service 健康检查

此任务展示了如何使用 Kubernetes liveness 和 readiness 探针 在 Istio Service 上进行健康检查。

在 Kubernetes 中存在三种 liveness 和 readiness 探针:

  1. 命令
  2. http 请求
  3. tcp 请求

此任务分别提供在启用和禁用 Istio 双向 TLS 认证时,前两个选项的示例。

开始之前

使用命令选项的 liveness 和 readiness 探针

在本节中,我们将展示如何在禁用双向 TLS 时配置健康检查,然后再展示在启用双向 TLS 时它的工作情况。

禁用双向 TLS

运行此命令以在默认 namespace 中部署 liveness

Zip
$ kubectl apply -f <(istioctl kube-inject -f @samples/health-check/liveness-command.yaml@)

等待一分钟,然后检查 pod 状态

$ kubectl get pod
NAME                             READY     STATUS    RESTARTS   AGE
liveness-6857c8775f-zdv9r        2/2       Running   0           1m

‘RESTARTS’ 列中的数字 ‘0’ 表示 liveness 探针工作正常。Readiness 探针的工作方式相同,您可以相应地修改 liveness-command.yaml 以自行尝试。

启用双向 TLS

要在默认命名空间中为服务启用双向 TLS,您必须配置身份验证策略和目标规则。 请按照以下步骤完成配置:

  1. 要配置身份验证策略,请运行:

    $ kubectl apply -f - <<EOF
    apiVersion: "authentication.istio.io/v1alpha1"
    kind: "Policy"
    metadata:
      name: "default"
      namespace: "default"
    spec:
      peers:
      - mtls: {}
    EOF
    
  2. 要配置目标规则,请运行:

    $ kubectl apply -f - <<EOF
    apiVersion: "networking.istio.io/v1alpha3"
    kind: "DestinationRule"
    metadata:
      name: "default"
      namespace: "default"
    spec:
      host: "*.default.svc.cluster.local"
      trafficPolicy:
        tls:
          mode: ISTIO_MUTUAL
    EOF
    

运行此命令重新部署该 service:

ZipZip
$ kubectl delete -f <(istioctl kube-inject -f @samples/health-check/liveness-command.yaml@)
$ kubectl apply -f <(istioctl kube-inject -f @samples/health-check/liveness-command.yaml@)

并重复上一小节中的相同步骤以验证 liveness 探针是否工作正常。

$ kubectl get pod
NAME                             READY     STATUS    RESTARTS   AGE
liveness-6857c8775f-zdv9r        2/2       Running   0           4m

清理

删除上述步骤中添加的相互TLS策略和相应的目标规则:

  1. 要删除双向 TLS 策略,请运行:

    $ kubectl delete policies default
    
  2. 要删除相应的目标规则,请运行:

    $ kubectl delete destinationrules default
    

使用 http 请求选项的 liveness 和 readiness 探针

本节介绍了如何使用 HTTP 请求选项配置健康检查。

禁用双向 TLS 策略

运行此命令以在默认 namespace 中部署 liveness-http

Zip
$ kubectl apply -f <(istioctl kube-inject -f @samples/health-check/liveness-http.yaml@)

等待一分钟,然后检查 pod 状态,查看 ‘RESTARTS’ 列为 ‘0’ 以确保 liveness 工作正常。

$ kubectl get pod
NAME                             READY     STATUS    RESTARTS   AGE
liveness-http-975595bb6-5b2z7c   2/2       Running   0           1m

启用双向 TLS 策略

同样,通过添加命名空间范围的身份验证策略和目标规则,为默认命名空间中的服务启用双向 TLS:

  1. 要配置身份验证策略,请运行:

    $ kubectl apply -f - <<EOF
    apiVersion: "authentication.istio.io/v1alpha1"
    kind: "Policy"
    metadata:
      name: "default"
      namespace: "default"
    spec:
      peers:
      - mtls: {}
    EOF
    
  2. 要配置目标规则,请运行:

    $ kubectl apply -f - <<EOF
    apiVersion: "networking.istio.io/v1alpha3"
    kind: "DestinationRule"
    metadata:
      name: "default"
      namespace: "default"
    spec:
      host: "*.default.svc.cluster.local"
      trafficPolicy:
        tls:
          mode: ISTIO_MUTUAL
    EOF
    

运行这些命令重新部署该 service:

ZipZip
$ kubectl delete -f <(istioctl kube-inject -f @samples/health-check/liveness-http.yaml@)
$ kubectl apply -f <(istioctl kube-inject -f @samples/health-check/liveness-http.yaml@)

等待一分钟,然后检查 pod 状态,查看 ‘RESTARTS’ 列为 ‘0’ 以确保 liveness 工作正常。

$ kubectl get pod
NAME                             READY     STATUS    RESTARTS   AGE
liveness-http-67d5db65f5-765bb   2/2       Running   0          1m

请注意, liveness-http 中的镜像公开了两个端口:8001 和 8002 (源代码)。在这个 deployment 中,端口 8001 提供常规通信,而端口 8002 用于 liveness 探针。由于 Istio 代理仅会拦截在 containerPort 字段中显式声明的端口,因此,无论 Istio 的双向 TLS 是否启用,到 8002 端口的流量都将绕过 Istio 代理。但是,如果我们将端口 8001 同时用于常规流量和 liveness 探针,在启用双向 TLS 时,由于 http 请求是从 Kubelet 发送的,所以不会将客户端证书发送到 liveness-http service,因此健康检查将会失效。