【问题标题】:Kubernetes TCP Health CheckKubernetes TCP 健康检查
【发布时间】:2019-12-17 03:52:33
【问题描述】:

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

查询:

  1. 如何确保探测正常工作。有没有办法通过 TCP 健康检查定期验证准备情况和活跃度探测?
  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}}"
    

【问题讨论】:

  • 请详细说明您的问题,提供有关您的配置等的更多详细信息。您是否使用 TCP liveness probe?你看过这个教程cloud.google.com/blog/products/gcp/… 吗?
  • @PjoterS- 正如你所建议的,我已经编辑了我的问题以详细说明它。是的,我正在使用 TCP Liveliness 探针。另外,我已经阅读了这篇文章,但不确定如何显式检查容器健康状态或验证日志以确保 TCP 定期执行就绪和活跃度探测。

标签: tcp kubernetes-health-check


【解决方案1】:

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

作为 Kubernetes 的默认设置,如果您要描述 pod,则可以检查 Probes。例如,对于一切正常工作的 pod,您将找不到任何有关此的信息。它仅显示相关事件,例如 UnhealthyKilling 等。

要检查此容器是否使用任何LivenessProbe 或ReadinessProbe,您需要describe pod 并找到: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

这意味着超过 3m6s 有 10 次检查全部失败,状态为 Unhealthy

另一个默认选项是使用$ kubectl get events 的事件。输出将是 smilar,但它会从集群中收集所有事件。您可以指定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,你会得到大量的日志。我已经创建了另一个具有类似配置但 pod 名称为 tetest 和容器名称为 goproxy 的 pod,更容易找到。

$ 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 上测试。

希望对你有帮助

【讨论】:

    猜你喜欢
    • 2020-04-19
    • 1970-01-01
    • 2019-01-06
    • 2021-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-16
    • 2019-04-09
    相关资源
    最近更新 更多