暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

控制器- deployment01

原创 喵呜 4天前
16

### 6.3 Deployment - 适用无状态服务

![deployment.png](https://note.youdao.com/yws/res/61821/WEBRESOURCE429478c7709347daedd28caf636242b0)

```
K8s在1.2版本开始引入了deployment控制器,这种控制器不直接控制pod,而是通过管理replicaset(rs)来管理pod,
即,deployment管理replicaset,replicaset管理pod,所以deployment比replicaset功能更强大。

replica /ˈreplɪkə/ n.副本
```
> deployment的主要功能

```
> 支持replicaset的所有功能
> 支持发布的停止、继续
> 支持滚动更新和版本回滚
```
> deployment的资源清单文件

```
提示:
可先使用 kubectl create deployment <deployment_name> --image=<镜像> -n <namespace> 创建一个deployment,
接着使用 kubectl get deployment <deployment_name> -n <namespace> -o yaml 查看该deployment的yaml文件,
然后,复制该文件去修改成自己的yaml即可。

```
```
apiVersion: apps/v1 # 指定api版本
kind: Deployment # 指定资源类型
metadata: # 对象的元数据
name: nginx-deployment # deployment的名称
namespace: dev # 所属命名空间
labels: # 标签
app: nginx
spec: # deployment的详情描述
replicas: 3 # 指定要运行的pod副本数量
revisionHistoryLimit: 3 # 保留的历史修订版本数,此处为3,意味着k8s将保留最近3个修订版本。 /rɪˈvɪʒ(ə)n/ n.修改,修订
# paused: false # 指定是否暂停deployment的滚动更新,默认是false。 /pɔːzd/ v.暂停,停顿 pause的过去式
# progressDeadlineSeconds: 600 # 部署超时时间,默认是600秒。若在这段时间内无任何进度,则认为i更新失败。
strategy: # 定义更新策略 /strætədʒi/ n.策略
type: RollingUpdate # 表示使用滚动更新策略
rollingUpdate: # 滚动更新
maxSurge: 30% # 表示在更新过程中最大允许额外启动30%的pod数量(基于replicas的值),可以为百分比,也可以为整数。surge /sɜːrdʒ/ n.激增
maxUnavailable: 30% # 表示在更新过程中最多允许30%的pod不可用,可以为百分比,也可以为整数。/ˌʌnəˈveɪləb(ə)l/ adj.不可用的
selector: # 选择器,用于匹配该控制器管理哪些pod
matchLabels: # 标签选择器,通过标签匹配pod
app: nginx-pod
template: # pod模板,通过该模板创建pod
metadata: # pod的元数据
labels: # pod的标签
app: nginx-pod
spec: # pod的具体描述
containers: # pod中的容器列表
- name: nginx # pod中容器的名称
image: nginx:1.17.1 # 容器使用的镜像
ports: # 容器使用的端口列表
- name
containerPort: 80
protocol: TCP
```
#### 6.3.1 创建deploy
> 创建pod-deploy.yaml文件,内容如下:

```
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deploy
namespace: dev
labels:
app: nginx
spec:
replicas: 3
revisionHistoryLimit: 5
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 30%
maxUnavailable: 30%
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.26.0
imagePullPolicy: IfNotPresent
ports:
- name: nignx-port
containerPort: 80
protocol: TCP

1.创建deployment
[root@master ~]# kubectl create -f pod-deploy.yaml

2.查看deployment
root@master ~]# kubectl get deploy -n dev
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deploy 3/3 3 3 7m46s
[root@master ~]#

# NAME: deployment的名称
# READY: 已就绪的pod副本数/期望的pod副本数
# UP-TO-DATE:最新版本的pod的数量
# AVAILABLE: 当前可用的pod的数量
# AGE:表示deployment已被创建的时间

3.查看rs,发现rs的名称是在deployment的名字后面追加了一个10位数的随机串。
root@master ~]# kubectl get rs -n dev
NAME DESIRED CURRENT READY AGE
nginx-deploy-dc588ff9 3 3 3 16m
[root@master ~]#

4.查看pod,发现pod的名称是在rs的名字后面追加了一个5位数的随机串。
[root@master ~]# kubectl get pod -n dev
NAME READY STATUS RESTARTS AGE
nginx-deploy-dc588ff9-sk675 1/1 Running 0 17m
nginx-deploy-dc588ff9-wpsjc 1/1 Running 0 17m
nginx-deploy-dc588ff9-xkzhv 1/1 Running 0 17m
[root@master ~]#
```
#### 6.3.2 镜像更新 - 滚动更新
```
仅当deployment.spec.template中的属性(包括标签,甚至一个字段的改变)发生改变时,才会触发更新操作,其他操作,如对deployment执行扩缩容操作则不会触发滚动更新。
此处说的滚动更新指的是pod的滚动更新,也就是说如果要更新pod,只需要更新deployment.spec.template模板就行了。


# 补充说明:
deploy支持两种更新策略:(若不指定则默认为RollingUpdate)
> Recreate 重建更新(在创建出新pod之前会先杀掉所有已存在的pod)
> RollingUpdate 滚动更新(杀死一部分pod就启动一部分pod,在更新过程中存在两个版本的pod)
# 配置格式如下所示:
spec:
replicas: 3
selector:
matchLabels:
app: nginx
strategy:
type: Recreate # 指定策略类型
template:
metadata:
```
##### 6.3.2.1 通过 kubectl edit deployment 命令更新
```
该方法是直接修改的deployment的yaml文件,属于永久生效。
```
```
1.命令:
kubectl edit deployment <deployment_name> -n 命名空间

2.范例:
[root@master ~]# kubectl edit deployment nginx-deploy -n dev

3.查看deplyment的更新状态
[root@master ~]# kubectl rollout status deployment nginx-deploy -n dev

4.查看详细更新信息
[root@master ~]# kubectl describe deployment nginx-deploy -n dev
... ...
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal ScalingReplicaSet 93s deployment-controller Scaled up replica set nginx-deploy-58ffb6dc87 to 3
Normal ScalingReplicaSet 24s deployment-controller Scaled up replica set nginx-deploy-74bfd959fc to 1
Normal ScalingReplicaSet 22s deployment-controller Scaled down replica set nginx-deploy-58ffb6dc87 to 2
Normal ScalingReplicaSet 22s deployment-controller Scaled up replica set nginx-deploy-74bfd959fc to 2
Normal ScalingReplicaSet 20s deployment-controller Scaled down replica set nginx-deploy-58ffb6dc87 to 1
Normal ScalingReplicaSet 20s deployment-controller Scaled up replica set nginx-deploy-74bfd959fc to 3
Normal ScalingReplicaSet 18s deployment-controller Scaled down replica set nginx-deploy-58ffb6dc87 to 0
[root@master ~]#

说明:
# scaled up 扩大 scale /skeɪl/ n.规模
# scaled down 缩小
由上可以看出来,当第一次创建deployment时,它创建了一个rs(nginx-deploy-58ffb6dc87)并将其直接扩容至3个副本;
更新deployment时,它创建了一个新的rs(nginx-deploy-74bfd959fc),并将其副本扩容到1个,等待其就绪;
然后,k8s缩容旧rs(nginx-deploy-58ffb6dc87)的副本到2个,将新rs(nginx-deploy-74bfd959fc)的副本扩容到2个;
接着,k8s用相同的滚动更新策略对新rs(nginx-deploy-74bfd959fc)进行扩容并对旧rs(nginx-deploy-58ffb6dc87)缩容;
最后,将拥有3个可用的副本在新rs中,旧rs的副本将缩容到0个。
# 滚动更新完成后,旧的rs不会被删除。
```
##### 6.3.2.2 通过 kubectl set image 命令更新
```
该方法也是修改的deployment的yaml文件,属于永久生效。
```
```
1.命令:
kubectl set image deployment <deployment_name> <要更新的容器>:<容器的tag> -n 命名空间

2.将nginx容器的镜像更新为1.20.0版本
[root@master ~]# kubectl set image deployment nginx-deploy nginx=nginx:1.20.0 -n dev

3.查看deplyment的更新状态
[root@master ~]# kubectl rollout status deployment nginx-deploy -n dev
```

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论