容器崩溃时 Kubernetes 服务不可用

Kubernetes Service unavailable when container crashes

在我的 Kubernetes 集群中,我有一个带有两个容器的 pod(即一个副本):servercache

我还有一个 Kubernetes Service 与我的 pod 匹配。

如果 cache 崩溃,当我尝试通过我的 Serviceserver 发送 HTTP 请求时,我收到“503 服务暂时不可用”。

HTTP 请求通过 Nginx Ingress 进入集群,我怀疑问题是当 cache 崩溃时,Kubernetes 从 Service 负载均衡器中删除了我的一个 pod,因为在 Kubernetes documentation:

中承诺

The kubelet uses readiness probes to know when a container is ready to start accepting traffic. A Pod is considered ready when all of its containers are ready. One use of this signal is to control which Pods are used as backends for Services. When a Pod is not ready, it is removed from Service load balancers.

我不喜欢这种行为,因为即使 cache 失败,我仍然希望能够 server 响应请求。有什么方法可以实现这种期望的行为吗?

如果发生以下情况之一,POD 将进入“失败”状态

  • 其中一个容器以非零状态退出
  • Kubernates 由于运行状况检查程序失败而终止容器

因此,如果您需要其中一个容器在另一个容器失败时仍然响应,

  1. 确保你的 liveliness 探测器指向你需要继续的容器。健康检查器将始终获得成功代码,并且不会将 POD 标记为“失败”

  2. 确保就绪探针指向您需要继续的容器。这将确保负载均衡器仍会将流量发送到您的 pod。

  3. 确保您妥善处理容器错误并使它们以零状态代码退出。

在下面的就绪和活跃度探测示例中,确保端口 8080 由 service 容器处理并且它有 /healthz/ready 路由处于活动状态。

    readinessProbe:
      httpGet:
        path: /healthz
        port: 8080
      initialDelaySeconds: 5
      periodSeconds: 5
    livenessProbe:
      httpGet:
        path: /ready
        port: 8080
      initialDelaySeconds: 5
      timeoutSeconds: 1

我正在寻找的行为可通过 publishNotReadyAddresses 选项在 Service 本身上进行配置:

https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.21/#servicespec-v1-core