该篇文章已经被专栏《从零开始学k8s》收录
上一篇文章:k8s核心技能-Controller 点击跳转
什么是Deployment 控制器
- Deployment控制器可以部署无状态应用
- 管理Pod和ReplicaSet
- 部署,滚动升级等功能
- 应用场景:web服务,微服务
Deployment表示用户对K8S集群的一次更新利用。Deployment是一个比RS( Replica Set, RS) 应用模型更广的 API 对象,可以是创建一个新的服务,更新一个新的服务,也可以是滚动升级一个服务。滚动升级一个服务,实际是创建一个新的RS,然后渐渐将新 RS 中副本数增加到抱负状态,将旧RS中的副本数淘汰到0的复合利用。
如许一个复合利用用一个RS是不好形貌的,以是用一个更通用的Deployment来形貌。以K8S的发展方向,未来对全部长期伺服型的业务的管理,都会通过Deployment来管理。
Deployment 概述
Deployment 是 kubernetes 中最常用的资源对象,为 ReplicaSet 和 Pod 的创建提供了一种声明式的界说方法,在 Deployment 对象中形貌一个期望的状态,Deployment 控制器就会按照肯定的控制速率把实际状态改成期望状态,通过界说一个 Deployment 控制器会创建一个新的 ReplicaSet 控制器,通过 ReplicaSet 创建 pod,删除 Deployment 控制器,也会删除 Deployment 控制器下对应的 ReplicaSet 控制器和 pod 资源。
使用 Deployment 而不直接创建 ReplicaSet 是因为 Deployment 对象拥有很多 ReplicaSet 没有的特性,比方滚动升级和回滚。
扩展:声明式界说是指直接修改资源清单 yaml 文件,然后通过 kubectl apply -f 资源清单 yaml 文 件,就可以更改资源。Deployment 控制器是创建在 rs 之上的一个控制器,可以管理多个 rs,每次更新镜像版本,都会生成一个新的 rs,把旧的 rs 替换掉,多个 rs 同时存在,但是只有一个 rs 运行。
rs v1 控制三个 pod,删除一个 pod,在 rs v2 上重新创建一个,依次类推,直到全部都是由 rs v2 控制,如果 rs v2 有题目,还可以回滚,Deployment 是建构在 rs 之上的,多个 rs 组成一个 Deployment,但是只有一个 rs 处于生动状态.
Deployment 工作原理:怎样管理 rs 和 Pod?
Deployment 可以使用声明式界说,直接在命令行通过纯命令的方式完成对应资源版本的内容的修改,也就是通过打补丁的方式进行修改;Deployment 能提供滚动式自界说自控制的更新;对 Deployment 来讲,我们在实现更新时还可以实现控制更新节奏和更新逻辑。
什么叫做更新节奏和更新逻辑呢?
比如说 Deployment 控制 5 个 pod 副本,pod 的期望值是 5 个,但是升级的时候需要额外多几个 pod,那我们控制器可以控制在 5 个 pod 副本之外还能再增加几个 pod 副本。比方说能多一个,但是不能少,那么升级的时候就是先增加一个,再删除一个,增加一个删除一个,始终保持 pod 副本数是 5 个。另有一种环境,最多允很多一个,最少允许少一个,也就是最多 6 个,最少 4 个,第一次加一个,删除两个,第二次加两个,删除两个,依次类推,可以自己控制更新方式,这种滚动更新需要加 readinessProbe 和 livenessProbe 探测,确保 pod 中容器里的应用都正常启动了才删除之前的 pod。
启动第一步,刚更新第一批就暂停了也可以;假如目标是 5 个,允许一个也不能少,允许最多可以 10 个,那一次加 5 个即可;这就是我们可以自己控制节奏来控制更新的方法。
通过 Deployment 对象,你可以轻松的做到以下事情:
1、创建 ReplicaSet 和 Pod
2、滚动升级(不制止旧服务的状态下升级)和回滚应用(将应用回滚到之前的版本)
3、平滑地扩容和缩容
4、暂停和继续 Deployment
简单使用Deployment
但是我们可以尝试使用上面的代码创建一个镜像【只是尝试,不会创建】
- kubectl create deployment web --image=nginx --dry-run -o yaml > nginx.yaml
复制代码 然后输出一个yaml设置文件 nginx.yml ,设置文件如下所示
- 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之间创建关系的桥梁
使用YAML创建Pod
通过刚刚的代码快速创建Pod镜像
- kubectl apply -f nginx.yaml
复制代码 但是因为这个方式创建的,我们只能在集群内部进行访问,以是我们还需要对外暴露端口
- kubectl expose deployment web --port=80 --type=NodePort --target-port=80 --name=web1
复制代码 关于上述命令,有几个参数
- –port:就是我们内部的端标语
- –target-port:就是暴露表面访问的端标语
- –name:名称
- –type:范例
同理,我们一样可以导出对应的设置文件
- kubectl expose deployment web --port=80 --type=NodePort --target-port=80 --name=web1
- -o yaml > web1.yaml
复制代码 得到的web1.yaml如下所示
- apiVersion: v1
- kind: Service
- metadata:
- creationTimestamp: "2022-07-11T07:21:58Z"
- 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: "2022-07-11T07:21:58Z"
- name: web-5dcb957ccc-246f9
- namespace: default
- resourceVersion: "49814"
- selfLink: /api/v1/namespaces/default/services/web-5dcb957ccc-246f9
- uid: 05dbb353-3b46-4907-a6fe-7f345d178d93
- spec:
- clusterIP: 10.105.31.251
- externalTrafficPolicy: Cluster
- ports:
- - nodePort: 30438
- port: 80
- protocol: TCP
- targetPort: 80
- selector:
- app: web
- sessionAffinity: None
- type: NodePort
- status:
- loadBalancer: {}
复制代码 然后我们可以通过下面的命令来查看对外暴露的服务
然后我们访问对应的url,即可看到 nginx了 http://192.168.11.139:32639/
升级回滚和弹性伸缩
- 升级: 假设从版本为1.14 升级到 1.15 ,这就叫应用的升级【升级可以保证服务不中断】
- 回滚:从版本1.15 酿成 1.14,这就叫应用的回滚
- 弹性伸缩:我们根据不同的业务场景,来改变Pod的数量对外提供服务,这就是弹性伸缩
应用升级和回滚
首先我们先创建一个 1.14版本的Pod
- 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: {}
复制代码 我们先指定版本为1.14,然后开始创建我们的Pod
- kubectl apply -f nginx.yaml
复制代码 然后我们查看pods,nginx在node2,过去使用docker images命令,就能看到我们成功拉取到了一个 1.14版本的镜像
- nginx 1.14 295c7be07902 3 years ago 109MB
复制代码 我们使用下面的命令,可以将nginx从 1.14 升级到 1.15
- kubectl set image deployment web nginx=nginx:1.15
复制代码 在我们实行完命令后,能看到升级的过程
- [root@k8smaster node]# kubectl get pods
- NAME READY STATUS RESTARTS AGE
- web-65b7447c7-9rp9v 1/1 Running 0 107s
- web-7d9697b7f8-fdtbv 0/1 ContainerCreating 0 21s
- [root@k8smaster node]# kubectl get pods
- NAME READY STATUS RESTARTS AGE
- nginx-f89759699-5qdtn 1/1 Running 2 14d
- web-7d9697b7f8-fdtbv 1/1 Running 0 37s
复制代码
- 首先是开始的nginx 1.14版本的Pod在运行,然后 1.15版本的在创建
- 然后在1.15版本创建完成后,就会暂停1.14版本
- 末了把1.14版本的Pod移除,完成我们的升级
我们在下载 1.15版本,容器就处于ContainerCreating状态,然后下载完成后,就用 1.15版本去替换1.14版本了,这么做的利益就是:升级可以保证服务不中断
我们到我们的node2节点上,查看我们的 docker images;
可以或许看到,我们已经成功拉取到了 1.15版本的nginx了
查看升级状态
下面可以,查看升级状态
- kubectl rollout status deployment web
复制代码 查看历史版本
我们还可以查看历史版本
- kubectl rollout history deployment web
复制代码 应用回滚
我们可以使用下面命令,完成回滚利用,也就是回滚到上一个版本
- kubectl rollout undo deployment web
复制代码 然后我们就可以查看状态
- kubectl rollout status deployment web
复制代码
同时我们还可以回滚到指定版本
- kubectl rollout undo deployment web
- --to-revision=2
复制代码 弹性伸缩
弹性伸缩,也就是我们通过命令一下创建多个副本
- kubectl scale deployment web --replicas=10
复制代码 可以或许清晰看到,我们一下创建了10个副本
写在末了
创作不易,如果以为内容对你有帮助,麻烦给个三连关注支持一下我!如果有错误,请在批评区指出,我会及时更改!
现在正在更新的系列:从零开始学k8s
感谢各位的观看,文章掺杂个人理解,如有错误请接洽我指出~
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |