K8s 版本:1.23.6
目录
- 一、动态伸缩
- 二、触发上线
一般地,如果仅修改 Pod 的副本数(如新增/缩减),这就属于动态伸缩
。如果是修改容器镜像的版本,则会触发上线,具体看下面例子。
一、动态伸缩
1、查看当前 Pod 副本(当前为 2)
kubectl get pod
2、扩容 Pod 副本数(扩容为 3)
# 方法1:编辑控制器,修改副本
kubectl edit deployment nginx
# 方法2:修改YAML配置文件
...
spec:
replicas: 3
selector:
matchLabels:
web: web-server
...
3、apply 应用创建资源
kubectl apply -f nginx.yml
4、再次查看副本数
kubectl get pod
可见,副本数已经调整为 3 了,你会发现,它是在原副本数的基础上新增了一个副本,之前的副本仍保持不变且正常对外提供服务,且 Replicaset 名也没发生变化。
如果要实现缩容,把值调小于当前值即可。
二、触发上线
1、查看当前 Pod 副本(当前为 3)
kubectl get pod
2、修改 Pod 中容器的镜像版本号
# 方法1:编辑控制器,修改副本
kubectl edit deployment nginx
# 方法2:修改YAML配置文件
...
spec:
containers:
- name: nginx
image: nginx:1.23.3
ports:
- containerPort: 80
...
3、apply 应用创建资源
kubectl apply -f nginx.yml
4、查看 Pod 是否正常运行
kubectl get pod
5、验证 Pod 中容器镜像版本号
kubectl describe replicaset nginx-7ccc4bb9dd
你会发现,这三个新的 Pod 实现了一个滚动更新的效果,ReplicaSet 名也发生了变化,也就是说创建了新的 ReplicaSet,新版逐渐替换旧版。如下图所示,创建了一个名为 nginx-7ccc4bb9dd
的 ReplicaSet 资源,并替换了旧的 ReplicaSet。
所以这里 ReplicaSet 的作用就很明显了,前面的章节提到 ReplicaSet 创建于 Deployment,且 ReplicaSet 的名称为 Deploymen名称 + hash字串
,这个 Hash 字串保证了不重叠,可见上图两个 ReplicaSet 资源,均来源于同个 Deploymen,但由于 Hash 的作用,在服务版本升级时避免了重叠现象。
小结:
-
动态伸缩时,ReplicaSet 资源不发生变化,触发上线时,ReplicaSet 发生了变化;
-
动态伸缩时,扩容则会在原 Pod 副本数的基础上新增 Pod,此时未发生触发上线;
-
触发上线时,如修改 Pod 容器镜像版本,则所有 Pod 依次实现滚动升级,此时未发生动态伸缩。