基本介绍
为了更好的解决服务编排的问题,kubernetes在V1.2版本开始,引入了Deployment控制器。
Deployment对象,顾名思义,是用于部署应用的对象。它使Kubernetes中最常用的一个对象,它为ReplicaSet和Pod的创建提供了一种声明式的定义方法,从而无需手动创建ReplicaSet和Pod对象(使用Deployment而不直接创建ReplicaSet是因为Deployment对象拥有许多ReplicaSet没有的特性,例如滚动升级和回滚)。
deployment也是保证pod高可用的一种方式,明明已经有RC(Replication Controller),为什么还要引入deployment呢?
是因为deployment解决了RC(Replication Controller)的一个痛点。是因为RC在进行版本升级的时候,会造成一个问题,就是它的svc(Service)短时间内访问不了了,deployment就是解决这个问题的。
值得一提的是,Deployment控制器并不直接管理pod,而是通过管理ReplicaSet来间接管理Pod,即:Deployment管理ReplicaSet,ReplicaSet管理Pod。所以Deployment比ReplicaSet功能更加强大。
Deployment可以帮我们做什么:
- 定义一组Pod期望数量,Controller会维持Pod数量与期望数量一致
- 配置Pod的发布方式,controller会按照给定的策略更新Pod,保证更新过程中不可用Pod维持在限定数量范围内
- 如果发布有问题支持回滚
典型的应用场景包括:
- 定义 Deployment 来创建 Pod 和 ReplicaSet
- 滚动升级和回滚应用
- 扩容和缩容
- 暂停和继续 Deployment
Deployment的资源清单文件
apiVersion: apps/v1 # 版本号
kind: Deployment # 类型
metadata: # 元数据
name: # rs名称
namespace: # 所属命名空间
labels: #标签
controller: deploy
spec: # 详情描述
replicas: 3 # 副本数量
revisionHistoryLimit: 3 # 保留历史版本,主要作用是实现版本回退
paused: false # 暂停部署,默认是false。当deploy创建成功是否立即创建pod,false表示立即创建。true表示不立即创建
progressDeadlineSeconds: 600 # 部署超时时间(s),默认是600
strategy: # 镜像更新策略
type: RollingUpdate # 滚动更新策略
rollingUpdate: # 滚动更新
maxSurge: 30% # 最大额外可以存在的副本数,可以为百分比,也可以为整数
maxUnavailable: 30% # 最大不可用状态的 Pod 的最大值,可以为百分比,也可以为整数
selector: # 选择器,通过它指定该控制器管理哪些pod
matchLabels: # Labels匹配规则
app: nginx-pod
# matchExpressions: # Expressions匹配规则
# - {key: app, operator: In, values: [nginx-pod]}
template: # 模板,当副本数量不足时,会根据下面的模板创建pod副本。该行及以下是Deployment控制器控制的pod的信息
metadata:
labels:
app: nginx-pod
spec:
containers:
- name: nginx
image: nginx:1.17.1
ports:
- containerPort: 80
使用yaml资源清单文件创建 Deployment 流程:
1. 用户通过 kubectl 创建 Deployment。
2. Deployment 创建 ReplicaSet。
3. ReplicaSet 创建 Pod。
对象的命名方式是:子对象的名字 = 父对象名字 + 随机字符串或数字
创建deployment
# 编写资源清单文件
[root@k8s-master ~]# vim pc-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: pc-deployment
namespace: test
spec:
replicas: 3
selector:
matchLabels:
app: nginx-pod
template:
metadata:
labels:
app: nginx-pod
spec:
containers:
- name: nginx
image: nginx:1.17.1
ports:
- containerPort: 80
# 创建deploy
[root@k8s-master ~]# kubectl create -f pc-deployment.yaml
deployment.apps/pc-deployment created
# 查看deploy
[root@k8s-master ~]# kubectl get deploy pc-deployment -n test -o wide
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
pc-deployment 3/3 3 3 92s nginx nginx:1.17.1 app=nginx-pod
# UP-TO-DATE 最新版本的pod数量 ; AVAILABLE 当前可用的pod数量
# 查看deploy创建的rs, rs的名称是在deployment的名字后加上一个10位数的随机串
[root@k8s-master ~]# kubectl get rs -n test -o wide
NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR
pc-deployment-6696798b78 3 3 3 3m57s nginx nginx:1.17.1 app=nginx-pod,pod-template-hash=6696798b78
# 查看rs创建的pod, pod的名称是在rs的名字后面再加上一个5位数的随机串
[root@k8s-master ~]# kubectl get pod -n test -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pc-deployment-6696798b78-4z8pt 1/1 Running 0 3m6s 10.244.2.53 k8s-node02 <none> <none>
pc-deployment-6696798b78-8679f 1/1 Running 0 3m6s 10.244.1.72 k8s-node01 <none> <none>
pc-deployment-6696798b78-f6qrp 1/1 Running 0 3m6s 10.244.1.71 k8s-node01 <none> <none>
扩缩容
两种方式:
- 直接编辑资源清单文件
kubectl edit deploy 控制器名 -n namespace
# 然后修改文件中的 spec:replicas:副本数量 即可
# 如果是以配置清单文件创建的控制器,也可以直接` vim 配置清单文件 ` 修改replicas指定的副本数量,
# 然后使用` kubectl apply -f 配置清单文件 `进行扩缩用
- 命令实现
kubectl scale deploy 控制器名 --replicas=副本数量 -n namespace
【例 】
# 使用上面创建好的deploy
[root@k8s-master ~]# kubectl get deploy -n test -o wide
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
pc-deployment 3/3 3 3 9m29s nginx nginx:1.17.1 app=nginx-pod
# 使用第二种方式调整副本数量为5个
[root@k8s-master ~]# kubectl scale deploy pc-deployment --replicas=5 -n test
deployment.apps/pc-deployment scaled
# 查看deploy
[root@k8s-master ~]# kubectl get deploy -n test -o wide
NAME READY UP-TO-DATE AVAILABLE