deployment详解

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了deployment详解相关的知识,希望对你有一定的参考价值。

简介

deployment是最常见的控制器,是k8s的一个抽象概念,用户更高层次、更高级别的部署和管理pod。

Deployment的主要功能:

  • 管理pod和Replicas
  • pod部署、副本设定、滚动升级、回滚等功能

Deployment应用生命周期管理流程

Deployment应用部署

deployment通过镜像部署应用

部署镜像的两种方式

  • 通过yaml文件
kubectl appky -f xxx.yaml

通过yaml文件部署的好处:

  1. 易于部署复杂的应用,可以在文件中进行编排
  2. 便于后期管理和交接
  3. 易于进行批量部署和删除
  • 命令行部署
kubectl create deployment web --image=nginx:1.18 --replicas=3

Deployment应用升级

应用升级本质上升级的是镜像,需要更新镜像,k8s实现了自动滚动升级

滚动升级:

滚动发布、蓝绿发布、灰度发布

滚动发布是指每次只升级一个或多个服务,升级完成后加入生产环境,不断执行这个过程,直到集群中的全部旧版本升级成新版本。

应用升级方式(更新镜像的三种方式)

 # 通过修改yaml文件,重新应用yaml文件
kubectl apply -f xxx.yaml

# 命令行 kubectl set image deployment deployment名称 容器名称=
kubectl set image deployment web nginx=nginx:1.19
kubectl set image deployment/web nginx=nginx:1.19 # 与上等同

# 使用系统编辑器打开 kubectl edit deployment deployment名称
kubectl edit deployment web
kubectl edit deployment/web # 与上等同

deployment-test.yaml

apiVersion: apps/v1
kind: Deployment # 资源
metadata:
name: demo3 # 资源名称
namespace: default
spec:
replicas: 3
selector:
matchLabels:
project: ec
app: portal
template:
metadata:
labels:
project: ec
app: portal
spec:
containers:
- name: web1 # 容器名字
image: nginx:1.21

升级过程中 可以通过 kubectl describe pod podName 查看升级进度

[root@k8s-master ~]# kubectl describe pod demo4-6ff946676c-vjtms   
Name: demo4-6ff946676c-vjtms
Namespace: default
Priority: 0
Node: k8s-node1/192.168.18.148
Start Time: Tue, 28 Feb 2023 00:47:48 +0800
Labels: app=demo4
pod-template-hash=6ff946676c
Annotations: cni.projectcalico.org/podIP: 10.244.36.74/32
cni.projectcalico.org/podIPs: 10.244.36.74/32
Status: Running
IP: 10.244.36.74
IPs:
IP: 10.244.36.74
Controlled By: ReplicaSet/demo4-6ff946676c
Containers:
nginx: ######## 容器名称
Container ID: docker://2cf2820ef6155d4d56aaac8315294e8cf104d9cbdbd0880a11b560d19a62dcf2
Image: nginx:1.18
Image ID: docker-pullable://nginx@sha256:e90ac5331fe095cea01b121a3627174b2e33e06e83720e9a934c7b8ccc9c55a0
Port: <none>
Host Port: <none>
State: Running
Started: Tue, 28 Feb 2023 00:47:57 +0800
Ready: True
Restart Count: 0

应用升级流程

滚动升级k8s内部自动完成

  • 1个deployment
  • 2个ReplicaSet

滚动更新每次只升级一小部分pod,升级完成后,再升级其他pod,直到全部升级完毕。整个过程中始终有pod在运行,从而保障了业务的正常运行。

比如升级副本数为3的nginx

升级的时候再创建一个replicas 副本数1,将这个更新为新的nginx版本,更新成功后 

将旧的replicas副本数-1,然后随机杀死一个旧的pod,新的replicas 副本数设置为2(旧的副本数减少,新的副本数增加)

再启动一个新的pod,启动成功后,将旧的replicas再-1,随机删除一个旧的pod

以此类推

关于升级的相关参数

apiVersion: apps/v1beta1
kind: Deployment
metadata:
name: kubia
spec:
replicas: 3
progressDeadlineSeconds: 600 # 滚动升级失败的超时时间
minReadySeconds: 10 # 需要容器就绪多久后才能认为可用,在可用前,滚动升级不会继续。这个可以用于控制滚动升级的速率
strategy:
rollingUpdate:
maxSurge: 1 # 在期望副本数基础上,最多允许超出的pod实例数量,允许设置绝对值和百分比
maxUnavailable: 25% # 相对于期望副本数,允许有多少pod实例处于不可用状态,允许设置绝对值和百分比
type: RollingUpdate # 表示滚动升级。也可以配置成 Recreate,其会一次性删除所有旧版本的pod,然后创建新的pod
selector:
matchLabels:
app: kubia
template:
metadata:
name: kubia
labels:
app: kubia
spec:
containers:
- image: test:v1
name: my-container

ReplicaSet控制器

ReplicaSet: 副本集,主要用于维护pod副本数量,不断比对pod当前数量和期望数量

ReplicaSet用途:Deployment每次发布都会创建一个RS作为记录,用于实现滚动升级和回滚。

[root@k8s-master ~]# kubectl get rs # 查看rs记录
NAME DESIRED CURRENT READY AGE
demo3-675dbcfb 0 0 0 96m
demo3-79f9ff8746 0 0 0 93m
demo3-b6b9dc48c 3 3 3 4h6m
demo4-54845d4856 3 3 3 63m
demo4-6ff946676c 0 0 0 67m
#查看 deployment 的历史记录:
[root@k8s-master ~]# kubectl rollout history deployment/demo4
deployment.apps/demo4
REVISION CHANGE-CAUSE
1 <none>
2 <none>






以上是关于deployment详解的主要内容,如果未能解决你的问题,请参考以下文章

k8s控制器Deployment使用详解

K8s Deployment ymal文件详解

必读要点Pod控制器Deployment更新回退详解

K8S yaml文件详解

K8S系列Deployment 详解

Kubernetes_DeploymentStatefulSetDaemonSetJob/CronJob四种控制器详解