Kubernetes TCP运行状况检查

时间:2019-12-17 03:52:33

标签: tcp kubernetes-health-check

我正在构建.NET核心控制台微服务,并且架构师建议使用TCP健康检查而不是HTTP健康检查。因此,为了实施TCP运行状况检查,请找到我在OCP文件(deploymentconfig部分)中添加的以下配置。 Jenkins构建成功,并且部署配置成功部署。

查询:

  1. 如何确保探针正常工作。是否有方法通过TCP Health Check定期验证准备情况和活跃性探针?
  2. 是否有任何语法可以使用TCP运行状况检查显式检查容器运行状况。

        readinessProbe:
          tcpSocket:
              port: 8080
          initialDelaySeconds: "${{READINESS_DELAY}}"
          periodSeconds: "${{READINESS_TIMEOUT}}"
          timeoutSeconds: "${{READINESS_TIMEOUT}}"
        livenessProbe:
          tcpSocket:
              port: 8080
          initialDelaySeconds: "${{LIVENESS_DELAY}}"
          periodSeconds: "${{LIVENESS_TIMEOUT}}"
          timeoutSeconds: "${{LIVENESS_TIMEOUT}}"
    

1 个答案:

答案 0 :(得分:0)

探针的输出保存到每个节点上的kubelet组件中。

在Kubernetes中作为默认设置,您可以检查Probes是否描述pod。例如,对于Pod,一切正常运行,您将找不到与此有关的任何信息。它仅显示相关事件,例如UnhealthyKilling等。

要检查此容器是否使用任何LivenessProbe或ReadinessProbe,您需要describe吊舱并找到:Containers.<containerName>.LivenessContainers.<containerName>.Readiness

以下基于docs的示例,但进行了其他更改以确保其失败。

添加:

livenessProbe:
      exec:
        command:
        - cat
        - /tmp/healthy

输出:

$ kubectl describe pod goproxy-fail
...
Events:
  Type     Reason     Age                  From                 Message
  ----     ------     ----                 ----                 -------
  Normal   Scheduled  3m38s                default-scheduler    Successfully assigned default/goproxy-fail to kubeadm-16
  Normal   Pulled     26s (x4 over 3m37s)  kubelet, kubeadm-16  Container image "k8s.gcr.io/goproxy:0.1" already present on machine
  Normal   Created    26s (x4 over 3m37s)  kubelet, kubeadm-16  Created container goproxy
  Normal   Killing    26s (x3 over 2m26s)  kubelet, kubeadm-16  Container goproxy failed liveness probe, will be restarted
  Normal   Started    25s (x4 over 3m36s)  kubelet, kubeadm-16  Started container goproxy
  Warning  Unhealthy  6s (x10 over 3m6s)   kubelet, kubeadm-16  Liveness probe failed: OCI runtime exec failed: exec failed: container_linux.go:346: starting container process caused "exec: \"cat\": executable file not found in $PATH": unknown

这意味着超过3分6秒有10项检查全部失败,状态为Unhealthy

另一个默认选项是使用$ kubectl get events使用事件。输出将是微笑的,但它将收集群集中的所有事件。您可以指定namespace等。

如何检查成功的探针

在默认设置下,任何地方都不会记录成功探测的输出。您需要将Kubelet日志记录级别--verbosity至少更改为调试模式(4)。

要做到这一点,您必须:

  • ssh为主节点
  • 编辑文件/var/lib/kubelet/kubeadm-flags.env(在ubuntu上,您需要使用sudo权限来进行$ sudo su)。 默认输出看起来像KUBELET_KUBEADM_ARGS="--cgroup-driver=cgroupfs --network-plugin=cni --pod-infra-container-image=k8s.gcr.io/pause:3.1 --resolv-conf=/run/systemd/resolve/resolv.conf",您必须在末尾添加--v=4
    根据您的未来需求,您可以采用更高的日志级别。可以在here中找到更多信息。
    kubeadm-flags.env中的所需值如下所示:
    KUBELET_KUBEADM_ARGS="--cgroup-driver=cgroupfs --network-plugin=cni --pod-infra-container-image=k8s.gcr.io/pause:3.1 --resolv-conf=/run/systemd/resolve/resolv.conf --v=4"
  • 之后,您需要重新启动kubelet才能应用此新的日志记录级别。您可以使用sudo systemctl restart kubelet

下一步是使用journactl检查kubelet日志。

$ journalctl -u kubelet也可以grep它,因为将--v设置为4时,您将获得大量日志。我创建了另一个具有相似配置但名称为tetest的容器容器名称goproxy,更易于查找。

$ journalctl -u kubelet | grep tetest
...
Dec 31 10:29:46 kubeadm-16 kubelet[17767]: I1231 10:29:46.303112   17767 prober.go:129] Readiness probe for "tetest_default(a518f558-9b08-4ce8-86a2-81875f205826):goproxy" succeeded
Dec 31 10:29:55 kubeadm-16 kubelet[17767]: I1231 10:29:55.289330   17767 prober.go:129] Liveness probe for "tetest_default(a518f558-9b08-4ce8-86a2-81875f205826):goproxy" succeeded
Dec 31 10:29:56 kubeadm-16 kubelet[17767]: I1231 10:29:56.303326   17767 prober.go:129] Readiness probe for "tetest_default(a518f558-9b08-4ce8-86a2-81875f205826):goproxy" succeeded
Dec 31 10:30:06 kubeadm-16 kubelet[17767]: I1231 10:30:06.302931   17767 prober.go:129] Readiness probe for "tetest_default(a518f558-9b08-4ce8-86a2-81875f205826):goproxy" succeeded
Dec 31 10:30:15 kubeadm-16 kubelet[17767]: I1231 10:30:15.289462   17767 prober.go:129] Liveness probe for "tetest_default(a518f558-9b08-4ce8-86a2-81875f205826):goproxy" succeeded
Dec 31 10:30:16 kubeadm-16 kubelet[17767]: I1231 10:30:16.303267   17767 prober.go:129] Readiness probe for "tetest_default(a518f558-9b08-4ce8-86a2-81875f205826):goproxy" succeeded
Dec 31 10:30:26 kubeadm-16 kubelet[17767]: I1231 10:30:26.303248   17767 prober.go:129] Readiness probe for "tetest_default(a518f558-9b08-4ce8-86a2-81875f205826):goproxy" succeeded
Dec 31 10:30:35 kubeadm-16 kubelet[17767]: I1231 10:30:35.289164   17767 prober.go:129] Liveness probe for "tetest_default(a518f558-9b08-4ce8-86a2-81875f205826):goproxy" succeeded
Dec 31 10:30:36 kubeadm-16 kubelet[17767]: I1231 10:30:36.303071   17767 prober.go:129] Readiness probe for "tetest_default(a518f558-9b08-4ce8-86a2-81875f205826):goproxy" succeeded
Dec 31 10:30:46 kubeadm-16 kubelet[17767]: I1231 10:30:46.303751   17767 prober.go:129] Readiness probe for "tetest_default(a518f558-9b08-4ce8-86a2-81875f205826):goproxy" succeeded
Dec 31 10:30:49 kubeadm-16 kubelet[17767]: I1231 10:30:49.237565   17767 kubelet.go:1965] SyncLoop (SYNC): 1 pods; tetest_default(a518f558-9b08-4ce8-86a2-81875f205826)
...

在Kubernetes 1.16.3,操作系统Ubuntu 18.04上进行了测试。

希望这会有所帮助