我使用谷歌Kubernetes引擎,我故意在代码中添加错误。我希望滚动更新会在发现状态为CrashLoopBackOff
时停止,但事实并非如此。
在这个page,他们说..
Deployment控制器将自动停止错误的卷展栏,并将停止扩展新的ReplicaSet。这取决于您指定的rollingUpdate参数(特别是maxUnavailable)。
但它没有发生,是否只有状态ImagePullBackOff
?
以下是我的配置。
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: volume-service
labels:
group: volume
tier: service
spec:
replicas: 4
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 2
maxSurge: 2
template:
metadata:
labels:
group: volume
tier: service
spec:
containers:
- name: volume-service
image: gcr.io/example/volume-service:latest
附:我已经阅读了liveness / readyiness探测器,但我认为它不能阻止滚动更新?或者是吗?
事实证明我只需要设置minReadySeconds
并在新的replicaSet具有状态CrashLoopBackOff
或类似Exited with status code 1
时停止滚动更新。所以现在旧的replicaSet仍然可用而且没有更新。
这是新的配置。
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: volume-service
labels:
group: volume
tier: service
spec:
replicas: 4
minReadySeconds: 60
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 2
maxSurge: 2
template:
metadata:
labels:
group: volume
tier: service
spec:
containers:
- name: volume-service
image: gcr.io/example/volume-service:latest
谢谢你的帮助!
你引用的解释是正确的,这意味着新的replicaSet(有错误的那个)将不会继续完成,但它会在进展到maxSurge
+ maxUnavailable
计数时停止。旧的replicaSet也会出现。
这是我试过的例子:
spec:
replicas: 4
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 1
maxSurge: 1
这些是结果:
NAME READY STATUS RESTARTS AGE
pod/volume-service-6bb8dd677f-2xpwn 0/1 ImagePullBackOff 0 42s
pod/volume-service-6bb8dd677f-gcwj6 0/1 ImagePullBackOff 0 42s
pod/volume-service-c98fd8d-kfff2 1/1 Running 0 59s
pod/volume-service-c98fd8d-wcjkz 1/1 Running 0 28m
pod/volume-service-c98fd8d-xvhbm 1/1 Running 0 28m
NAME DESIRED CURRENT READY AGE
replicaset.extensions/volume-service-6bb8dd677f 2 2 0 26m
replicaset.extensions/volume-service-c98fd8d 3 3 3 28m
我的新replicaSet将只启动2个新的pod(maxUnavailable
的1个插槽和maxSurge
的1个插槽)。
旧的replicaSet将继续运行3个pod(4 - 1 unAvailable
)。
你在rollingUpdate
部分设置的两个参数是关键点,但你也可以玩其他因素,如readinessProbe
,livenessProbe
,minReadySeconds
,progressDeadlineSeconds
。
对他们来说,here的参考。