Kubernetes运维之容器编排Deployment详解

Deployment介绍

官方介绍

一个 Deployment 为 Pods 和 ReplicaSets提供声明式的更新能力

负责描述 Deployment 中的 目标状态,而 Deployment 控制器(Controller) 以受控速率更改实际状态, 使其变为期望状态。你可以定义 Deployment 以创建新的 ReplicaSet,或删除现有 Deployment, 并通过新的 Deployment 收养其资源。

而是通过管理ReplicaSet来间接管理pod,即:deployment管理ReplicaSet,ReplicaSet管理pod。所以Deployment比ReplicaSet的功能更强大。

一个Deployment产生三个资源:

  • Deployment资源所有功能
  • ReplicaSet资源的所有功能
  • POD资源

Deployment控制RS,RS控制POD副本数

Kubernetes官方强烈建议避免直接使用ReplicaSet,而应该通过Deployment来创建RS和Pod。

Deployment资源清单详解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
apiVersion: apps/v1          # 版本号
kind: Deployment # 类型
metadata: # 元数据
name: # deploy名称,不能使用大写(遵循域名编写规范)
namespace: # 所属命名空间
labels: # 标签
controller: deploy
spec: # 详情描述
replicas: # 期望的数量(副本数量)
revisionHistoryLimit: # 保留历史版本,默认是10
paused: # 暂停部署,默认是false
progressDeadlineSeconds: # 部署超时时间(s),默认是600
minReadySeconds: 10 # 这个POD 10S以后才会认为是read状态,影响多久杀死旧的POD.
strategy: # 部署策略,指定新策略
type: RollingUpdates # 更新策略,Recreate重新创建、RollingUpdates滚动升级。
rollingUpdate: # 详细滚动更新策略
maxSurge: # 最大可以存在的副本数,可以为百分比,也可以为整数
maxUnavaliable: # 最大不可用状态的pod的最大值,可以为百分比,也可以为整数
selector: # 选择器,通过它指定该控制器管理哪些pod(必须字段)。
matchLabels: # Labels匹配规则,要与模板中Labels相匹配
app: nginx-pod # 和模板template里面POD标签必须一致。
matchExpressions: # 匹配表达式规则,不常用。
- {key: app, operator: In, values: [nginx-pod]}
# In: 表示key指定标签的值是在个集合内的
# NotIn:表示key指定标签的值不是在这个集合内的
# Exists:只要有key标签即可,不用管值是多少
# DoesNotExist:只要Pod上没有指定标签,不用管值是多少
template: # 模板,当副本数量不足时,会根据下面的创建pod
metadata: # POD的metadata。
labels:
app: nginx-pod # 和selector标签必须一致
spec:
containers:
- name: nginx
image: nginx:1.17.1
ports:
- containerPort: 80

创建Deployment

下面是 Deployment 示例。其中创建了一个 ReplicaSet,负责启动三个 nginx Pods:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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
ports:
- containerPort: 80