目 录CONTENT

文章目录

Kubernetes-Deployments控制器

Administrator
2024-10-10 / 0 评论 / 0 点赞 / 1 阅读 / 11124 字

Kubernetes-Deployments控制器

概念

Deployments控制器 简写(deploy)
​
- 副本集 (ReplicaSet): Deployments 使用副本集来确保在集群中运行指定数量的 Pod 实例。副本集定义了 Pod 的模板,并指定要运行的副本数。Deployments 控制器通过与副本集交互来实现应用程序的水平扩展和收缩。
​
- 声明性配置: 使用 Deployments 控制器时,您只需定义所需的应用程序状态,而不需要指定如何达到这种状态。Kubernetes 将负责执行必要的步骤以确保集群中的实际状态与定义的状态匹配。
​
- 滚动升级 (Rolling Updates): Deployments 支持滚动升级,这意味着您可以轻松地更新应用程序而不会中断服务。滚动升级通过逐步替换旧的 Pod 实例来实现。这确保了在升级期间应用程序一直可用。
​
- 回滚 (Rollbacks): 如果升级后出现问题,Deployments 允许您回滚到先前的版本。这是通过恢复以前的副本集来实现的。这提供了一种容错机制,确保即使在升级过程中出现问题,系统也能够回到正常状态。
​
- 版本标签 (Version Labels): Deployments 控制器使用标签来跟踪应用程序的不同版本。每个副本集和 Pod 都可以被标记,以便进行版本控制和跟踪。
​
- 持久性存储: Deployments 控制器通过使用持久卷 (Persistent Volumes) 和持久卷声明 (Persistent Volume Claims) 支持应用程序的持久性存储需求。这对于需要持久性数据的应用程序非常重要。
​
- 自愈 (Self-healing): 如果某个 Pod 失败或被删除,Deployments 控制器将负责启动新的 Pod 实例,以确保所需的副本数保持不变。
​
- 通过使用 Deployments 控制器,开发人员和运维团队可以更轻松地管理应用程序的生命周期,从部署到升级再到回滚。这提高了应用程序的可靠性、可维护性和可伸缩性。

参考文档

https://kubernetes.io/zh-cn/docs/concepts/workloads/controllers/deployment/

使用Deployments控制器创建资源对象

[root@kubernetes-master controller]# cat nginx-deploy.yaml 
---
apiVersion: v1
kind: Namespace             # 资源对象命名空间
metadata:
  name: nginx-deploy          # 命名空间名为 nginx-deploy
---
apiVersion: apps/v1           # deploment控制器版本为 apps/v1
kind: Deployment            # 创建的资源对象为 deploy 控制器
metadata:               # 元数据
  name: nginx-deployment        # deploy控制器名
  namespace: nginx-deploy       # 所在命名空间
  labels:               # 创建标签
    app: nginx              # 标签键值
spec:                 # 属性
  replicas: 3             # 预期副本数量 
  selector:               
    matchLabels:            # 选择带有下面标签的pod进行管理
      app: nginx            # 该标签会被上面deploy的控制器进行管理
  template:               # 定义Pod信息
    metadata:             # 元数据
      labels:             # 使用标签
        app: nginx            # 使用deploy控制器标签
    spec:
      containers:     
        - name: nginx-web       # 容器名
          image: daocloud.io/library/nginx  # 容器镜像
          ports:            # 容器内暴漏端口
            - containerPort: 80     # 端口号
# 创建并查看pod信息
[root@kubernetes-master controller]# kubectl  apply  -f nginx-deploy.yaml 
namespace/nginx-deploy created
deployment.apps/nginx-deployment created
​
[root@kubernetes-master controller]# kubectl  get pod -n nginx-deploy  -o wide 
NAME                                READY   STATUS    RESTARTS   AGE   IP             NODE               NOMINATED NODE   READINESS GATES
nginx-deployment-76f54754cf-5sbfj   1/1     Running   0          12s   10.10.20.215   kubernetes-node1   <none>           <none>
nginx-deployment-76f54754cf-gmnxs   1/1     Running   0          12s   10.10.20.209   kubernetes-node1   <none>           <none>
nginx-deployment-76f54754cf-t4ls7   1/1     Running   0          12s   10.10.20.122   kubernetes-node2   <none>           <none>
# 查看deploy控制器详细信息
[root@kubernetes-master controller]# kubectl  get deploy -n nginx-deploy  -o wide 
NAME               READY   UP-TO-DATE   AVAILABLE   AGE   CONTAINERS   IMAGES                      SELECTOR
nginx-deployment   3/3     3            3           92s   nginx-web    daocloud.io/library/nginx   app=nginx

image-20231109131313001

扩容及缩容

# 命令行方式
# 扩容pod副本为4个
[root@kubernetes-master controller]# kubectl  scale -n nginx-deploy  deployment nginx-deployment --replicas 4
deployment.apps/nginx-deployment scaled
​
# 查看
[root@kubernetes-master controller]# kubectl  get pod -n nginx-deploy 
NAME                                READY   STATUS    RESTARTS   AGE
nginx-deployment-76f54754cf-5sbfj   1/1     Running   0          6m38s
nginx-deployment-76f54754cf-gmnxs   1/1     Running   0          6m38s
nginx-deployment-76f54754cf-hff9m   1/1     Running   0          15s
nginx-deployment-76f54754cf-t4ls7   1/1     Running   0          6m38s
# yaml方式
[root@kubernetes-master controller]# kubectl  apply -f nginx-deploy.yaml 
namespace/nginx-deploy unchanged
deployment.apps/nginx-deployment configured
​
# 查看到又变回3个
[root@kubernetes-master controller]# kubectl  get pod -n nginx-deploy  
NAME                                READY   STATUS    RESTARTS   AGE
nginx-deployment-76f54754cf-5sbfj   1/1     Running   0          9m27s
nginx-deployment-76f54754cf-gmnxs   1/1     Running   0          9m27s
nginx-deployment-76f54754cf-t4ls7   1/1     Running   0          9m27s

image-20231109131833082

滚动更新

# 修改容器镜像为daocloud.io/library/nginx:1.13.2-alpine-per这个版本
[root@kubernetes-master controller]# kubectl set image deployment/nginx-deployment nginx-web=daocloud.io/library/nginx:1.13.2-apline-perl -n nginx-deploy
deployment.apps/nginx-deployment image updated
​
# 查看deployment中pod信息 看到版本已经变更
[root@kubernetes-master controller]# kubectl  get deployment -n nginx-deploy  -o wide
NAME               READY   UP-TO-DATE   AVAILABLE   AGE   CONTAINERS   IMAGES                                         SELECTOR
nginx-deployment   3/3     3            3           29m   nginx-web    daocloud.io/library/nginx:1.13.2-alpine-perl   app=nginx
​
注: 命令解释
--  kubectl set image :设置镜像
--  deployment/nginx-deployment :deployment资源控制器中的名为nginx-deployment管理器
--  nginx-web=daocloud.io/library/nginx:1.13.2-apline-perl :nginx-web是pod中的容器名 =后面是镜像地址
-- -n nginx-deploy 指定命名空间为 nginx-deploy
# 查看更新过程
[root@kubernetes-master controller]# kubectl  describe -n nginx-deploy  deployment nginx-deployment

根据此日志可以看出当发生更新镜像时,deploy会创建一个该版本的镜像,当镜像运行起来后,deploy会把原版本的pod依次缩容一个,并创建新版本的pod直到完全更新。

image-20231109134041959

版本回滚

# 查看当前pod镜像版本为daocloud.io/library/nginx:1.13.2-alpine-perl
[root@kubernetes-master controller]# kubectl  get deployment -n nginx-deploy -o wide  
NAME               READY   UP-TO-DATE   AVAILABLE   AGE   CONTAINERS   IMAGES                                         SELECTOR
nginx-deployment   3/3     3            3           30m   nginx-web    daocloud.io/library/nginx:1.13.2-alpine-perl   app=nginx

# 版本回滚到上个版本
[root@kubernetes-master controller]# kubectl  rollout undo  -n nginx-deploy  deployment/nginx-deployment 
deployment.apps/nginx-deployment rolled back

# 查看版本,已经回退到上个版本
[root@kubernetes-master controller]# kubectl  get deployment -n nginx-deploy -o wide  
NAME               READY   UP-TO-DATE   AVAILABLE   AGE   CONTAINERS   IMAGES                      SELECTOR
nginx-deployment   3/3     3            3           36s   nginx-web    daocloud.io/library/nginx   app=nginx

删除Pod

# 命令行方式
# 查看deploy控制器名称
[root@kubernetes-master controller]# kubectl get deployment -n nginx-deploy 
NAME               READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   3/3     3            3           8m53s
# 删除deploy控制器
[root@kubernetes-master controller]# kubectl  delete  deployment -n nginx-deploy  nginx-deployment 
deployment.apps "nginx-deployment" deleted


# yaml方式
# 因为上面已经删除 所以先创建出来再删除
[root@kubernetes-master controller]# kubectl  apply  -f nginx-deploy.yaml 
namespace/nginx-deploy unchanged
deployment.apps/nginx-deployment created
# 查看pod
[root@kubernetes-master controller]# kubectl  get pod -n nginx-deploy 
NAME                                READY   STATUS    RESTARTS   AGE
nginx-deployment-76f54754cf-8h9km   1/1     Running   0          10s
nginx-deployment-76f54754cf-9b52q   1/1     Running   0          10s
nginx-deployment-76f54754cf-rw8qw   1/1     Running   0          10s
# 通过yaml文件删除
[root@kubernetes-master controller]# kubectl  delete  -f nginx-deploy.yaml 
namespace "nginx-deploy" deleted
deployment.apps "nginx-deployment" deleted

注: 通常删除都使用yaml文件进行pod的创建及删除,若yaml文件找不到了,也可通过命令删除控制器方式删除pod

0

评论区