写在前面的话
上一节主要简单的提了一下控制器都有哪些常用的,并且简单的功能是啥,最后一并提了 ReplicaSet 控制器。
但是 ReplicaSet 一般不需要我们直接配置,多以从本节开始,开始学习 K8S 默认的控制器 Deployment。
Deployment 资源清单
和 rs 一样,deployment 我们也可以简写成 deploy,先简单的看下其资源清单的结构,如下表:
deployment | ||||
---|---|---|---|---|
apiVersion | apps/v1 | |||
kind | Deployment | |||
metadata | 和其他 metadata 一样,包括 name / labels 等 | |||
spec | ||||
minReadySeconds | 最小准备时间 | |||
paused | 暂停 | |||
replicas | 副本数量 | |||
revisionHistoryLimit | 历史版本保存数量,默认 10 | |||
rollbackTo | ||||
revision | 回滚到指定版本 | |||
selector | ||||
matchExpressions | 标签选择器 | |||
matchLabels | 标签选择器(一般用这个) | |||
strategy | ||||
rollingUpdate | ||||
maxSurge | 能被同一时间升级允许的最大 Pod 数,可以是数字或百分比 | |||
maxUnavailable | 同一时间不允许升级数,可以是数字或者百分比 | |||
type | 选择方式,可以是 RollingUpdate(默认)或者 Recreate | |||
template | ||||
metadata | Pod 的 metadata | |||
spec | Pod 的 spec |
Deployment 示例
apiVersion: apps/v1 kind: Deployment metadata: name: deploy-demo namespace: default spec: replicas: 2 selector: matchLabels: app: erp release: stable template: metadata: name: deploy-container namespace: default labels: app: erp release: stable spec: containers: - name: myapp image: ikubernetes/myapp:v1 imagePullPolicy: IfNotPresent ports: - name: http containerPort: 80 - name: https containerPort: 443
运行:我们这里将不再使用 create 根据配置文件创建,而是使用 apply 创建:
# 创建 kubectl apply -f deploy-demo.yaml # 查看 kubectl get deploy
kubectl get rs kubectl get pods
结果如图:
我们说过 Deployment 属于 ReplicaSet 的更上层,所以我们创建 Deploy 之后是可以查看到 ReplicaSet 的,而且根据命名的特点我们也可以发现:
Deploy --> ReplicaSet --> Pod 命令属于一级一级的增加。其中 rs 名字后面的随机数其实际是模板名称的 hash 值。
此时我们可以做个升级测试,修改 yaml 中的镜像版本由 v1 改为 v2:
kubectl apply -f deploy-demo.yaml
再度应用配置查看:
kubectl get pods -l app=erp -w
通过该方法我们可以看到整个过程,完成后查看 rs:
kubectl get rs -o wide
结果如图:
可以看到原来 v1 版本的 rs 在运行变成了 0,而 v2 版本的变成了 2,但是 v1 版本的 rs 并未删除。
这是由于我们保存历史版本的原因,也就是:
kubectl rollout history deployment deploy-demo
结果如图:
使用打补丁的方式直接修改 Pod 数量:
kubectl patch deployment deploy-demo -p '{"spec":{"replicas":3}}'
结果如图:
同样,我们可以使用另外的方法更新,比如更新镜像版本:
kubectl set image deployment deploy-demo myapp=ikubernetes/myapp:v3
结果如图:
在更新过程中,我们可以使用 pause 暂停实现金丝雀发布:
kubectl rollout pause deployment deploy-demo
那么他会根据更新策略进行一次更新后暂停,等待下次 resume 后完全更新:
kubectl rollout resume deployment deploy-demo
这里就不做过多演示了。
同样,回滚历史版本:
kubectl rollout undo deployment deploy-demo --to-revision=2
结果如图:
小结
其实对于 Deployment,我们需要记忆的并不多,因为之前的 Pod 和 RS 中已经将底层的知识记了一遍,我们在这里只是相当于在他的外面继续套了一层套子。