以下关于Deployment的说法正确的有哪些?
A. Deployment下running的Pod数量可能大于replicas数量
B. Deployment更新镜像时一定会创建一个ReplicaSet
C. 用kubectl rollout undo命令回滚Deployment,不会创建新的ReplicaSet
D. 滚动发布的时候MaxUnavailable和MaxSurge可以同时设为0
选择AC
Deployment下running的Pod数量可能大于replicas数量,这句话是正确的。
Deployment下running的Pod数量可能大于replicas数量的情况确实存在,这主要是因为Deployment控制器的工作机制和Pod的自我修复特性。Deployment是Kubernetes中的一个资源对象,用于管理无状态应用的工作负载,它确保指定的副本数(replicas)的Pod能够正确运行。当Pod因为某些原因(如节点故障、Pod意外崩溃等)导致数量不足时,Deployment控制器会基于Pod的副本数(replicas)定义,尝试创建新的Pod来补充缺失的Pod,以确保集群中的Pod数量达到预期的副本数。然而,由于Deployment控制器的这种自我修复和扩展机制,实际运行的Pod数量可能会暂时超过最初定义的replicas数量。例如,如果Deployment定义了3个Pod的副本数,但在运行过程中有一个Pod意外崩溃,Deployment控制器会立即创建一个新的Pod来替代崩溃的Pod,保持集群中Pod的总数不变。但如果此时Deployment控制器认为有必要增加Pod的数量以达到更高的可用性或负载均衡,它可能会创建更多的Pod,这就会导致running的Pod数量暂时大于最初定义的replicas数量。但这种情况是暂时的,一旦系统达到稳定状态,running的Pod数量将回归到最初定义的replicas数量。因此,可以说Deployment下running的Pod数量可能大于replicas数量,但这主要是由于系统的自我修复和动态调整机制,而非永久性的增加。
滚动发布的时候MaxUnavailable和MaxSurge可以同时设为0,这句话是错误的。
Deployment 在 RollingUpdate 中主要提供了两个策略,一个是 MaxUnavailable,另一个是 MaxSurge。这两个字段解析的意思,简单解释一下:
MaxUnavailable:滚动过程中最多有多少个 Pod 不可用;
MaxSurge:滚动过程中最多存在多少个 Pod 超过预期 replicas 数量。
比如当用户的资源足够,且更注重发布过程中的可用性,可设置 MaxUnavailable 较小、MaxSurge 较大。但如果用户的资源比较紧张,可以设置 MaxSurge 较小,甚至设置为 0,这里要注意的是 MaxSurge 和 MaxUnavailable 不能同时为 0。
两者同时为 0 的话,MaxSurge 保证不能新扩 Pod,而 MaxUnavailable 不能保证 ReplicaSet 中有 Pod 是 available 的,这样就会产生问题。所以说这两个值不能同时为 0。用户可以根据自己的实际场景来设置对应的、合适的值。