Kubernetes基础_04_Deployment全解析(无状态的Pod)

Posted 毛奇志

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Kubernetes基础_04_Deployment全解析(无状态的Pod)相关的知识,希望对你有一定的参考价值。

系列文章目录

文章目录


前言

一、创建Deployment

1.1 创建Deployment

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.16.0
        ports:
        - containerPort: 80

1.2 Deployment yaml文件

在该 yaml 文件中:

创建名为 nginx-deployment(由 .metadata.name 字段标明)的 Deployment。spec 中有三个字段,分别是 replicas 副本数、selector 选择器、template模板,如下:

(1) 该 Deployment 创建三个(由 .spec.replicas 字段标明)Pod 副本。

(2) .spec.selector 字段定义了 Deployment 如何查找要管理的 Pod。在这里,你选择在 Pod 模板中定义的标签(app: nginx)。 不过,更复杂的选择规则是也可能的,只要 Pod 模板本身满足所给规则即可。

(3) template 字段包含以下子字段:
Pod 被使用 .metadata.labels 字段打上 app: nginx 标签。
Pod 模板规约(即 .template.spec 字段)指示 Pod 运行一个 nginx 容器, 该容器运行版本为 1.14.2 的 nginx Docker Hub 镜像。
创建一个容器并使用 .spec.template.spec.containers[0].name 字段将其命名为 nginx。

1.3 查看当前deploy(get命令和rollout命令)

查看当前deploy,包括两条命令,如下:

kubectl get deployments
kubectl rollout status deploy nginx-deployment

运行 kubectl get deployments 检查 Deployment 是否已创建。 如果仍在创建 Deployment,则输出类似于:

[root@w1 deploy]# kubectl get deployments
NAME               READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   3/3     3            3           9m45s

在检查集群中的 Deployment 时,所显示的字段有:

(1) NAME 列出了名字空间中 Deployment 的名称。
(2) READY 显示应用程序的可用的“副本”数。显示的模式是“就绪个数/期望个数”。
(3) UP-TO-DATE 显示为了达到期望状态已经更新的副本数。
(4) AVAILABLE 显示应用可供用户使用的副本数。
(5) AGE 显示应用程序运行的时间。

请注意期望副本数是根据 .spec.replicas 字段设置 3。

解释一下,这个 rollout 也是查看命令,只是这个 rollout 命令用的比 get 命令少,rollout 的英文就是 展示 的意思

1.4 查看当前rs(get命令)

kubectl get rs

ReplicaSet 输出中包含以下字段:

(1) NAME 列出名字空间中 ReplicaSet 的名称;
(2) DESIRED 显示应用的期望副本个数,即在创建 Deployment 时所定义的值。 此为期望状态;
(3) CURRENT 显示当前运行状态中的副本个数;
(4) READY 显示应用中有多少副本可以为用户提供服务;
(5) AGE 显示应用已经运行的时间长度。

注意 ReplicaSet 的名称始终被格式化为[Deployment名称]-[哈希]。 其中的哈希字符串与 ReplicaSet 上的 pod-template-hash 标签一致。

1.5 查看当前pod(get命令)

kubectl get pods --show-labels
kubectl get pods -o wide
kubectl get pods -o wide --show-labels

二、更新Deployment

当前镜像为 1.16.0 ,更新为 1.16.1 ,有两种方式:

方式1:kubectl set image deployment/nginx-deployment nginx=nginx:1.16.1
方式2:kubectl edit deploy xxx 直接修改当前运行的yaml文件

2.1 通过具体的kubectl命令来更新deploy

kubectl set image deployment/nginx-deployment nginx=nginx:1.16.1
kubectl get all -o wide 
kubectl describe deploy xxx 

更换镜像之前,如下:

6c64d87c8c 这个老的replicaset 有三个replica pod

59777878f8 这个新的replicaset 有了一个replica pod
6c64d87c8c 这个老的replicaset 变成二个replica pod

59777878f8 这个新的replicaset 有了二个replica pod
6c64d87c8c 这个老的replicaset 变成一个replica pod

59777878f8 这个新的replicaset 有了三个replica pod
6c64d87c8c 这个老的replicaset 变成零个replica pod


2.2 通过修改当前运行的yaml文件来更新deploy

需求:nignx 从 1.16.2 变成 1.17

方式:kubectl edit deploy xxx 直接修改当前运行的yaml文件

kubectl get deploy nginx-deployment -o yaml
kubectl edit deploy nginx-deployment
kubectl get deploy nginx-deployment -o yaml


三、回滚Deployment

3.1 查看版本历史信息

如果说更新deployment是正向变动,那么回滚Deployment就是反向变动。

回滚/反向变动都有一个版本的概念,查看版本的命令如下:

# 查看版本历史
kubectl rollout history deployment/nginx-deployment
# 查看具体版本详细信息
kubectl rollout history deployment/nginx-deployment --revision=2

3.2 回滚到指定版本

回滚/反向变动的命令包括回滚到上一版本和回滚到指定版本,如下:

kubectl rollout undo deployment/nginx-deployment
kubectl rollout undo deployment/nginx-deployment --to-revision=1

# 回滚到上一版本
kubectl rollout undo deployment/nginx-deployment

# 回滚到指定版本
kubectl rollout undo deployment/nginx-deployment --to-revision=1


四、缩放Deployment

缩放包括手动缩放和自动缩放两种方式,命令如下:

手动缩放:kubectl scale deployment/nginx-deployment --replicas=10
自动缩放:kubectl autoscale deployment/nginx-deployment --min=10 --max=15 --cpu-percent=80

4.1 手动缩放

# 手动缩放
kubectl scale deployment/nginx-deployment --replicas=10
kubectl get all -o wide

4.2 自动缩放

# 自动缩放
kubectl autoscale deployment/nginx-deployment --min=10 --max=15 --cpu-percent=80
kubectl get all -o wide

五、暂停、恢复 Deployment 的上线过程

暂停:kubectl rollout pause deployment/nginx-deployment
恢复:kubectl rollout resume deployment/nginx-deployment

5.1 暂停deploy


处于暂停状态无法更新,如下:

kubectl set image deployment/nginx-deployment nginx=nginx:1.17
kubectl rollout history deployment/nginx-deployment
kubectl get rs

暂停 Deployment 上线之前的初始状态将继续发挥作用,但新的更新在 Deployment 上线被暂停期间不会产生任何效果。

5.2 恢复deploy

kubectl rollout resume deployment/nginx-deployment
kubectl get rs

六、Deployment 状态

6.1 进行中的Deployment

执行下面的任务期间,Kubernetes 标记 Deployment 为进行中(Progressing)_:

(1) Deployment 创建新的 ReplicaSet
(2) Deployment 正在为其最新的 ReplicaSet 扩容
(3) Deployment 正在为其旧有的 ReplicaSet(s) 缩容
(4) 新的 Pod 已经就绪或者可用(就绪至少持续了 MinReadySeconds 秒)。

当上线过程进入“Progressing”状态时,Deployment 控制器会向 Deployment 的 .status.conditions 中添加包含下面属性的状况条目:

type: Progressing
status: "True"
reason: NewReplicaSetCreated | reason: FoundNewReplicaSet | reason: ReplicaSetUpdated

你可以使用 kubectl rollout status 监视 Deployment 的进度。

6.2 成功的Deployment

当 Deployment 具有以下特征时,Kubernetes 将其标记为完成(Complete);

(1) 与 Deployment 关联的所有副本都已更新到指定的最新版本,这意味着之前请求的所有更新都已完成。
(2) 与 Deployment 关联的所有副本都可用。
(3) 未运行 Deployment 的旧副本。

当上线过程进入“Complete”状态时,Deployment 控制器会向 Deployment 的 .status.conditions 中添加包含下面属性的状况条目:

type: Progressing
status: "True"
reason: NewReplicaSetAvailable

这一 Progressing 状况的状态值会持续为 “True”,直至新的上线动作被触发。 即使副本的可用状态发生变化(进而影响 Available 状况),Progressing 状况的值也不会变化。

你可以使用 kubectl rollout status 检查 Deployment 是否已完成。 如果上线成功完成,kubectl rollout status 返回退出代码 0。

6.3 失败的Deployment

你的 Deployment 可能会在尝试部署其最新的 ReplicaSet 受挫,一直处于未完成状态。 造成此情况一些可能因素如下:

(1) 配额(Quota)不足
(2) 就绪探测(Readiness Probe)失败
(3) 镜像拉取错误
(4) 权限不足
(5) 限制范围(Limit Ranges)问题
(6) 应用程序运行时的配置错误

检测此状况的一种方法是在 Deployment 规约中指定截止时间参数: (.spec.progressDeadlineSeconds)。 .spec.progressDeadlineSeconds 给出的是一个秒数值,Deployment 控制器在(通过 Deployment 状态) 标示 Deployment 进展停滞之前,需要等待所给的时长。


总结

创建deployment并查看deploy、查看rs、查看pod
更新deployment:要么通过kubectl命令、要么通过edit deploy xxx来更新
回滚deployment:学会查看版本历史信息的两条命令,学会回滚到指定版本
缩放deployment:手动缩放+自动缩放
暂停deployment+恢复deployment
deployment的状态

天天打码,天天进步!!

以上是关于Kubernetes基础_04_Deployment全解析(无状态的Pod)的主要内容,如果未能解决你的问题,请参考以下文章

每天5分钟玩转Kubernetes | Dashboard典型使用场景

Kubernetes基础_02_Pod全解析

Kubernetes基础_02_Pod全解析

Kubernetes基础_03_ReplicaSet全解析

Kubernetes基础_03_ReplicaSet全解析

Kubernetes基础_06_DaemonSet全解析(每个Node都有的Pod)