我不知道要测试什么或如何测试以确保在升级部署(推出新版本)时我的应用程序不会进入不可恢复的状态。我了解到 Kubernetes 部署提供滚动升级,这意味着旧的 pod 不会被杀死,直到新的 pod 就绪。但我仍然假设在过渡期间会丢失 gRPC 请求。无论如何,我可以测试它吗?
最佳答案
要使您的部署镜像升级得到充分证明并且停机时间为 0
,您需要在部署文件中添加两样东西 readiness probe
和 rollingUpdate
策略.
readiness probe
是 Kubernetes 执行的一项检查,以确保您的 pod 已准备好向其发送流量。在它没有准备好之前,Kubernetes 不会使用你的 pod。简单的!在我们的例子中,它看起来像这样:
readinessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 5
periodSeconds: 5
successThreshold: 1
我们基本上是告诉 Kubernetes 每五秒向路径/发送一个 http get 请求,如果成功,则将 pod 标记为准备就绪并开始向其发送流量。
你应该知道的另一件事是RollingUpdate 策略
,它看起来像这样:
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 0
maxSurge: 1
它基本上告诉 Kubernetes 在部署时应该有零个不可用的 pod (maxUnavailable: 0
) 并且一次应该有一个新的 pod (maxSurge: 1
) .
因此您的部署 yaml 应该如下所示:
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: myapp-deployment
spec:
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 0
maxSurge: 1
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: myapp-container
image: prafull/myapp:1
imagePullPolicy: Always
ports:
- containerPort: 80
protocol: TCP
readinessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 5
periodSeconds: 5
successThreshold: 1
如果您现在使用 kubectl apply -f deployment.yaml
升级您的镜像,您的请求将不会停机。
关于testing - 如何测试以确保我的应用程序在部署升级期间是安全的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53677832/