容器崩溃时 Kubernetes 服务不可用
Kubernetes Service unavailable when container crashes
在我的 Kubernetes 集群中,我有一个带有两个容器的 pod(即一个副本):server
和 cache
。
我还有一个 Kubernetes Service
与我的 pod 匹配。
如果 cache
崩溃,当我尝试通过我的 Service
向 server
发送 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 由于运行状况检查程序失败而终止容器
因此,如果您需要其中一个容器在另一个容器失败时仍然响应,
确保你的 liveliness 探测器指向你需要继续的容器。健康检查器将始终获得成功代码,并且不会将 POD 标记为“失败”
确保就绪探针指向您需要继续的容器。这将确保负载均衡器仍会将流量发送到您的 pod。
确保您妥善处理容器错误并使它们以零状态代码退出。
在下面的就绪和活跃度探测示例中,确保端口 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
在我的 Kubernetes 集群中,我有一个带有两个容器的 pod(即一个副本):server
和 cache
。
我还有一个 Kubernetes Service
与我的 pod 匹配。
如果 cache
崩溃,当我尝试通过我的 Service
向 server
发送 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 由于运行状况检查程序失败而终止容器
因此,如果您需要其中一个容器在另一个容器失败时仍然响应,
确保你的 liveliness 探测器指向你需要继续的容器。健康检查器将始终获得成功代码,并且不会将 POD 标记为“失败”
确保就绪探针指向您需要继续的容器。这将确保负载均衡器仍会将流量发送到您的 pod。
确保您妥善处理容器错误并使它们以零状态代码退出。
在下面的就绪和活跃度探测示例中,确保端口 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