0
点赞
收藏
分享

微信扫一扫

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


系列文章目录

文章目录

  • ​​系列文章目录​​
  • ​​前言​​
  • ​​一、创建Deployment​​
  • ​​1.1 创建Deployment​​
  • ​​1.2 Deployment yaml文件​​
  • ​​1.3 查看当前deploy(get命令和rollout命令)​​
  • ​​1.4 查看当前rs(get命令)​​
  • ​​1.5 查看当前pod(get命令)​​
  • ​​二、更新Deployment​​
  • ​​2.1 通过具体的kubectl命令来更新deploy​​
  • ​​2.2 通过修改当前运行的yaml文件来更新deploy​​
  • ​​三、回滚Deployment​​
  • ​​3.1 查看版本历史信息​​
  • ​​3.2 回滚到指定版本​​
  • ​​四、缩放Deployment​​
  • ​​4.1 手动缩放​​
  • ​​4.2 自动缩放​​
  • ​​五、暂停、恢复 Deployment 的上线过程​​
  • ​​5.1 暂停deploy​​
  • ​​5.2 恢复deploy​​
  • ​​六、Deployment 状态​​
  • ​​6.1 进行中的Deployment​​
  • ​​6.2 成功的Deployment​​
  • ​​6.3 失败的Deployment​​
  • ​​总结​​

前言

一、创建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

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

Kubernetes基础_04_Deployment全解析(无状态的Pod)_运维_02

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

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

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

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

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

Kubernetes基础_04_Deployment全解析(无状态的Pod)_缩放_04

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

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

1.4 查看当前rs(get命令)

kubectl get rs

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

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

Kubernetes基础_04_Deployment全解析(无状态的Pod)_运维_07

二、更新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

更换镜像之前,如下:

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

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

Kubernetes基础_04_Deployment全解析(无状态的Pod)_运维_09


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

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

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


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

三、回滚Deployment

3.1 查看版本历史信息

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

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

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

Kubernetes基础_04_Deployment全解析(无状态的Pod)_运维_13

3.2 回滚到指定版本

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

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

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

Kubernetes基础_04_Deployment全解析(无状态的Pod)_缩放_14

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

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


Kubernetes基础_04_Deployment全解析(无状态的Pod)_缩放_16

四、缩放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

Kubernetes基础_04_Deployment全解析(无状态的Pod)_运维_17

4.2 自动缩放

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

Kubernetes基础_04_Deployment全解析(无状态的Pod)_运维_18

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

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

5.1 暂停deploy

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


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

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

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

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

六、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 进展停滞之前,需要等待所给的时长。

Kubernetes基础_04_Deployment全解析(无状态的Pod)_缩放_22

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

总结

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

天天打码,天天进步!!


举报

相关推荐

0 条评论