ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Kubernetes(K8S) 入门进阶实战完整教程-06k8s的Pod控制器01-ReplicaSet和Deployment

2022-06-25 09:38:06  阅读:153  来源: 互联网

标签:kubectl 01 Kubernetes nginx dev 06k8s pc Pod pod


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替代。
○ ReplicaSet:保证指定数量的Pod运行,并支持Pod数量变更,镜像版本变更。
○ Deployment:通过控制ReplicaSet来控制Pod,并支持滚动升级、版本回退。
○ Horizontal Pod Autoscaler:可以根据集群负载自动调整Pod的数量,实现削峰填谷。
○ DaemonSet:在集群中的指定Node上都运行一个副本,一般用于守护进程类的任务。
○ Job:它创建出来的Pod只要完成任务就立即退出,用于执行一次性任务。
○ CronJob:它创建的Pod会周期性的执行,用于执行周期性的任务。
○ StatefulSet:管理有状态的应用。

ReplicaSet

  1. 概述
    ReplicaSet的作用主要是保证一定数量的Pod能够正常运行,它会持续监听这些Pod的运行状态,一旦Pod发生故障,就会重启或重建,同时它还支持对Pod数量的扩缩容和版本镜像的升级。
  2. ReplicaSet的资源清单文件
apiVersion: apps/v1 # 版本号 
kind: ReplicaSet # 类型 
metadata: # 元数据 
  name: # rs名称
  namespace: # 所属命名空间 
  labels: #标签 
    controller: rs 
spec: # 详情描述 
  replicas: 3 # 副本数量 
  selector: # 选择器,通过它指定该控制器管理哪些po
    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

● 在这里,需要新了解的配置项就是spec下面几个选项:
○ replicas:指定副本数量,其实就是当然rs创建出来的Pod的数量,默认为1.
○ selector:选择器,它的作用是建立Pod控制器和Pod之间的关联关系,采用了Label Selector机制(在Pod模块上定义Label,在控制器上定义选择器,就可以表明当前控制器能管理哪些Pod了)。
○ template:模板,就是当前控制器创建Pod所使用的模板,里面其实就是前面学过的Pod的定义。
3. 创建pc-replicaset.yaml文件

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: pc-replicaset
  namespace: dev
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx-pod
  template:
    metadata:
      labels:
        app: nginx-pod
    spec:
      containers:
      - name: nginx
        image: nginx:1.17.1

创建ReplicaSet控制器,并查看

kubectl create -f pc-replicaset.yaml
kubectl get rs/ReplicaSet -n dev

                期望副本数量  当前副本数量  准备好提供服务的副本数量
NAME            DESIRED   CURRENT   READY   AGE     CONTAINERS   IMAGES         SELECTOR
pc-replicaset   3         3         3       6m35s   nginx        nginx:1.17.1   app=nginx-pod
  1. Pod数量的扩缩容
    (1)编辑rs的副本数量,修改spec:replicase:6即可
    kubectl edit rs pc-replicaset -n dev
    再次查看rs的副本数量
    kubectl get rs -n dev
    (2)使用命令实现,使用scale命令实现扩缩容,后面--replicas=n直接指定目标数量即可
kubectl scale rs pc-replicaset --replicas=2 -n dev
kubectl get rs -n dev
kubectl get pods -n dev -o wide  # 发现只剩下两个pod了
  1. Pod中镜像的升级
# 使用编辑命令继续修改,将spec:containers:image:nginx:1.17.2
kubectl edit rs pc-replicaset -n dev
# 查看修改后的ReplicaSet结果
kubectl get rs pc-replicaset -n dev -o wide

# 使用set命令实现镜像升级
# 语法
kubectl set image rs rs名称 容器名称=镜像版本 -n 命名空间

# 命令
kubectl set image rs pc-replicaset nginx=nginx:1.17.1 -n dev
  1. 删除ReplicaSet
# 使用kubectl delete rs 命令会删除ReplicaSet和它管理的Pod
# 在kubernetes删除rs控制器之前,会先将其replicascaler调整为0,等待所有的Pod被删除后,在执行rs对象的删除
kubectl delete rs pc-replicaset -n dev

# 如果希望仅删除ReplicaSet对象,保留Pod,可以使用kubectl delete命令时添加--cascade=false选项(不推荐)
kubectl delete ReplicaSet pc-replicaset --cascade=false -n dev

# 也可以使用yaml直接删除(推荐)
kubectl delete -f pc-replicaset.yaml

Deployment基础

  1. 为了更好的解决服务编排的问题,kubernetes在v1.2版本开始,引入了Deployment控制器。值得一提的是,Deployment控制器并不直接管理Pod,而是通过管理ReplicaSet来间接管理Pod,即:Deployment管理ReplicaSet,ReplicaSet管理Pod。所以Deployment的功能比ReplicaSet强大。
  2. Deployment的主要功能如下
  • 支持ReplicaSet的所有功能
  • 支持发布的停止和继续
  • 支持版本滚动更新和版本回退
  1. Deployment的资源清单
apiVersion: apps/v1 # 版本号 
kind: Deployment # 类型 
metadata: # 元数据 
  name: # rs名称 
  namespace: # 所属命名空间 
  labels: #标签 
    controller: deploy 
spec: # 详情描述 
  replicas: 3 # 副本数量 
  revisionHistoryLimit: 3 # 保留历史版本,默认为10 (实质上通过保留ReplicaSet来实现的版本回退)
  paused: false # 暂停部署,默认是false 
  progressDeadlineSeconds: 600 # 部署超时时间(s),默认是600 
  strategy: # 策略 
    type: RollingUpdate # 滚动更新策略 
    rollingUpdate: # 滚动更新 
      maxSurge: 30% # 最大额外可以存在的副本数,可以为百分比,也可以为整数 maxUnavailable: 30% # 最大不可用状态的    Pod 的最大值,可以为百分
比,也可以为整数 
      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
  1. 创建pc-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: pc-deployment
  namespace: dev
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx-pod
  template:
    metadata:
      labels:
        app: nginx-pod
    spec:
      containers:
      - name: nginx
        image: nginx:1.17.1
  1. 创建Deployment
kubectl create -f pc-deployment.yaml
kubectl get deploy -n dev -o wide
kubectl get pod -n dev -o wide

# UP-TO-DATE: 最新版本的Pod数量;AVAILABLE:当前可用的Pod数量;
# 查看Deployment对应的ReplicaSet
kubectl get ReplicaSet -n dev -o wide

Deployment的扩缩容

  1. 使用scale命令实现扩缩容
    kubectl scale deploy pc-deployment --replicas=5 -n dev
  2. 编辑的方式实现扩缩容,修改spec:replicas:2
    kubectl edit deploy pc-deployment -n dev

Deployment升级策略(镜像更新)

  1. Deployment支持两种镜像更新的策略,重建更新和滚动更新(默认),可以通过strategy选项进行配置
strategy: 指定新的Pod替代旧的Pod的策略,支持两个属性
  type: 指定策略类型,支持两种策略
    Recreate:在创建出新的Pod之前会先杀掉所有已经存在的Pod
    RollingUpdate:滚动更新,就是杀死一部分,就启动一部分,在更新过程中,存在两个版本的Pod
  rollingUpdate:当type为RollingUpdate的时候生效,用于为rollingUpdate设置参数,支持两个属性:
    maxUnavailable:用来指定在升级过程中不可用的Pod的最大数量,默认为25%。
    maxSurge: 用来指定在升级过程中可以超过期望的Pod的最大数量,默认为25%。
  1. 重建更新
    编辑pc-deployment.yaml, 在spec节点下添加更新策略
apiVersion: apps/v1
kind: Deployment
metadata:
  name: pc-deployment
  namespace: dev
spec:
  replicas: 3  # 副本数量
  strategy:  # 镜像更新策略
    type: Recreate  # 重建更新
  selector:  # 选择器,通过它指定该控制器可以管理哪些Pod
    labels:
      app: nginx-pod
  template:
    metadata:
      labels:
        app: nginx-pod
    spec:
      containers:
      - name: nginx
        image: nginx:1.17.1

重新更新下一我们的deployment
kubectl apply -f pc-deployment.yaml
额外开一个窗口监听我们的pod的状态
kubectl get pod -n dev -w
更新我们的镜像版本,查看Pod是否是重建更新的
(1)方法1,编辑更新
kubectl edit deploy pc-deployment -n dev
(2)方法2,命令更新
kubectl set image deploy pc-deployment nginx=nginx:1.17.1 -n dev
3. 滚动更新
编辑pc-deployment.yaml文件,添加滚动更新策略

strategy:  # 镜像更新策略
    type: RollingUpdate  # 滚动更新
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%

升级镜像版本
kubectl edit deploy pc-deployment -n dev
在动态观察的时候发现,pod是停止一些,启动一些,滚动更新 kubectl get pod -n dev -w -w表示动态监视pod状态的变化

镜像更新中rs/ReplicaSet的变化

# 查看rs,发现原来的rs依旧存在,只是Pod的数量变为0,而后又产生了一个rs,Pod的数量变为3
# 其实这就是deployment能够进行版本回退的奥妙所在
kubectl get rs -n dev

[root@master pod-controller]# kubectl get rs -n dev
NAME                       DESIRED   CURRENT   READY   AGE
pc-deployment-5d89bdfbf9   0         0         0       10m
pc-deployment-675d469f8b   3         3         3       8m6s
[root@master pod-controller]#

版本回退

  1. Deployment支持版本升级过程中的暂停、继续功能以及版本回退等诸多功能:
# 版本升级相关功能
kubetl rollout 参数 deploy xx  # 支持下面的选择
# status 显示当前升级的状态
# history 显示升级历史记录
# pause 暂停版本升级过程
# resume 继续已经暂停的版本升级过程
# restart 重启版本升级过程
# undo 回滚到上一级版本 (可以使用--to-revision回滚到指定的版本)
  1. 重新创建我们的deployment和Pod,加上参数--record, 该参数可以记录deployment的整个更新过程
    还是根据上面的pc-deployment.yaml文件创建
kubectl create -f pc-deployment.yaml --record
# 开启两个窗口监听我们的replicaset和pod
kubectl get rs -n dev -w
kubectl get pod -n dev -w
  1. 镜像更新
    kubectl set image deployment pc-deployment nginx=nginx:1.17.2 -n dev
    此时我们查看到两个监听的窗口,发现根据镜像更新策略删除了旧的pod, 创建了新的pod,而replicaset是停止了旧的,创建了新的
  2. 我们查看一下replicaset/rs的数量
    kubectl get rs/replicaset -n dev
    发现有两个rs,老的和新的都有,只不过老的里面没有pod了
  3. 为什么老的pod都没有了还要留着老的replicaset呢?
    因为通过它用来进行版本的回退,所谓的版本回退其实就是把新rs上的pod删除掉,在老的rs上创建对应的pod就可以了。
  4. 回退到指定版本
    kubectl rollout undo deploy pc-deployment -n dev --to-revision=2
  5. 回滚到上一个版本
    kubectl rollout undo deploy pc-deployment -n dev
    注意:无论是回滚到上一个版本还是回滚到指定版本,该版本都会变成最新的版本号。

金丝雀发布

  1. Deployment支持更新过程中的控制,如暂停更新操作(pause)或继续更新操作(resume)。
    例如有一批新的Pod资源创建完成后立即暂停更新过程,此时,仅存在一部分新版本的应用,主体部分还是旧的版本。然后,再筛选一小部分的用户请求到新版本的Pod应用,继续观察能够稳定的按照期望的方式运行,如果没有问题之后再继续完成余下的Pod资源的滚动更新,否则立即回滚操作。
  2. 更新deployment的版本,并配置暂停deployment
    kubectl set image deploy pc-deployment nginx=nginx:1.17.3 -n dev && kubectl rollout pause deploy pc-deployment -n dev
  3. 确保更新的没问题了,我们继续更新
    kubectl rollout resume deployment pc-deployment -n dev
  4. 再次查看更新状态
    kubectl rollout status deploy pc-deployment -n dev
  5. 删除deployment
    kubectl delete -f pc-deployment.yaml

标签:kubectl,01,Kubernetes,nginx,dev,06k8s,pc,Pod,pod
来源: https://www.cnblogs.com/mayanan/p/16390807.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有