通过前面的学习,我们知道Pod是对容器的进一步抽象与封装。而且我们可以直接用yaml文件的方式创建Pod对象,不过在实际项目中更多的还是通过控制器来管理Pod对象。
我们先来回顾一下咱们部署mysql时,yaml文件如下:
apiVersion: v1kind: ReplicationController # 副本控制器metadata:name: mysql # RC的名称,全局唯一spec:replicas: 1 # Pod的副本数量selector:app: mysql # 拥有此标签的Pod归属此RCtemplate:metadata:labels:app: mysql # Pod拥有的标签,必须与select一致spec:containers: # Pod容器的定义- name: mysql # 定义镜像image: mysqlports:- containerPort: 3306 # 容器暴露的端口env: # 设置容器的环境变量- name: MYSQL_ROOT_PASSWORDvalue: "123456"
这个文件可分为两部分,template前面是控制器的定义,后半部分是Pod的定义。有了控制器可以方便的控制Pod的副本数量,实现弹性伸缩。下面介绍常用的控制器。
一、ReplicaSet
ReplicaSet是用于取代ReplicationController的控制器,除了支持基于集合的标签选择器以及通过Deployment控制器可实现滚动更新之外,目前他们的区别不大。由于ReplicationController以后会被废弃,故不再讲解这个控制器。
下面是ReplicaSet控制器部署nginx的例子:
#################控制器部分定义####################apiVersion: apps/v1kind: ReplicaSet # ReplicaSet副本控制器metadata:name: nginx # ReplicaSet的名称,全局唯一spec:replicas: 3 # Pod的副本数量selector:matchLabels:app: nginx#################Pod对象部分定义####################template:metadata:labels:app: nginx # Pod拥有的标签,必须与select一致spec:containers: # Pod容器的定义- name: nginx # 定义镜像image: nginxports:- containerPort: 80 # 容器暴露的端口
在控制器部分有一个重要的字段replicas控制Pod的副本数量。控制器将不断循环监测Pod的数量,多则删除,少则通过Pod模板创建。可以手动删除一个Pod,然后Kubenetes会再创建一个新的Pod,保证期望的副本持续运行。
$ kubectl get pods -l app=nginxNAME READY STATUS RESTARTS AGEnginx-kndbg 1/1 Running 0 26mnginx-s2v2q 1/1 Running 0 26mnginx-tfs9d 1/1 Running 0 26m$ kubectl delete pod nginx-tfs9dpod "nginx-tfs9d" deleted$ kubectl get pods -l app=nginxNAME READY STATUS RESTARTS AGEnginx-dn6jw 0/1 ContainerCreating 0 6snginx-kndbg 1/1 Running 0 26mnginx-s2v2q 1/1 Running 0 27m
可用kubectl describe replicasets/nginx打印出ReplicaSet的详细状态,其输出的Events字段可看到Pod的创建与删除操作。
删除ReplicaSet可用delete命令,同时其关联的Pod也会被删除:
kubectl delete replicasets/nginx
二、Deployment
Deployment构建在ReplicaSet之上,但提供了更多特性,使得滚动升级更方便。下面是上个例子的Deployment的实现方式:
#################控制器部分定义####################apiVersion: apps/v1kind: Deployment # Deployment副本控制器metadata:name: nginx # Deployment的名称,全局唯一spec:replicas: 3 # Pod的副本数量selector:matchLabels:app: nginx#################Pod对象部分定义####################template:metadata:labels:app: nginx # Pod拥有的标签,必须与select一致spec:containers: # Pod容器的定义- name: nginx # 定义镜像image: nginxports:- containerPort: 80 # 容器暴露的端口
发布之后可以查看Deployment对象,显示的字段中UP-TO-DATE表示已经达到期望状态的Pod副本数量,AVAILABLE表示当前处于可用状态的Pod数量。
$ kubectl get deployments nginxNAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGEnginx 3 3 3 3 7m8s
Deployment会自动创建一个ReplicaSet对象。
$ kubectl get replicasets -l app=nginxNAME DESIRED CURRENT READY AGEnginx-c5b5c6f7c 3 3 3 11m
他们之间的层级关系如下:

滚动升级是指删除旧版本Pod的同时,补充创建一部分新的Pod对象进行升级,其优势是在升级期间,容器中应用提供的服务不会中断,但要求应用新旧版本能同时工作的场景。ReplicaSet实现滚动更新需手动多步操作,而Deployment只需更改相应的yaml配置,余下步骤可自动完成。
我们将上个例子中nginx镜像改为nginx:1.17.3,重新发布之后,查看ReplicaSet,发现Deployment又创建了一个新的ReplicaSet以实现滚动升级。
$ kubectl get replicasets -l app=nginxNAME DESIRED CURRENT READY AGEnginx-787db44985 3 3 3 9m48snginx-c5b5c6f7c 0 0 0 57m
其滚动升级过程可通过kubectl describe查看:
$ kubectl describe deployment nginx.....Events:Type Reason Age From Message---- ------ ---- ---- -------Normal ScalingReplicaSet 51m deployment-controller Scaled up replica set nginx-c5b5c6f7c to 3Normal ScalingReplicaSet 4m14s deployment-controller Scaled up replica set nginx-787db44985 to 1Normal ScalingReplicaSet 3m50s deployment-controller Scaled down replica set nginx-c5b5c6f7c to 2Normal ScalingReplicaSet 3m50s deployment-controller Scaled up replica set nginx-787db44985 to 2Normal ScalingReplicaSet 3m22s deployment-controller Scaled down replica set nginx-c5b5c6f7c to 1Normal ScalingReplicaSet 3m22s deployment-controller Scaled up replica set nginx-787db44985 to 3Normal ScalingReplicaSet 3m1s deployment-controller Scaled down replica set nginx-c5b5c6f7c to 0
从Events中可以看出,滚动升级就是让旧的ReplicaSet的Pod不断减少,新的ReplicaSet不断增多的过程。
滚动升级可暂停或回滚,从而实现金丝雀发布。




