微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

kuberbeters、Pod 控制器Deployment

十年河东,十年河西,莫欺少年穷

学无止境,精益求精

1、Pod控制器介绍

  • 在kubernetes中,按照Pod的创建方式可以将其分为两类:
    • 自主式Pod:kubernetes直接创建出来的Pod,这种Pod删除后就没有了,也不会重建。
    • 控制器创建Pod:通过Pod控制器创建的Pod,这种Pod删除之后还会自动重建。
  • Pod控制器:Pod控制器是管理Pod的中间层,使用了Pod控制器之后,我们只需要告诉Pod控制器,想要多少个什么样的Pod就可以了,它就会创建出满足条件的Pod并确保每一个Pod处于用户期望的状态,如果Pod在运行中出现故障,控制器会基于指定的策略重启或重建Pod。
  • 在kubernetes中,有很多类型的Pod控制器,每种都有自己的适合的场景,常见的有下面这些:
    • ReplicationController:比较原始的Pod控制器,已经被废弃,由replicaset替代。
    • Horizontal Pod Autoscaler:可以根据集群负载自动调整Pod的数量,实现削峰填谷。
    • DaemonSet:在集群中的指定Node上都运行一个副本,一般用于守护进程类的任务。
    • Job:它创建出来的Pod只要完成任务就立即退出,用于执行一次性任务。
    • CronJob:它创建的Pod会周期性的执行,用于执行周期性的任务。
    • StatefulSet:管理有状态的应用

Deployment(Deploy)

  • 为了更好的解决服务编排的问题,kubernetes在v1.2版本开始,引入了Deployment控制器。值得一提的是,Deployment控制器并不直接管理Pod,而是通过管理replicaset来间接管理Pod,即:Deployment管理replicasetreplicaset管理Pod。所以Deployment的功能replicaset强大。

  • Deployment的主要功能如下:
    • 支持发布的停止、继续。
    • 支持版本滚动更新和版本回退。
  • Deployment的资源清单:

apiVersion: apps/v1 # 版本号 
kind: Deployment # 类型 
Metadata: # 元数据 
  name: # rs名称 
  namespace: # 所属命名空间 
  labels: #标签 
    controller: deploy 
spec: # 详情描述 
  replicas: 3 # 副本数量 
  revisionHistoryLimit: 3 # 保留历史版本,认为10 
  paused: false # 暂停部署,认是false 
  progressDeadlineseconds: 600 # 部署超时时间(s),认是600 
  strategy: # 策略 
    type: RollingUpdate # 滚动更新策略 
    rollingUpdate: # 滚动更新 
      maxSurge: 30% # 最大额外可以存在的副本数,可以为百分比,也可以为整数 maxUnavailable: 30% # 最大不可用状态的    Pod 的最大值,可以为百分比,也可以为整数 
  selector: # 选择器,通过它指定该控制器管理哪些pod 
    matchLabels: # Labels匹配规则 
      app: Nginx-pod 
    matchExpressions: # Expressions匹配规则 
      - {key: app, operator: In, values: [Nginx-pod]} 
  template: # 模板,当副本数量不足时,会根据下面的模板创建pod副本 
    Metadata: 
      labels: 
        app: Nginx-pod 
    spec: 
      containers: 
      - name: Nginx 
        image: Nginx:1.17.1 
        ports: 
        - containerPort: 80
View Code

创建Deployment

apiVersion: apps/v1 # 版本号
kind: Deployment # 类型
Metadata: # 元数据
  name: pc-deployment # deployment的名称
  namespace: dev # 命名类型
spec: # 详细描述
  replicas: 3 # 副本数量
  selector: # 选择器,通过它指定该控制器可以管理哪些Pod
    matchLabels: # Labels匹配规则
      app: Nginx-pod
  template: # 模块 当副本数据不足的时候,会根据下面的模板创建Pod副本
    Metadata:
      labels:
        app: Nginx-pod
    spec:
      containers:
        - name: Nginx # 容器名称
          image: Nginx:1.17.1 # 容器需要的镜像地址
          ports:
            - containerPort: 80 # 容器所监听的端口

执行yaml文件

kubectl create -f pc-deployment.yaml

创建成功后,查看该Deployment 

kubectl get deploy pc-deployment -n dev -o wide

 查看dev命名空间下的replicaset 和 Pod

kubectl get rs,pod -n dev -o wide

 

 Deployment 的扩缩容 

命令模式:

kubectl scale deploy pc-deployment --replicas=5 -n dev

编辑模式:

kubectl edit deployment pc-deployment -n dev  

Deployment 的镜像更新

Deployment的镜像更新支持两种模式的策略,分别为:重建更新、滚动更新

重建更新:在创建出新的Pod之前会先杀掉所有已经存在的Pod

滚动更新:滚动更新,就是杀死一部分,就启动一部分,在更新过程中,存在两个版本的Pod

重建更新

  • 编辑pc-deployment.yaml文件,在spec节点下添加更新策略strategy
apiVersion: apps/v1 # 版本号
kind: Deployment # 类型
Metadata: # 元数据
  name: pc-deployment # deployment的名称
  namespace: dev # 命名类型
spec: # 详细描述
  replicas: 3 # 副本数量
  strategy: # 镜像更新策略
    type: Recreate # Recreate:在创建出新的Pod之前会先杀掉所有已经存在的Pod
  selector: # 选择器,通过它指定该控制器可以管理哪些Pod
    matchLabels: # Labels匹配规则
      app: Nginx-pod
  template: # 模块 当副本数据不足的时候,会根据下面的模板创建Pod副本
    Metadata:
      labels:
        app: Nginx-pod
    spec:
      containers:
        - name: Nginx # 容器名称
          image: Nginx:1.17.1 # 容器需要的镜像地址
          ports:
            - containerPort: 80 # 容器所监听的端口

更新Depolyment 

kubectl apply -f pc-deployment.yaml

更新成功后,可通过命令模式  

命令模式:

kubectl set image deployment pc-deployment Nginx=Nginx:1.17.2 -n dev

编辑模式 【直接编辑的是Deployment】:

kubectl edit deployment pc-deployment -n dev  

滚动更新

编辑pc-deployment.yaml文件,在spec节点下添加更新策略
apiVersion: apps/v1 # 版本号
kind: Deployment # 类型
Metadata: # 元数据
  name: pc-deployment # deployment的名称
  namespace: dev # 命名类型
spec: # 详细描述
  replicas: 3 # 副本数量
  strategy: # 镜像更新策略
    type: RollingUpdate # RollingUpdate:滚动更新,就是杀死一部分,就启动一部分,在更新过程中,存在两个版本的Pod
    rollingUpdate:
      maxUnavailable: 25%
      maxSurge: 25%
  selector: # 选择器,通过它指定该控制器可以管理哪些Pod
    matchLabels: # Labels匹配规则
      app: Nginx-pod
  template: # 模块 当副本数据不足的时候,会根据下面的模板创建Pod副本
    Metadata:
      labels:
        app: Nginx-pod
    spec:
      containers:
        - name: Nginx # 容器名称
          image: Nginx:1.17.1 # 容器需要的镜像地址
          ports:
            - containerPort: 80 # 容器所监听的端口

更新deploy

kubectl apply -f pc-deployment.yaml

通过命令更新镜像

kubectl set image deployment pc-deployment Nginx=Nginx:1.17.3 -n dev

也可以直接编辑Deploy文件

kubectl edit deployment pc-deployment -n dev  

编辑更新镜像策略为:RollingUpdate

  strategy: # 镜像更新策略
    type: RollingUpdate # RollingUpdate:滚动更新,就是杀死一部分,就启动一部分,在更新过程中,存在两个版本的Pod

wq报错后,再次查看Deploy

kubectl edit deployment pc-deployment -n dev   --再次查看

 

 Ttpe 已更新为滚动更新,且maxSurge 和 另一个参数已重置为认值

查看replicaset

kubectl get rs -n dev

# 查看rs,发现原来的rs依旧存在,只是Pod的数量变为0,而后又产生了一个rs,Pod的数量变为3@H_502_247@# 其实这就是deployment能够进行版本回退的奥妙所在,该奥妙可用于版本回退。

版本回退

  • Deployment支持版本升级过程中的暂停、继续功能以及版本回退等诸多功能,下面具体来看:
# 版本升级相关功能
kubetl rollout 参数 deploy xx  # 支持下面的选择
# status 显示当前升级的状态
# history 显示升级历史记录
# pause 暂停版本升级过程
# resume 继续已经暂停的版本升级过程
# restart 重启版本升级过程
# undo 回滚到上一级版本 (可以使用--to-revision回滚到指定的版本)

查看当前升级版本的状态

kubectl rollout status deployment pc-deployment -n dev

会返回成功或失败

kubectl rollout history deployment pc-deployment -n dev

 

 历史记录了两个版本,最新版本为 2 

  • 版本回退:
# 可以使用-to-revision=1回退到1版本,如果省略这个选项,就是回退到上个版本,即2版本
kubectl rollout undo deployment pc-deployment --to-revision=1 -n dev

deployment之所以能够实现版本的回退,就是通过记录下历史的replicaset来实现的,一旦想回滚到那个版本,只需要将当前版本的Pod数量降为0,然后将回退版本的Pod提升为目标数量即可。

执行回退后,再次查看历史记录版本号

kubectl rollout history deployment pc-deployment -n dev

 

 一旦执行了回退,回退到的目标版本就变成了新的版本,因此,版本3 就是 未回退时的版本 1

@天才卧龙的波尔克

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐