Kubernetes水平拓展&滚动升级
### 核心对象:Replicaset对象
``` yaml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: nginx-set
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
```
一个replicaset对象,是由副本数目的定义和一个Pod模板组成的。
而且,它是被Deployment控制器操控的,如下关系
![image](http://upload-images.jianshu.io/upload_images/13499188-0d2a2c97d84bf298.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
### 水平拓展/收缩
1. Replicaset对象通过“控制器模式”确保系统中的Pod个数永远是用户期望的pod个数(配置文件中)
2. 当用户通过 kubectl scale去修改replicas字段的值时,对应deployment的replicaset对象会根据修改的值,新建或删除一个Pod
``` shell
$ kubectl scale deployment nginx-deployment --replicas=4
deployment.apps/nginx-deployment scaled
```
### 滚动升级
1. 通过yaml文件,$ kubectl create -f nginx-deployment.yaml --record出来一个带三个pod的集群
``` YAML
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80
```
2. 检查已经正常部署,kubectl get deployments
``` Shell
$ kubectl get deployments
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
nginx-deployment 3 0 0 0 1s
```
3. 修改etcd中对应deployment对象的api文件如下
``` shell
$ kubectl edit deployment/nginx-deployment
...
spec:
containers:
- name: nginx
image: nginx:1.9.1 # 1.7.9 -> 1.9.1
ports:
- containerPort: 80
...
deployment.extensions/nginx-deployment edited
```
4. 通过describe命令,查看events
``` shell
$ kubectl describe deployment nginx-deployment
...
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
...
Normal ScalingReplicaSet 24s deployment-controller Scaled up replica set nginx-deployment-1764197365 to 1
Normal ScalingReplicaSet 22s deployment-controller Scaled down replica set nginx-deployment-3167673210 to 2
Normal ScalingReplicaSet 22s deployment-controller Scaled up replica set nginx-deployment-1764197365 to 2
Normal ScalingReplicaSet 19s deployment-controller Scaled down replica set nginx-deployment-3167673210 to 1
Normal ScalingReplicaSet 19s deployment-controller Scaled up replica set nginx-deployment-1764197365 to 3
Normal ScalingReplicaSet 14s deployment-controller Scaled down replica set nginx-deployment-3167673210 to 0
```
可以看到是在修改过镜像版本之后,deployment controller会新建一个replicaset对象(hashid不一样),这个对象的初始pod 副本数是0,然后先对旧的replicaset对象进行水平收缩,再对新的对象进行水平拓展,直到完成更新,这个更新过程叫做**滚动更新**。
##### 滚动升级优势
+ 确保在升级过程中,如果出现失败,还有旧的没有水平收缩的副本可用,提高服务可用性,运维人员可以介入进行处理
此外,deployment控制器还存在RollingUpdateStrategy字段可以配置在yaml文件中,该字段的作用是,配置滚动升级的策略,如maxSurge,maxUnavailable等,可以用数字或者百分比来配置(好灵活,好强大,我喜欢。。。)
综上,Deployment控制器,实际上控制的是replicaset的数目,已经每一个replicaset对象的属性。每一个应用版本,对应的正是一个replicaset ,这个版本的pod数目,由replicaset自身的控制器控制。
- 点赞
- 收藏
- 关注作者
评论(0)