本文是自己在理解 Deployment 过程中的笔记,重在理解,对于细节可能并不十分详尽,但会涉及一些实践。
Deployment
补充:Kubernetes 中的“对象”和“控制器模式”
1、容器编排
在 Kubernetes 中,Pod 对象作为容器的进一步组合和封装,用来更好地描述应用,而对于这些对象的”编排“(调度、安排、管理)逻辑则是由控制器(Controller)来完成,也就是说容器编排的核心就是利用”控制器模式“来最终操作 Pod 对象,要么就是创建、更新一些 Pod(或者其他的 API 对象、资源),要么就是删除一些已经存在的 Pod(或者其他的 API 对象、资源)。
2、控制器模式
核心就是”控制循环“。用代码表示:
// 针对一种待编排的对象 X,它有一个对应的控制器:
for {
// 实际状态,往往来自于 Kubernetes 集群本身
实际状态 := 获取集群中对象X的实际状态(Actual State)
// 期望状态,一般来自于用户提交的 YAML 文件
期望状态 := 获取集群中对象X的期望状态(Desired State)
if 实际状态 == 期望状态{
什么都不做
} else {
执行编排动作,将实际状态调整为期望状态
}
}
3、“一切皆对象”
Kubernetes 的控制器其实也是一种对象,设计原理就是“用一种对象管理另一种对象”。所以,既然也是 API 对象,就会有各个字段,使用也就可以 YAML 配置操作,属性实际上都是由上半部分的控制器定义(包括期望状态),加下半部分的被控制对象的模板组成的。
例如 Deployment :
Deployment 理解
1、Deployment 能干什么?
一个承接应用部署的云平台必须具备的能力,首先想到的应该就是”作业副本水平扩展/收缩“和”版本升级控制“了,这点在 Kubernetes 中便是通过 Deployment 这个控制器对象实现。
2、Deployment 如何实现功能?
Deployment 实际上是一个两层控制器,实际操作的是 ReplicaSet 对象,然后由 ReplicaSet 来操作 Pod 对象实现编排。
如图,首先它通过 ReplicaSet 的个数来描述应用的版本,每改动一次 Pod 模板就创建一个新的 ReplicaSet;然后,它再通过 ReplicaSet 的属性(比如 replicas 的值),来保证 Pod 的副本数量。
注:一个 ReplicaSet 对象,其实就是由副本数目的定义和一个 Pod 模板组成的。(它的定义其实是 Deployment 的一个子集),如下:
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
Deployment 使用实例
以一个 nginx 服务器来实现水平扩展和升级操作,YAML 文件(nginx-deployment.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
1、部署及查看命令
# 部署
$ kubectl create -f nginx-deployment.yaml
# 查看 Deployment 状态信息,看到刚开始还没有完全部署
$ kubectl get deployments
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
nginx-deployment 3 0 0 0 1s
# 实时查看 Deployment 对象的状态变化
$ kubectl rollout status deployment/nginx-deployment
Waiting for rollout to finish: 2 out of 3 new replicas have been updated...
deployment.apps/nginx-deployment successfully rolled out
# 查看 Deployment 状态信息,完全部署完成
$ kubectl get deployments
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
nginx-deployment 3 3 3 3 20s
# 查看 Deployment 的 Events,了解流程
$ kubectl describe deployment nginx-deployment
2、将副本数从3个扩展到4个
# 扩展
$ kubectl scale deployment nginx-deployment --replicas=4
deployment.apps/nginx-deployment scaled
3、将 nginx 版本从1.7.9升级到1.9.1
第一种:修改了 Deployment 的 Pod 模板,“滚动更新”就会被自动触发
$ 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
第二种:直接修改 nginx-deployment 所使用的的镜像
$ kubectl set image deployment/nginx-deployment nginx=nginx:1.9.1
deployment.extensions/nginx-deployment image updated
其他:控制滚动升级的策略
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
...
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 1
在上面这个 RollingUpdateStrategy 的配置中,maxSurge 指定的是除了 DESIRED 数量之外,在一次“滚动”中,Deployment 控制器还可以创建多少个新 Pod;而 maxUnavailable 指的是,在一次“滚动”中,Deployment 控制器可以删除多少个旧 Pod。
4、将 nginx 版本进行回滚
# 回滚上一个版本
$ kubectl rollout undo deployment/nginx-deployment
deployment.extensions/nginx-deployment
# 回滚到指定版本
# (1)先查看
$ kubectl rollout history deployment/nginx-deployment # --revision=2 可以查看对应版本具体的API细节
deployments "nginx-deployment"
REVISION CHANGE-CAUSE
1 kubectl create -f nginx-deployment.yaml --record
2 kubectl edit deployment/nginx-deployment
3 kubectl set image deployment/nginx-deployment nginx=nginx:1.9.1
# (2)再选版本回滚
$ kubectl rollout undo deployment/nginx-deployment --to-revision=2
deployment.extensions/nginx-deployment
5、多次执行更新操作,但只升级一次
# 让这个 Deployment 进入了一个“暂停”状态
$ kubectl rollout pause deployment/nginx-deployment
deployment.extensions/nginx-deployment paused
# ---
# 随意使用 kubectl edit 或者 kubectl set image 指令,修改这个 Deployment 的内容了
# ---
# 把这个 Deployment“恢复”回来,触发“滚动更新”
$ kubectl rollout resume deploy/nginx-deployment
deployment.extensions/nginx-deployment resumed
参考:
《深入剖析Kubernetes | 极客时间》张磊,容器编排和Kubernetes作业管理 16 17