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

【赵渝强老师】K8s中的Deployment控制器

原创 赵渝强老师 2025-11-02
225

1.png
K8s的Deployment将Pod部署成无状态的应用程序,它只关心Pod的数量、Pod更新方式、使用的镜像和资源限制等。由于是无状态的管理方式,因此Deployment中没有角色和顺序的概念,换句话说:Deployment中没有状态。

通过使用Deployment,可以让开发人员上线部署Pod、设置Pod的副本、实现Pod的升级与回滚。通过在yaml文件中描述Deployment的目标是什么,Deployment控制器就会自动完成对Pod和Replica Set的管理。Kubernetes运行创建一个新的Deployment,也可以用一个新的Deployment替换旧的Deployment。

提示:ReplicaSet是下一代复本控制器,它可以独立使用。但在Kubernetes中主要是被Deployment作为协调Pod的创建、更新和删除。当使用Deployment控制器时,它会自动创建ReplicaSets,并对其进行管理。

aaa11.png
点击这里查看视频讲解:【赵渝强老师】K8s中的Deployment控制器

Deployment、ReplicaSet和Pod之间的关系可以通过下图来说明。

2.png

下面的描述了创建和更新Deployment的过程。

  • 创建Deployment的过程:Deployment将创建ReplicaSet。ReplicaSet在后台根据指定的副本数创建Pod,并检查Pod的状态以确定Pod启动成功还是失败。
  • 更新Deployment的过程:当用户更新Deployment时,Kubernetes会创建一个新的ReplicaSet。Deployment会将Pod从旧的ReplicaSet迁移到新的ReplicaSet中。如果迁移失败或者Pod不稳定,Deployment会自动回滚到上一个版本。如果迁移成功,Deployment将清除旧的不必要的ReplicaSet。

在掌握的Deployment控制器的作用后,这里将通过一个示例来演示如何使用Deployment控制管理Pod。

(1)创建deployment-demo.yaml文件,并输入下面的内容:

apiVersion: apps/v1 kind: Deployment metadata: name: deployment-demo labels: app: nginx spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.7.9 imagePullPolicy: IfNotPresent ports: - containerPort: 80

其中的参数含义如下表所示。

3.png

(2)通过运行以下命令创建 Deployment。

kubectl apply -f deployment-demo.yaml

(3)查看创建的Deployment和ReplicaSet信息。

kubectl get deployments,replicaset,pod

提示:这条命令可以简写为下面的形式:
kubectl get deploy,rs,pod

输出的信息如下图所示:

4.png

(4)查看每个Pod自动生成的标签,如下图所示。

kubectl get pods --show-labels

5.png

(5)修改yaml文件来实现更新的目的。下面的yaml文件将Nginx的版本升级到了1.9.1,并将Pod的副本数改成了4。

apiVersion: apps/v1 kind: Deployment metadata: name: deployment-demo labels: app: nginx spec: replicas: 4 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.9.1 imagePullPolicy: IfNotPresent ports: - containerPort: 80

提示:这里也可以使用命令行的方式来实现更新,例如:
kubectl set image deploy deployment-demo nginx=nginx:1.9.1

(6)通过运行以下命令重新应用 Deployment。

kubectl apply -f deployment-demo.yaml

(7)获取Deployment的信息。

kubectl describe deployments deployment-demo # 输出的部分信息如下: Pod Template: Labels: app=nginx Containers: nginx: Image: nginx:1.9.1 Port: 80/TCP Host Port: 0/TCP Environment: <none> Mounts: <none> Volumes: <none>

(8)执行下面的命令,将Nginx的版本更新到1.7.9。

kubectl --record deployment.apps/deployment-demo \ set image deployment.apps/deployment-demo nginx=nginx:1.7.9

提示:为了能够追溯修改历史记录,这里使用了–record参数。

(9)获取Deployment的信息。

kubectl describe deployments deployment-demo # 输出的部分信息如下。这里看出这里的Nginx版本又回到了1.7.9. Pod Template: Labels: app=nginx Containers: nginx: Image: nginx:1.7.9 Port: 80/TCP Host Port: 0/TCP Environment: <none> Mounts: <none>

(10)执行命令追溯修改的历史。

kubectl rollout history deployment deployment-demo # 输出的信息如下: deployment.extensions/deployment-demo REVISION CHANGE-CAUSE 2 <none> 3 kubectl deployment.apps/deployment-demo \ set image deployment.apps/deployment-demo \ nginx=nginx:1.7.9 --record=true

(11)执行命令将回滚到版本2。

kubectl rollout undo deployment deployment-demo --to-revision=2

(12)重新获取Deployment的信息。

kubectl describe deployments deployment-demo # 输出的部分信息如下。这里看出这里的Nginx版本又回到了1.9.1。 Pod Template: Labels: app=nginx Containers: nginx: Image: nginx:1.9.1 Port: 80/TCP Host Port: 0/TCP Environment: <none> Mounts: <none> Volumes: <none>

(13)下面的命令将对Deployment进行缩放操作。

kubectl scale deployment deployment-demo --replicas=7

(14)下面的命令将暂停和恢复Deployment

kubectl rollout pause deployment deployment-demo kubectl rollout resume deployment deployment-demo

提示:可以在更新Deployment之前暂停Deployment,等待更新完成后在恢复它。这允许在暂停和恢复之间应用多个修补程序,而不会触发不必要的Deployment。

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

评论