k8s滚动更新过程中新pod还没有完全启动旧pod就被删除停止了,就会导致在新pod还没完全启动的时间里造成服务不可用,很影响使用
时间: 2024-03-20 10:42:34 浏览: 21
您说的情况是可能会发生的,如果在滚动更新期间旧 Pod 被删除了,而新 Pod 还没有完全启动,那么就会导致服务不可用。为了避免这种情况发生,可以通过增加 `spec.minReadySeconds` 参数的值来等待新 Pod 完全就绪后再停止旧 Pod。
另一种方式是使用 readiness 探针,通过在 Pod 中设置 readiness 探针,可以确保在新 Pod 完全就绪之前,该 Pod 不会接收流量,从而避免服务不可用的情况。 readiness 探针是一种用于检查容器是否已准备好接收流量的机制,可以通过发送 HTTP 请求、TCP 套接字等方式来检查容器的健康状态。只有当 readiness 探针返回成功时,Kubernetes 才会将流量发送到该容器。
下面是一个使用 readiness 探针的例子:
```
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
spec:
replicas: 3
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 1
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: myapp
image: myapp:latest
ports:
- containerPort: 80
readinessProbe:
httpGet:
path: /healthz
port: 80
initialDelaySeconds: 30
periodSeconds: 10
timeoutSeconds: 5
```
在这个例子中,我们为容器设置了一个 readiness 探针,该探针每隔 10 秒钟检查一次 `/healthz` 路径是否可用,如果探针返回成功,Kubernetes 就会将流量发送到该容器。在滚动更新期间,只有当新 Pod 的 readiness 探针返回成功后,Kubernetes 才会将流量发送到该 Pod,从而避免了服务不可用的情况。