官方文档:https://kubernetes.io/zh-cn/docs/concepts/workloads/controllers/deployment/
Deployment 控制器应用
- Deployment 控制器可以部署无状态应用。
- 管理 Pod 和 ReplicaSet(副本控制、更新回滚)。
- 具有上线部署、副本设定、滚动升级、回滚等功能。
- 提供声明式更新,例如只更新一个新的 Image
- 应用场景:web服务,微服务。
Deployment 表示用户对 K8S 集群的一次更新操作。Deployment 是一个比 RS(Replica Set)应用模型更广的 API 对象,可以是
- 创建一个新的服务。
- 更新一个新的服务。
- 也可以是滚动升级一个服务。滚动升级一个服务,实际是创建一个新的 RS,然后逐渐将新 RS 中副本数增加到理想状态,将旧 RS 中的副本数减少到0的复合操作。
这样一个复合操作用一个 RS 是不好描述的,所以用一个更通用的 Deployment 来描述。
以 K8S 的发展方向,未来对所有长期伺服型的业务的管理,都会通过 Deployment 来管理。
部署
1、Deployment 文件
1
| kubectrl create deployment web --image=nginx
|
上述代码不能很好的进行复用,因为每次我们都需要重新输入代码,所以一般生产环境都是使用 YAML 进行配置。
我们可以尝试使用上面的代码创建一个镜像【只是尝试,不会创建】。
1
| kubectl create deployment web --image=nginx --dry-run -o yaml > nginx.yaml
|
然后输出一个 yaml 配置文件 nginx.yml
,配置文件如下所示
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| apiVersion: apps/v1 kind: Deployment metadata: creationTimestamp: null labels: app: web name: web spec: replicas: 1 selector: matchLabels: app: web strategy: {} template: metadata: creationTimestamp: null labels: app: web spec: containers: - image: nginx name: nginx resources: {} status: {}
|
- selector 和 label 就是 Pod 和 Controller 之间建立关系的桥梁。
2、YAML 创建 Pod
1
| kubectl apply -f nginx.yaml
|
但是这个方式创建的 Pod 我们只能在集群内部进行访问,所以我们需要对外暴露端口
1
| kubectl expose deployment web --port=80 --type=NodePort --target-port=80 --name=web1
|
参数解释
--port
:我们内部的端口号
--target-port
:暴露外面访问的端口号
--name
:名称
--type
:类型
同理,我们一样可以导出对应的配置文件
1
| kubectl expose deployment web --port=80 --type=NodePort --target-port=80 --name=web1 -o yaml > web1.yaml
|
得到的 web1.yaml
如下所示
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 38 39 40 41 42 43 44 45 46 47 48 49 50
| apiVersion: v1 kind: Service metadata: creationTimestamp: "2020-11-16T02:26:53Z" labels: app: web managedFields: - apiVersion: v1 fieldsType: FieldsV1 fieldsV1: f:metadata: f:labels: .: {} f:app: {} f:spec: f:externalTrafficPolicy: {} f:ports: .: {} k:{"port":80,"protocol":"TCP"}: .: {} f:port: {} f:protocol: {} f:targetPort: {} f:selector: .: {} f:app: {} f:sessionAffinity: {} f:type: {} manager: kubectl operation: Update time: "2020-11-16T02:26:53Z" name: web2 namespace: default resourceVersion: "113693" selfLink: /api/v1/namespaces/default/services/web2 uid: d570437d-a6b4-4456-8dfb-950f09534516 spec: clusterIP: 10.104.174.145 externalTrafficPolicy: Cluster ports: - nodePort: 32639 port: 80 protocol: TCP targetPort: 80 selector: app: web sessionAffinity: None type: NodePort status: loadBalancer: {}
|
3、查看对外暴露的服务
然后我们访问对应的 url,即可看到 nginx 了 http://192.168.177.130:32639/
Deployment 升级回滚和弹性伸缩
- 升级:比如从版本 1.14 升级到 1.15,这就叫应用的升级【升级可以保证服务不中断】。
- 回滚:比如从版本 1.15 变成 1.14, 这就叫应用的回滚。
- 弹性伸缩:根据不同的业务场景,来改变 Pod 的数量对外提供服务,这就是弹性伸缩。
Deployment 应用升级
1、创建一个 1.14 版本的 Nginx 的 yaml 文件。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| apiVersion: apps/v1 kind: Deployment metadata: creationTimestamp: null labels: app: web name: web spec: replicas: 1 selector: matchLabels: app: web strategy: {} template: metadata: creationTimestamp: null labels: app: web spec: containers: - image: nginx:1.14 name: nginx resources: {} status: {}
|
2、创建的Pod
1
| kubectl apply -f nginx.yaml
|
3、升级
使用 docker images
命令,可以看到我们成功拉取到了一个 1.14 版本的镜像
使用下面的命令,可以将 nginx 从 1.14 升级到 1.15
1
| kubectl set image deployment web nginx=nginx:1.15
|
在我们执行完命令后,可以看到升级的过程
- 首先 nginx 1.14 版本的 Pod 在运行。
- 然后创建 1.15 版本的 Pod,1.15 版本创建完成后,暂停 1.14 版本的 Pod。
- 最后把 1.14 版本的 Pod 移除,完成升级。
4、查看升级状态
1
| kubectl rollout status deployment web
|
5、查看历史版本
1
| kubectl rollout history deployment web
|
Deployment 应用回滚
使用下面命令,完成回滚操作,也就是回滚到上一个版本
1
| kubectl rollout undo deployment web
|
查看状态
1
| kubectl rollout status deployment web
|
同时我们还可以回滚到指定版本
1
| kubectl rollout undo deployment web --to-revision=2
|
Deployment 弹性伸缩
弹性伸缩,也就是我们通过命令一下创建多个副本
1
| kubectl scale deployment web --replicas=10
|
能够清晰看到,我们一下创建了10个副本