我关注了http://rahmonov.me/posts/zero-downtime-deployment-with-kubernetes/博客,创建了两个带有 index.html 的 docker 图像,返回“应用程序的版本 1”和“应用程序的版本 2” . 我想要实现的是零停机时间发布。我在用着
kubectl apply -f mydeployment.yaml
与image: mynamespace/nodowntime-test:v1
里面。
将 v1 版本部署到 k8s 然后运行:
while True
do
printf "\n---------------------------------------------\n"
curl "http://myhosthere"
sleep 1s
done
到目前为止一切正常。短时间后 curl 返回“应用程序的版本 1”。然后我将相同的 k8s 部署文件与image: mynamespace/nodowntime-test:v2
. 好吧,它可以工作,但是在 v1 和 v2 之间有一个(总是一个)网关超时响应。所以它并不是真的没有停机时间释放;) 它比没有 RollingUpdate 要好得多,但并不完美。
我正在使用RollingUpdate
策略和readinessProbe:
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: nodowntime-deployment
spec:
replicas: 1
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 0
maxSurge: 1
selector:
matchLabels:
app: nodowntime-test
template:
metadata:
labels:
app: nodowntime-test
spec:
containers:
...
readinessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 5
periodSeconds: 5
successThreshold: 5
我可以做得更好吗?将所有这些与入口控制器同步是否有问题?我知道我可以通过使用minReadySeconds
新旧 pod 重叠一段时间来调整它,但它是唯一的解决方案吗?