前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【赵渝强老师】K8s中的Deployment控制器

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

原创
作者头像
赵渝强老师
发布2024-09-20 10:55:43
640
发布2024-09-20 10:55:43
举报
文章被收录于专栏:容器技术

  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,并对其进行管理。

  视频讲解如下:

视频内容

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

  下面的描述了创建和更新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文件,并输入下面的内容:

代码语言: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

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

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

代码语言:powershell
复制
kubectl apply -f deployment-demo.yaml

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

代码语言:powershell
复制
kubectl get deployments,replicaset,pod

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

  输出的信息如下图所示:

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

代码语言:powershell
复制
kubectl get pods --show-labels

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

代码语言:yaml
复制
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。

代码语言:powershell
复制
kubectl apply -f deployment-demo.yaml

(7)获取Deployment的信息。

代码语言:powershell
复制
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。

代码语言:powershell
复制
kubectl --record deployment.apps/deployment-demo \
set image deployment.apps/deployment-demo nginx=nginx:1.7.9

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

(9)获取Deployment的信息。

代码语言:powershell
复制
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)执行命令追溯修改的历史。

代码语言:powershell
复制
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。

代码语言:powershell
复制
kubectl rollout undo deployment deployment-demo --to-revision=2

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

代码语言:powershell
复制
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进行缩放操作。

代码语言:powershell
复制
kubectl scale deployment deployment-demo --replicas=7

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

代码语言:powershell
复制
kubectl rollout pause deployment deployment-demo
kubectl rollout resume deployment deployment-demo

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档