07. Kubernetes基础篇-资源调度

RC和RS

简介

RC(Replication Controller:复制控制器)和RS(ReplicaSet:复制集)是两种简单部署Pod的方式。
生成环境中主要还是使用更高级的Deployment等方式对Pod进行管理和部署,此处RC和RS简介介绍一下没有过多举例。

RC概念

什么是RC

Replication Controller的简称为RC,RC可以确保Pod副本数达到期望值,也就是RC可以设定Pod的数量。

RC的特点

  1. 如果存在Pod数量大于设定的值时,Replication Controller将会终止多余的Pod。
  2. 如果存在Pod数量小于设定的值时,Replication Controller将会启动更多的Pod来达到设定的值。
  3. 与手动创建的Pod不同,如果用Replication Controller维护的Pod在失败、删除、终止时会自动创建新Pod进行替换。
  4. Replication Controller类似于进程管理程序,但是Replication Controller不是在监视单个节点上的各个进程,而是监控多个节点上的多个Pod。

RC的例子

  • 配置yaml
apiVersion: v1
kind: ReplicationController
metadata:
  name: rc-nginx
  namespace: default

spec:
  replicas: 3
  selector:
    app: nginx
  template:
    metadata:
      name: nginx
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx-web-01
          image: registry.cn-beijing.aliyuncs.com/publicspaces/nginx:1.22.1
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: 80
  • 创建RC
kubectl create -f rc-pod-nginx.yaml

RS概念

什么是RS

ReplicaSet的简称是RS,RS是下一代Replication Controller,RS是支持基于集合的标签选择器的Replication Controller。
ReplicaSet主要用于Deployment协调创建、删除、更新Pod使用。

RS的特点

  1. ReplicaSet和Replication Controller的唯一区别在于ReplicaSet支持标签选择器。
  2. ReplicaSet虽然可以单独使用,但一般建议使用Deployment来自动管理ReplicaSet,除非自定义的Pod不需要更新或其他编排等。

RS的例子

  • 配置yaml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: frontend
  namespace: default
  labels:
    app: guestbook
    tier: frontend
spec:
  replicas: 3
  selector:
    matchLabels:
      tier: frontend
    matchExpressions:
      - {key: tier, operator: In, values: [frontend]}
  template:
    metadata:
      labels:
        app: guestbook
        tier: frontend
    spec:
      containers:
      - name: nginx-web-01
        image: registry.cn-beijing.aliyuncs.com/publicspaces/nginx:1.22.1
        resources:
          requests:
            cpu: 100m
            memory: 100Mi
        ports:
        - containerPort: 80
  • 创建RS
kubectl create -f rs-pod-nginx.yaml

无状态服务

简介

什么是无状态服务

无状态服务(Stateless Service)是指不保存任何客户端会话信息或状态的服务。
这意味着每次客户端请求时,服务都会处理请求,而不会依赖于之前的交互或数据。

无状态服务的特点

  1. 无状态性:无状态服务不存储任何持久化的状态信息。每个请求都是独立的,服务不会在请求之间保留任何数据。
  2. 可伸缩性:由于无状态服务不依赖于持久化状态,因此它们很容易水平扩展。可以轻松地增加更多实例来处理更多的请求。
  3. 容错性:如果一个无状态服务的实例失败,可以快速替换它,因为新实例不需要从失败实例中恢复任何状态。
  4. 一致性:所有实例都可以处理任何请求,因为它们都相同,没有特定实例拥有特殊状态。
  5. 负载均衡:无状态服务可以更容易地通过负载均衡器进行分发,因为每个请求都可以被发送到任何实例。
  6. 状态管理:无状态服务通常需要外部存储系统来管理状态,例如数据库或缓存系统。

常见无状态服务

  • Web服务器:处理HTTP请求,但不保存用户会话信息。用户会话状态通常由外部存储或专门的会话管理服务处理。
  • RESTful API:提供对资源的CRUD(创建、读取、更新、删除)操作,但不保持请求之间的状态。
  • 计算服务:执行计算任务,如数学运算或数据处理,不需要知道其他计算任务的结果。

什么Deployment

Deployment是kubernetes中一个核心资源对象,用于定义和管理应用程序的部署。
Deployment主要用于部署无状态服务的Pod,是kubernetes中最常用的控制器。

Deployment的特点和用途

  1. 声明式配置:与命令式配置相反,声明式配置允许你指定应用程序应该处于什么状态,而不是告诉 Kubernetes 如何达到那个状态。Deployment 对象描述了应用程序应该处于的状态,而 Kubernetes 负责实现这个状态。
  2. 自动部署:当你创建或更新 Deployment 对象时,Kubernetes 会自动创建或更新 Pod,以达到声明的状态。这使得应用程序的部署和扩展变得自动化和易于管理。
  3. 版本控制和回滚:Deployment 支持版本控制,你可以通过修改 Deployment 对象来升级应用程序。如果升级失败,你可以回滚到之前的版本。
  4. 滚动更新:Deployment 支持滚动更新,你可以指定在更新应用程序时应该有多少百分比的 Pod 处于可用状态。这有助于平滑地更新应用程序,减少对服务的影响。
  5. 故障转移和自我修复:如果一个 Pod 失败,Deployment 控制器会自动创建一个新的 Pod 来替换它。这有助于确保应用程序的可用性和稳定性。
  6. 资源管理:你可以为 Deployment 设置资源请求和限制,以确保应用程序有足够的资源运行。
  7. 支持多种 Pod 模板:Deployment 支持多种 Pod 模板,包括使用不同的容器、配置文件和启动命令。

创建Deployment

编辑yaml

apiVersion: apps/v1
kind: Deployment                                                                #定义Deployment资源类型
metadata:
  name: deployment-nginx                                                        #定义Deployment的名称
  namespace: default                                                            #定义Deployment所在命名空间
  labels:                                                                       #定义Deployment的标签信息
    app: nginx
    type: web

spec:                                                                           #定义ReplicaSet的信息
  replicas: 3                                                                   #定义Pod中容器的副本数量
  strategy:                                                                     #定义升级、回滚、部署的策略
    type: RollingUpdate                                                         #定义更新策略为滚动更新策略
    rollingUpdate:                                                              #定义更新的策略
      maxSurge: 25%                                                             #定义滚动更新时,一次添加副本数为25%,也可以设置为数字;如果设置为0,那么maxSurge就不能为0
      maxUnavailable: 25%                                                       #定义滚动更新时,最大不可用副本数为25%,也可以设置为数字;如果设置为0,那么maxUnavailable就不能为0
  revisionHistoryLimit: 10                                                      #定义留存副本的历史记录个数,设置为0表示不保留历史数据
  minReadySeconds: 30                                                           #定义在滚动更新时,新Pod在准备就绪后等待30秒后才会开始接收流量,常与探针配合使用
  progressDeadlineSeconds: 600
  selector:                                                                     #selector下的labels要与template的labels保持一致,否则无法管理Pod
    matchLabels:
      app: nginx                                                                #指定标签要与template中标签保持一致,新版本中一旦定义标签后无法修改
  template:                                                                     #template下的labels要与selector的labels保持一致,否则无法管理Pod
    metadata:
      labels:
        app: nginx                                                              #指定标签要与selector中标签保持一致,新版本中一旦定义标签后无法修改
    spec:                                                                       #定义Pod的容器信息
      containers:                                                               #定义一个Pod的容器
        - name: nginx-web                                                       #定义Pod中容器名称
          image: registry.cn-beijing.aliyuncs.com/publicspaces/nginx:1.22.1     #定义Pod中容器拉取的镜像
          imagePullPolicy: IfNotPresent                                         #定义Pod中容器拉取镜像策略
      restartPolicy: Always                                                     #定义Pod中容器的启动策略

创建Deployment

kubectl create -f deployment-pod-nginx.yaml

字段解释

kubectl get deployments.apps -owide
# NAME               READY   UP-TO-DATE   AVAILABLE   AGE   CONTAINERS   IMAGES                                                       SELECTOR
# deployment-nginx   3/3     3            3           19m   nginx-web    registry.cn-beijing.aliyuncs.com/publicspaces/nginx:1.22.1   app=nginx
  • NAME:Deployment的名称,注意:同一namespace下不能使用相同的名称;
  • READY:Pod的状态,3/3表示,有三个副本,正常启动了三个;
  • UP-TO-DATE:被更新的副本已经达到期望状态的个数;
  • AVAILABLE:已经可以使用的副本数量
  • AGE:显示Deployment的运行时间
  • CONTAINERS:容器的名称,多个容器显示多个名称
  • IMAGES:容器使用的镜像
  • SELECTOR:Deployment的标签信息

更新和回滚

概述

Deployment的更新部署有两种,分别是:滚动更新(Rolling Update)和删除式更新(Recreate)。

  • 滚动更新
    • 滚动更新是默认的更新策略,一次仅更新一批Pod,当更新的Pod就绪后再更新另一批,直到全部更新完成为止;
    • 该策略实现了不间断服务的目标,但是在更新过程中,不同客户端得到的响应内容可能会来自不同版本的应用,会出现新老版本共存状态;
  • 删除式更新
    • 当更新策略设定为Recreate,在更新镜像时,它会先删除现在正在运行的Pod,等彻底杀死后,重新创建新的RS(ReplicaSet);
    • 然后启动对应的Pod,在整个更新过程中,会造成服务一段时间无法提供服务。也称之为单批次更新。

可更新内容

  1. 镜像版本
  • 格式
kubectl set image deployment Deployment名称 容器名称=镜像仓库:镜像版本号 --record=true
  • 举例
kubectl set image deployment deployment-nginx nginx-web=registry.cn-beijing.aliyuncs.com/publicspaces/nginx:1.23.2 --record=true
  • deployment-nginx:指定要更新的Deployment
  • nginx-web:指定要更新的容器
  • registry.cn-beijing.aliyuncs.com/publicspaces/nginx:1.23.2:指定容器使用的新镜像
  • –record=true:记录Deployment的更新记录
  1. 副本数
  • 格式
kubectl scale deployment Deployment名称 --replicas=副本数量 --record=true
  • 举例
kubectl scale deployment deployment-nginx --replicas=6 --record=true
  • deployment-nginx:指定要更新的Deployment
  • –replicas=6:制定副本数量
  • –record=true:记录Deployment的更新记录
  1. 资源请求和限制
  • 格式
kubectl set resources deployment Deployment名称 -c 容器名称 --limits=cpu=值,memory=--requests=cpu=值,memory=--record=true
  • 举例
kubectl set resources deployment deployment-nginx -c nginx-web --limits=cpu=200m,memory=512Mi --requests=cpu=100m,memory=256Mi --record=true
  • deployment-nginx:指定要更新的Deployment
  • -c nginx-web:指定对某个容器操作,不指定表示对整个Deployment操作
  • –limits=cpu=200m,memory=512Mi:指定CPU和MEM的最大资源限制
  • –requests=cpu=100m,memory=256Mi:指定CPU和MEM的请求资源限制
  • –record=true:记录Deployment的更新记录
  1. 环境变量
  • 格式
kubectl set env deployment Deployment名称 -c 容器名称 变量名称=变量的值  --record=true
  • 举例
kubectl set env deployment deployment-nginx -c nginx-web NEW_ENV=test-new-env --record=true
  • deployment-nginx:指定要更新的Deployment
  • -c nginx-web:指定对某个容器操作,不指定表示对整个Deployment操作
  • NEW_ENV=test-new-env:指定要修改的变量名称和值
  • –record=true:记录Deployment的更新记录
  1. 配置文件
  • 格式
kubectl set env deployment Deployment名称 -c 容器名称 变量名称=配置文件 --record=true
  • 举例
kubectl set env deployment deployment-nginx -c nginx-web NEW_FILE=/var/log/lastlog --record=true
  • deployment-nginx:指定要更新的Deployment
  • -c nginx-web:指定对某个容器操作,不指定表示对整个Deployment操作
  • NEW_FILE=/var/log/lastlog:指定要修改的配置文件
  • –record=true:记录Deployment的更新记录
  1. 服务端口
  • 格式
kubectl set env deployment Deployment名称 -c 容器名称 PORT=端口号 --record=true
  • 举例
kubectl set env deployment deployment-nginx -c nginx-web PORT=8080 --record=true
  • deployment-nginx:指定要更新的Deployment
  • -c nginx-web:指定对某个容器操作,不指定表示对整个Deployment操作
  • PORT=8080:指定要修改的端口号
  • –record=true:记录Deployment的更新记录
  1. 重启策略
  • 格式
kubectl set env deployment Deployment名称 -c 容器名称 restartPolicy=更新策略 --record=true
  • 举例
kubectl set env deployment deployment-nginx -c nginx-web restartPolicy=Never --record=true
  • deployment-nginx:指定要更新的Deployment
  • -c nginx-web:指定对某个容器操作,不指定表示对整个Deployment操作
  • restartPolicy=Never:指定要修改的更新策略
  • –record=true:记录Deployment的更新记录

更新

  • 配置yaml文件-更新镜像版本
apiVersion: apps/v1
kind: Deployment                                                                #定义Deployment资源类型
metadata:
  name: deployment-nginx                                                        #定义Deployment的名称
  namespace: default                                                            #定义Deployment所在命名空间
  labels:                                                                       #定义Deployment的标签信息
    app: nginx
    type: web

spec:                                                                           #定义ReplicaSet的信息
  replicas: 3                                                                   #定义Pod中容器的副本数量
  strategy:                                                                     #定义升级、回滚、部署的策略
    type: RollingUpdate                                                         #定义更新策略为滚动更新策略
    rollingUpdate:                                                              #定义更新的策略
      maxSurge: 25%                                                             #定义一次添加副本数为25%
      maxUnavailable: 25%                                                       #定义最大不可用副本数为25%
  revisionHistoryLimit: 10                                                      #定义留存历史记录个数
  progressDeadlineSeconds: 600
  selector:                                                                     #selector下的labels要与template的labels保持一致,否则无法管理Pod
    matchLabels:
      app: nginx                                                                #指定标签要与template中标签保持一致,新版本中一旦定义标签后无法修改
  template:                                                                     #template下的labels要与selector的labels保持一致,否则无法管理Pod
    metadata:
      labels:
        app: nginx                                                              #指定标签要与selector中标签保持一致,新版本中一旦定义标签后无法修改
    spec:                                                                       #定义Pod的容器信息
      containers:                                                               #定义一个Pod的容器
        - name: nginx-web                                                       #定义Pod中容器名称
          image: registry.cn-beijing.aliyuncs.com/publicspaces/nginx:1.23.2     #定义Pod中容器拉取的镜像
          imagePullPolicy: IfNotPresent                                         #定义Pod中容器拉取镜像策略
      restartPolicy: Always                                                     #定义Pod中容器的启动策略
  • 更新Deployment
kubectl replace -f deployment-pod-nginx.yaml

回滚

  • 查看历史部署版本信息
kubectl rollout history deployment deployment-nginx

#deployment-nginx:查看某个Deployment的历史版本
  • 查看指定版本的详细信息
kubectl rollout history deployment deployment-nginx --revision=7

#--revision=7:指定版本号回滚
  • 回滚到上一次版本部署
kubectl rollout undo deployment deployment-nginx
  • 回滚到指定版本的部署
kubectl rollout undo deployment deployment-nginx --to-revision=7

扩容和缩容

扩容

  • 临时扩容
kubectl scale deployment deployment-nginx --replicas=6
  • 永久扩容
apiVersion: apps/v1
kind: Deployment                                                                #定义Deployment资源类型
metadata:
  name: deployment-nginx                                                        #定义Deployment的名称
  namespace: default                                                            #定义Deployment所在命名空间
  labels:                                                                       #定义Deployment的标签信息
    app: nginx
    type: web

spec:                                                                           #定义ReplicaSet的信息
  replicas: 6                                                                   #定义Pod中容器的副本数量
  strategy:                                                                     #定义升级、回滚、部署的策略
    type: RollingUpdate                                                         #定义更新策略为滚动更新策略
    rollingUpdate:                                                              #定义更新的策略
      maxSurge: 25%                                                             #定义一次添加副本数为25%
      maxUnavailable: 25%                                                       #定义最大不可用副本数为25%
  revisionHistoryLimit: 10                                                      #定义留存历史记录个数
  progressDeadlineSeconds: 600
  selector:                                                                     #selector下的labels要与template的labels保持一致,否则无法管理Pod
    matchLabels:
      app: nginx                                                                #指定标签要与template中标签保持一致,新版本中一旦定义标签后无法修改
  template:                                                                     #template下的labels要与selector的labels保持一致,否则无法管理Pod
    metadata:
      labels:
        app: nginx                                                              #指定标签要与selector中标签保持一致,新版本中一旦定义标签后无法修改
    spec:                                                                       #定义Pod的容器信息
      containers:                                                               #定义一个Pod的容器
        - name: nginx-web                                                       #定义Pod中容器名称
          image: registry.cn-beijing.aliyuncs.com/publicspaces/nginx:1.22.1     #定义Pod中容器拉取的镜像
          imagePullPolicy: IfNotPresent                                         #定义Pod中容器拉取镜像策略
      restartPolicy: Always                                                     #定义Pod中容器的启动策略

执行命令“kubectl replace -f deployment-pod-nginx.yaml”

缩容

  • 临时缩容
kubectl scale deployment deployment-nginx --replicas=1
  • 永久缩容
apiVersion: apps/v1
kind: Deployment                                                                #定义Deployment资源类型
metadata:
  name: deployment-nginx                                                        #定义Deployment的名称
  namespace: default                                                            #定义Deployment所在命名空间
  labels:                                                                       #定义Deployment的标签信息
    app: nginx
    type: web

spec:                                                                           #定义ReplicaSet的信息
  replicas: 1                                                                   #定义Pod中容器的副本数量
  strategy:                                                                     #定义升级、回滚、部署的策略
    type: RollingUpdate                                                         #定义更新策略为滚动更新策略
    rollingUpdate:                                                              #定义更新的策略
      maxSurge: 25%                                                             #定义一次添加副本数为25%
      maxUnavailable: 25%                                                       #定义最大不可用副本数为25%
  revisionHistoryLimit: 10                                                      #定义留存历史记录个数
  progressDeadlineSeconds: 600
  selector:                                                                     #selector下的labels要与template的labels保持一致,否则无法管理Pod
    matchLabels:
      app: nginx                                                                #指定标签要与template中标签保持一致,新版本中一旦定义标签后无法修改
  template:                                                                     #template下的labels要与selector的labels保持一致,否则无法管理Pod
    metadata:
      labels:
        app: nginx                                                              #指定标签要与selector中标签保持一致,新版本中一旦定义标签后无法修改
    spec:                                                                       #定义Pod的容器信息
      containers:                                                               #定义一个Pod的容器
        - name: nginx-web                                                       #定义Pod中容器名称
          image: registry.cn-beijing.aliyuncs.com/publicspaces/nginx:1.22.1     #定义Pod中容器拉取的镜像
          imagePullPolicy: IfNotPresent                                         #定义Pod中容器拉取镜像策略
      restartPolicy: Always                                                     #定义Pod中容器的启动策略

执行命令“kubectl replace -f deployment-pod-nginx.yaml”

暂停和恢复

如果更新多项内容时,使用yaml文件可以一次更新。
而使用kubectl命令如何实现多次调整一次更新呢?由此问题引入了暂停和恢复的概念。

暂停

  • 格式
kubectl rollout pause deployment Deployment名称
  • 举例
kubectl rollout pause deployment deployment-nginx

变更

  • 变更镜像版版本
kubectl set image deployment deployment-nginx nginx-web=registry.cn-beijing.aliyuncs.com/publicspaces/nginx:1.23.2 --record
  • 变更资源限制
kubectl set resources deployment deployment-nginx -c nginx-web --limits=cpu=1000m,memory=1024Mi --record

恢复

  • 格式
kubectl rollout resume deployment Deployment名称
  • 举例
kubectl rollout resume deployment deployment-nginx

有状态服务

简介

什么是有状态服务

有状态服务(Stateful Service)是指在处理客户端请求时需要维护和存储状态信息的服务。
这些状态信息可能是客户端会话数据、应用程序配置、数据库连接或其他任何需要在请求之间保持的数据。

有状态服务的特点

  1. 状态持久化:有状态服务通常会将有状态信息持久化存储在某种形式的存储系统中,如数据库、文件系统或内存中的数据结构。
  2. 实例特定:有状态服务的每个实例通常都维护自己的状态,这意味着不同的实例处理请求的方式可能会有所不同,取决于它们各自的状态。
  3. 难以水平扩展:由于有状态服务需要维护状态,水平扩展(即增加更多实例)可能会比较复杂,因为需要确保状态的一致性和同步。
  4. 容错性挑战:如果一个有状态服务的实例失败,恢复状态可能会比较复杂,特别是当状态信息没有及时持久化时。
  5. 状态管理:有状态服务需要管理状态的生命周期,包括状态的创建、更新、读取和删除。

常见有状态服务

  • 数据库服务器:维护数据的状态,包括事务处理和持久化存储。
  • 会话管理服务:存储和管理用户会话信息,如购物车内容或用户登录状态。
  • 消息队列:维护消息的状态,确保消息按顺序传递和处理。
  • 缓存服务:存储热点数据以加快访问速度,同时需要定期更新或失效缓存数据。

什么是StatefulSet

StatefulSet是kubernetes中一种特殊的Pod控制器,用于管理有状态应用程序的部署。
与Deployment不同,StatefulSet用于部署那些需要持久化状态或有特定顺序的 Pod,例如数据库、消息队列或文件服务器。
一般StatefulSet用于一个或多个需求的应用程序,如下:

  • 需要稳定的独一无二的网络标识符;
  • 需要持久化数据;
  • 需要有序的、优雅的部署和扩展;
  • 需要有序的自动滚动更新;

如果应用程序不需要任何稳定的标识符或有序的部署、删除、扩展,可以使用无状态控制器部署应用程序,比如Deployment或者ReplicaSet。

StatefulSet的特点和用途

  1. 有序 Pod 部署:StatefulSet 确保 Pod 按顺序部署,每个 Pod 都有一个唯一的序号(pod-name-00001、pod-name-00002 等),这有助于保持数据的一致性和应用程序的顺序。
  2. 持久化存储:StatefulSet 支持 Pod 的持久化存储,通过与持久化卷(PV)和持久化卷声明(PVC)的集成,可以确保 Pod 的数据即使在 Pod 重新调度或删除后也能持久化。
  3. 稳定的网络标识:每个 StatefulSet Pod 都分配了一个稳定的网络标识,通常是基于 Pod 的名称,这有助于客户端和服务之间保持稳定的网络连接。
  4. 有序滚动更新:StatefulSet 支持有序滚动更新,更新操作会按照 Pod 的序号顺序进行,确保应用程序的顺序和状态不会丢失。
  5. 故障转移和自我修复:如果一个 StatefulSet Pod 失败,Kubernetes 会自动替换它,确保应用程序的可用性和稳定性。
  6. 资源管理:你可以为 StatefulSet 设置资源请求和限制,以确保应用程序有足够的资源运行。

创建StatefulSet

注意:StatefulSet的创建会依赖Service资源。可以通过Service访问到StatefulSet创建的Pod。

编辑yaml

apiVersion: v1
kind: Service
metadata:
  name: service-redis
  namespace: default
  labels:
    app: redis

spec:
  ports:
    - port: 6379                                                                    #定义Service的端口号
      name: redis-port                                                              #定义端口的名称,用于与StatefulSet的Pod中端口名称匹配
  clusterIP: None                                                                   #指定服务不需要一个集群 IP,这意味着它不会分配一个固定的 IP 地址
  selector:
    app: redis                                                                      #定义Service的标签,用于将服务与 StatefulSet 关联

---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: statefulset-redis
  namespace: default
  labels:
    app: redis                                                                      #定义StatefulSet的标签,用于将 StatefulSet 与其 Service 关联。

spec:                                                                               #定义ReplicaSet信息
  selector:
    matchLabels:
      app: redis                                                                    #用于匹配后端 Pod 的标签
  serviceName: "service-redis"                                                      #关联的服务(Service)名称,用于 Pod 的端口映射
  replicas: 3                                                                       #用于定义 StatefulSet 中的 Pod 副本数量
  template:
    metadata:
      labels:
        app: redis                                                                  #用于匹配后端 Pod 的标签

    spec:                                                                           #定义容器的信息
      containers:
        - name: redis                                                               #定义Pod中容器的名称
          image: registry.cn-beijing.aliyuncs.com/publicspaces/redis:6.2.6          #定义Pod创建容器使用的镜像
          imagePullPolicy: IfNotPresent                                             #定义Pod拉取镜像的策略
          ports:
            - containerPort: 6379                                                   #定义Pod中容器的端口号
              name: redis-port                                                      #定义Pod中容器端口的名称,用于与 Service 中的端口名称匹配
      restartPolicy: Always                                                         #定义Pod中容器退出时是否重启
  updateStrategy:                                                                   #定义StatefulSet的更新模式
    rollingUpdate:                                                                  #定义StatefulSet为滚动更新
      partition: 0                                                                  #指定在滚动更新期间不更新的 Pod 的数量,一个 StatefulSet 有 10 个 Pod,并且设置了 partition: 5,那么前 5 个 Pod 将不会参与更新,而剩下的 5 个 Pod 将逐步滚动更新。partition 被设置为 0,这意味着所有 Pod 都将参与滚动更新。
      maxUnavailable: 25%                                                           #指定在滚动更新时,最大不可以副本数量
    type: RollingUpdate                                                             #指定 StatefulSet 的更新策略类型

创建StatefulSet

kubectl create -f statefulset-pod-redis.yaml

验证网络标识的访问

  • 创建busybox容器
apiVersion: v1
kind: Pod
metadata:
  name: busybox
  namespace: default

spec:
  containers:
    - name: busybox
      image: registry.cn-beijing.aliyuncs.com/publicspaces/busybox:1.28.0
      imagePullPolicy: IfNotPresent
      command:
        - sleep
        - "3600"
  restartPolicy: Always
  • 组合网络标识符
#格式
StatefulSet的Pod名称.Service的名称.namespace的名称.域地址
#域地址一般不变:svc.cluster.local

#举例
statefulset-redis-0.service-redis.default.svc.cluster.local
  • 验证网络标识符
kubectl exec -it busybox -- sh

# / # nslookup statefulset-redis-0.service-redis
# Server:    10.96.0.10
# Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local

# Name:      statefulset-redis-0.service-redis
# Address 1: 83.12.61.219 statefulset-redis-0.service-redis.default.svc.cluster.local

扩容和缩容

概述

  • StatefulSet的扩容
    • 各个Pod依次启动,当第一个Pod启动后才启动第二个Pod。
    • 如果已启动的Pod故障,则需要等待故障Pod启动后才会启动后续的Pod。
  • StatefulSet的缩容
    • 各个Pod依次删除,与启动顺序刚好相反,先删除最后一个Pod,才会删除倒数第二个Pod。
    • 如果在删除最后一个Pod时倒数第二个Pod故障,则最后一个Pod将停止删除操作,等到故障Pod恢复后再进行删除。

扩容

  • 临时扩容
kubectl scale statefulset statefulset-redis --replicas=6 --record
  • 永久扩容
apiVersion: v1
kind: Service
metadata:
  name: service-redis
  namespace: default
  labels:
    app: redis

spec:
  ports:
    - port: 6379                                                                    #定义Service的端口号
      name: redis-port                                                              #定义端口的名称,用于与StatefulSet的Pod中端口名称匹配
  clusterIP: None                                                                   #指定服务不需要一个集群 IP,这意味着它不会分配一个固定的 IP 地址
  selector:
    app: redis                                                                      #定义Service的标签,用于将服务与 StatefulSet 关联

---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: statefulset-redis
  namespace: default
  labels:
    app: redis                                                                      #定义StatefulSet的标签,用于将 StatefulSet 与其 Service 关联。

spec:                                                                               #定义ReplicaSet信息
  selector:
    matchLabels:
      app: redis                                                                    #用于匹配后端 Pod 的标签
  serviceName: "service-redis"                                                      #关联的服务(Service)名称,用于 Pod 的端口映射
  replicas: 6                                                                       #用于定义 StatefulSet 中的 Pod 副本数量
  template:
    metadata:
      labels:
        app: redis                                                                  #用于匹配后端 Pod 的标签

    spec:                                                                           #定义容器的信息
      containers:
        - name: redis                                                               #定义Pod中容器的名称
          image: registry.cn-beijing.aliyuncs.com/publicspaces/redis:6.2.6          #定义Pod创建容器使用的镜像
          imagePullPolicy: IfNotPresent                                             #定义Pod拉取镜像的策略
          ports:
            - containerPort: 6379                                                   #定义Pod中容器的端口号
              name: redis-port                                                      #定义Pod中容器端口的名称,用于与 Service 中的端口名称匹配
      restartPolicy: Always                                                         #定义Pod中容器退出时是否重启
  updateStrategy:                                                                   #定义StatefulSet的更新模式
    rollingUpdate:                                                                  #定义StatefulSet为滚动更新
      partition: 0                                                                  #指定在滚动更新期间不更新的 Pod 的数量,一个 StatefulSet 有 10 个 Pod,并且设置了 partition: 5,那么前 5 个 Pod 将不会参与更新,而剩下的 5 个 Pod 将逐步滚动更新。partition 被设置为 0,这意味着所有 Pod 都将参与滚动更新。
      maxUnavailable: 25%                                                           #指定在滚动更新时,最大不可以副本数量
    type: RollingUpdate                                                             #指定 StatefulSet 的更新策略类型

然后执行命令“kubectl replace -f statefulset-pod-redis.yaml”

缩容

  • 临时扩容
kubectl scale statefulset statefulset-redis --replicas=1 --record
  • 永久扩容
apiVersion: v1
kind: Service
metadata:
  name: service-redis
  namespace: default
  labels:
    app: redis

spec:
  ports:
    - port: 6379                                                                    #定义Service的端口号
      name: redis-port                                                              #定义端口的名称,用于与StatefulSet的Pod中端口名称匹配
  clusterIP: None                                                                   #指定服务不需要一个集群 IP,这意味着它不会分配一个固定的 IP 地址
  selector:
    app: redis                                                                      #定义Service的标签,用于将服务与 StatefulSet 关联

---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: statefulset-redis
  namespace: default
  labels:
    app: redis                                                                      #定义StatefulSet的标签,用于将 StatefulSet 与其 Service 关联。

spec:                                                                               #定义ReplicaSet信息
  selector:
    matchLabels:
      app: redis                                                                    #用于匹配后端 Pod 的标签
  serviceName: "service-redis"                                                      #关联的服务(Service)名称,用于 Pod 的端口映射
  replicas: 1                                                                       #用于定义 StatefulSet 中的 Pod 副本数量
  template:
    metadata:
      labels:
        app: redis                                                                  #用于匹配后端 Pod 的标签

    spec:                                                                           #定义容器的信息
      containers:
        - name: redis                                                               #定义Pod中容器的名称
          image: registry.cn-beijing.aliyuncs.com/publicspaces/redis:6.2.6          #定义Pod创建容器使用的镜像
          imagePullPolicy: IfNotPresent                                             #定义Pod拉取镜像的策略
          ports:
            - containerPort: 6379                                                   #定义Pod中容器的端口号
              name: redis-port                                                      #定义Pod中容器端口的名称,用于与 Service 中的端口名称匹配
      restartPolicy: Always                                                         #定义Pod中容器退出时是否重启
  updateStrategy:                                                                   #定义StatefulSet的更新模式
    rollingUpdate:                                                                  #定义StatefulSet为滚动更新
      partition: 0                                                                  #指定在滚动更新期间不更新的 Pod 的数量,一个 StatefulSet 有 10 个 Pod,并且设置了 partition: 5,那么前 5 个 Pod 将不会参与更新,而剩下的 5 个 Pod 将逐步滚动更新。partition 被设置为 0,这意味着所有 Pod 都将参与滚动更新。
      maxUnavailable: 25%                                                           #指定在滚动更新时,最大不可以副本数量
    type: RollingUpdate                                                             #指定 StatefulSet 的更新策略类型

然后执行命令“kubectl replace -f statefulset-pod-redis.yaml”

更新和回滚

概述

在StatefulSet的更新策略有两种,分别是:滚动更新(RollingUpdate)和删除更新(OnDelete)
默认情况下,StatefulSet 使用 RollingUpdate 策略。

  • 滚动更新(RollingUpdate)
    • 逐步更新 StatefulSet 中的 Pod,而不是一次性替换所有 Pod。
    • 有助于减少服务中断,并确保 Pod 的顺序保持不变。
  • 删除更新(OnDelete)
    • 删除一个 Pod 时,它会自动创建一个新的 Pod。
    • 通常用于无状态服务,它不保证 Pod 的顺序,也不支持 RollingUpdate 中的其他特性。
    • 注意:只有删除Pod时才会更新Pod。

可更新内容

StatefulSet的可更新内容与Deployment基本一样,但kubectl set不支持StatefulSet的操作,可以通过yaml文件进行更新。

  1. 镜像版本
  • 更新 StatefulSet 对象中的 spec.template.spec.containers.image 字段,以指定新的容器镜像版本。
  1. 副本数
  • 更新 StatefulSet 对象中的 spec.replicas 字段,以指定副本的数量。
  1. 资源请求和限制:
  • 更新 StatefulSet 对象中的 spec.template.spec.containers.resources 字段,以更改容器的资源请求(如 CPU、内存)和资源限制。
  1. 环境变量
  • 更新 StatefulSet 对象中的 spec.template.spec.containers.env 字段,以添加、删除或更改容器环境变量。
  1. 配置文件
  • 更新 StatefulSet 对象中的 spec.template.spec.containers.volumeMounts 和 spec.template.spec.volumes 字段,以挂载新的配置文件或更改现有配置文件的路径。
  1. 服务端口
  • 更新 StatefulSet 对象中的 spec.template.spec.containers.ports 字段。
  1. 重启策略
  • 更新 StatefulSet 对象中的 spec.template.spec.restartPolicy 字段,以更改容器的重启策略。

更新

  • 滚动更新形式-更新镜像
apiVersion: v1
kind: Service
metadata:
  name: service-redis
  namespace: default
  labels:
    app: redis

spec:
  ports:
    - port: 6379                                                                    #定义Service的端口号
      name: redis-port                                                              #定义端口的名称,用于与StatefulSet的Pod中端口名称匹配
  clusterIP: None                                                                   #指定服务不需要一个集群 IP,这意味着它不会分配一个固定的 IP 地址
  selector:
    app: redis                                                                      #定义Service的标签,用于将服务与 StatefulSet 关联

---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: statefulset-redis
  namespace: default
  labels:
    app: redis                                                                      #定义StatefulSet的标签,用于将 StatefulSet 与其 Service 关联。

spec:                                                                               #定义ReplicaSet信息
  selector:
    matchLabels:
      app: redis                                                                    #用于匹配后端 Pod 的标签
  serviceName: "service-redis"                                                      #关联的服务(Service)名称,用于 Pod 的端口映射
  replicas: 1                                                                       #用于定义 StatefulSet 中的 Pod 副本数量
  template:
    metadata:
      labels:
        app: redis                                                                  #用于匹配后端 Pod 的标签

    spec:                                                                           #定义容器的信息
      containers:
        - name: redis                                                               #定义Pod中容器的名称
          image: registry.cn-beijing.aliyuncs.com/publicspaces/redis:6.2.13          #定义Pod创建容器使用的镜像
          imagePullPolicy: IfNotPresent                                             #定义Pod拉取镜像的策略
          ports:
            - containerPort: 6379                                                   #定义Pod中容器的端口号
              name: redis-port                                                      #定义Pod中容器端口的名称,用于与 Service 中的端口名称匹配
      restartPolicy: Always                                                         #定义Pod中容器退出时是否重启
  updateStrategy:                                                                   #定义StatefulSet的更新模式
    rollingUpdate:                                                                  #定义StatefulSet为滚动更新
      partition: 0                                                                  #指定在滚动更新期间不更新的 Pod 的数量,一个 StatefulSet 有 10 个 Pod,并且设置了 partition: 5,那么前 5 个 Pod 将不会参与更新,而剩下的 5 个 Pod 将逐步滚动更新。partition 被设置为 0,这意味着所有 Pod 都将参与滚动更新。
      maxUnavailable: 25%                                                           #指定在滚动更新时,最大不可以副本数量
    type: RollingUpdate                                                             #指定 StatefulSet 的更新策略类型
  • 更新StatefulSet
kubectl replace -f statefulset-pod-redis.yaml

回滚

  • 查看历史部署版本信息
kubectl rollout history statefulset statefulset-redis

#statefulset-redis:查看某个statefulset的历史版本
  • 查看指定版本的详细信息
kubectl rollout history statefulset statefulset-redis --revision=1

#--revision=1:指定版本号回滚
  • 回滚到上一次版本部署
kubectl rollout undo statefulset statefulset-redis
  • 回滚到指定版本的部署
kubectl rollout undo statefulset statefulset-redis --to-revision=1

灰度发布

概述

  • 简介

灰度发布(Gray Release)又称为金丝雀发布是一种流行的发布策略,是在黑与白之间,能够平滑过渡的一种发布方式。
灰度发布是逐步将新版本的软件推送到生产环境中,同时保持旧版本的一部分仍然在线,以便监控新版本的性能和稳定性。如果新版本表现良好,你可以逐步增加其比例,直到完全替换旧版本。
在kubernetes中可以使用StatefulSet来实现灰度发布。

  • 关键点
  updateStrategy:
    rollingUpdate:
      partition: 3    #手动指定前3个pod不更新

发布

  • 编辑yaml
apiVersion: v1
kind: Service
metadata:
  name: service-redis
  namespace: default
  labels:
    app: redis

spec:
  ports:
    - port: 6379                                                                    #定义Service的端口号
      name: redis-port                                                              #定义端口的名称,用于与StatefulSet的Pod中端口名称匹配
  clusterIP: None                                                                   #指定服务不需要一个集群 IP,这意味着它不会分配一个固定的 IP 地址
  selector:
    app: redis                                                                      #定义Service的标签,用于将服务与 StatefulSet 关联

---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: statefulset-redis
  namespace: default
  labels:
    app: redis                                                                      #定义StatefulSet的标签,用于将 StatefulSet 与其 Service 关联。

spec:                                                                               #定义ReplicaSet信息
  selector:
    matchLabels:
      app: redis                                                                    #用于匹配后端 Pod 的标签
  serviceName: "service-redis"                                                      #关联的服务(Service)名称,用于 Pod 的端口映射
  replicas: 7                                                                       #用于定义 StatefulSet 中的 Pod 副本数量
  template:
    metadata:
      labels:
        app: redis                                                                  #用于匹配后端 Pod 的标签

    spec:                                                                           #定义容器的信息
      containers:
        - name: redis                                                               #定义Pod中容器的名称
          image: registry.cn-beijing.aliyuncs.com/publicspaces/redis:6.2.13         #定义Pod创建容器使用的镜像
          imagePullPolicy: IfNotPresent                                             #定义Pod拉取镜像的策略
          ports:
            - containerPort: 6379                                                   #定义Pod中容器的端口号
              name: redis-port                                                      #定义Pod中容器端口的名称,用于与 Service 中的端口名称匹配
      restartPolicy: Always                                                         #定义Pod中容器退出时是否重启
  updateStrategy:                                                                   #定义StatefulSet的更新模式
    rollingUpdate:                                                                  #定义StatefulSet为滚动更新
      partition: 3                                                                  #指定在滚动更新期间不更新的 Pod 的数量,一个 StatefulSet 有 10 个 Pod,并且设置了 partition: 5,那么前 5 个 Pod 将不会参与更新,而剩下的 5 个 Pod 将逐步滚动更新。partition 被设置为 0,这意味着所有 Pod 都将参与滚动更新。
      maxUnavailable: 25%                                                           #指定在滚动更新时,最大不可以副本数量
    type: RollingUpdate                                                             #指定 StatefulSet 的更新策略类型
  • 灰度发布
kubectl replace -f statefulset-pod-redis.yaml

检查

  • 查看更新的image版本
kubectl get pod -o yaml | grep image | grep redis
    - image: registry.cn-beijing.aliyuncs.com/publicspaces/redis:6.2.6
      image: registry.cn-beijing.aliyuncs.com/publicspaces/redis:6.2.6
      imageID: docker-pullable://registry.cn-beijing.aliyuncs.com/publicspaces/redis@sha256:563888f63149e3959860264a1202ef9a644f44ed6c24d5c7392f9e2262bd3553
    - image: registry.cn-beijing.aliyuncs.com/publicspaces/redis:6.2.6
      image: registry.cn-beijing.aliyuncs.com/publicspaces/redis:6.2.6
      imageID: docker-pullable://registry.cn-beijing.aliyuncs.com/publicspaces/redis@sha256:563888f63149e3959860264a1202ef9a644f44ed6c24d5c7392f9e2262bd3553
    - image: registry.cn-beijing.aliyuncs.com/publicspaces/redis:6.2.6
      image: registry.cn-beijing.aliyuncs.com/publicspaces/redis:6.2.6
      imageID: docker-pullable://registry.cn-beijing.aliyuncs.com/publicspaces/redis@sha256:563888f63149e3959860264a1202ef9a644f44ed6c24d5c7392f9e2262bd3553
    - image: registry.cn-beijing.aliyuncs.com/publicspaces/redis:6.2.13
    - image: registry.cn-beijing.aliyuncs.com/publicspaces/redis:6.2.13
    - image: registry.cn-beijing.aliyuncs.com/publicspaces/redis:6.2.13
      image: registry.cn-beijing.aliyuncs.com/publicspaces/redis:6.2.13
      imageID: docker-pullable://registry.cn-beijing.aliyuncs.com/publicspaces/redis@sha256:93cb2d8d25931a096c065f3dfa701531361caa4325f642bac33e7d5a7e4ccaaa
    - image: registry.cn-beijing.aliyuncs.com/publicspaces/redis:6.2.13
      image: registry.cn-beijing.aliyuncs.com/publicspaces/redis:6.2.13
      imageID: docker-pullable://registry.cn-beijing.aliyuncs.com/publicspaces/redis@sha256:93cb2d8d25931a096c065f3dfa701531361caa4325f642bac33e7d5a7e4ccaaa
    - image: registry.cn-beijing.aliyuncs.com/publicspaces/redis:6.2.13
      image: registry.cn-beijing.aliyuncs.com/publicspaces/redis:6.2.13
      imageID: docker-pullable://registry.cn-beijing.aliyuncs.com/publicspaces/redis@sha256:93cb2d8d25931a096c065f3dfa701531361caa4325f642bac33e7d5a7e4ccaaa

级联删除和非级联删除

概念

  • 级联删除

默认情况下,StatefulSet 资源支持级联删除。这意味着当删除 StatefulSet 时,它会自动删除所有关联的 Pod。
级联删除是 StatefulSet 的一个重要特性,因为它确保了 Pod 与其在 StatefulSet 中的顺序一致,并且在删除 Pod 时不会留下不完整的数据或状态。

  • 非级联删除

非级联删除是一种可选的删除行为,它允许你在删除 StatefulSet 时保留其 Pod。
需要手动处理 Pod 的删除,例如,在删除 StatefulSet 之前,你可能需要先备份数据。
希望保留 Pod 以便进行调试或故障排查。
要启用非级联删除,你需要在 StatefulSetspec 中设置 spec.orphanDependents 字段为 true

  • 注意

删除StatefulSet后,原StatefulSet管理的Pod变成了孤儿Pod。此时删除Pod是不会自动创建新Pod。

操作

  • 非级联删除
kubectl delete statefulsets.apps statefulset-redis --cascade=false

检查

  • 查看StatefulSet
kubectl get statefulset
  • 查看Pod
kubectl get pod
  • 删除孤儿pod
kubectl delete pod statefulset-redis-0 statefulset-redis-1 statefulset-redis-2 statefulset-redis-3 statefulset-redis-4

守护进程服务

简介

什么是守护进程服务

守护进程服务(DaemonSet)是一种特殊类型的工作负载,用于确保在集群中的每个节点(Node)上运行一个 Pod 的副本。
守护进程服务通常用于运行系统级后台任务或提供节点级别的服务。

守护进程服务的特点

  1. 每个节点一个 Pod:守护进程服务确保在集群中的每个节点上只运行一个指定 Pod 的副本。当新节点加入集群时,守护进程服务会自动在新节点上部署 Pod;当节点从集群中移除时,相应的 Pod 也会被删除。
  2. 系统级服务:守护进程服务通常用于运行系统级别的任务,例如日志收集、监控代理、网络插件或存储插件。
  3. 节点级操作:守护进程服务可以访问节点的文件系统、网络配置和其他资源,因为它与节点紧密耦合。
  4. 资源管理:守护进程服务可以配置资源请求和限制,确保节点上的系统级服务有足够的资源运行。
  5. 更新和回滚:守护进程服务支持滚动更新,允许管理员更新守护进程服务的 Pod,同时保持服务的可用性。如果更新过程中出现问题,也可以回滚到之前的版本。

常见守护进程服务

  • 日志收集:部署日志收集代理,如 Fluentd 或 Logstash,在每个节点上收集容器的日志数据。
  • 监控代理:运行监控代理,如 Prometheus Node Exporter,在每个节点上收集系统级别的监控数据。
  • 存储管理:部署存储解决方案的守护进程,如 GlusterFS 或 Ceph,来管理节点的存储资源。
  • 网络插件:运行网络插件,如 Calico 或 Flannel,以提供集群内的网络连接和策略。

什么是DaemonSet

DaemonSet是kubernetes中一种工作负载控制器,用于确保在集群中的每个节点上都运行一个 Pod 的副本。
DaemonSet通常用于运行系统级别的后台任务或提供节点级别的服务,如日志收集、监控代理、网络插件或存储插件。

DaemonSet的特点和用途

  1. 每个节点一个 Pod:DaemonSet 确保在集群中的每个节点上只运行一个指定 Pod 的副本。当新节点加入集群时,DaemonSet 会自动在新节点上部署 Pod;当节点从集群中移除时,相应的 Pod 也会被删除。
  2. 系统级服务:DaemonSet 通常用于运行系统级别的任务,例如日志收集、监控代理、网络插件或存储插件。
  3. 节点级操作:DaemonSet 可以访问节点的文件系统、网络配置和其他资源,因为它与节点紧密耦合。
  4. 资源管理:DaemonSet 可以配置资源请求和限制,确保节点上的系统级服务有足够的资源运行。
  5. 更新和回滚:DaemonSet 支持滚动更新,允许管理员更新 DaemonSet,同时保持服务的可用性。如果更新过程中出现问题,也可以回滚到之前的版本。

注意:

  1. DaemonSet可以在所有Node节点或匹配标签的Node节点上部署Pod。
  2. DaemonSet在每个节点上只能部署一个Pod,所以不能设置replicas。
  3. DaemonSet在滚动更新时,是先删除原Pod在新建Pod,建议使用OnDelete删除策略。

创建DaemonSet

编辑yaml

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: daemonset-nginx
  namespace: default
  labels:
    app: nginx
    type: web

spec:
  revisionHistoryLimit: 10
  updateStrategy:
    rollingUpdate:
      maxUnavailable: 1                                                           #注意:此处建议使用数字形式,建议配置为1,影响范围最小
    type: OnDelete
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx-web
          imagePullPolicy: IfNotPresent
          image: registry.cn-beijing.aliyuncs.com/publicspaces/nginx:1.22.1

创建DaemonSet

  • 创建DaemonSet
kubectl create -f daemonset-pod-nginx.yaml
  • 查看部署情况
ubectl get pod -owide

匹配标签yaml

  • Node创建标签
kubectl label nodes k8s-02 k8s-03 daemonset=nginx
  • 查看标签
kubectl get nodes --show-labels
  • 配置yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: daemonset-nginx
  namespace: default
  labels:
    app: nginx
    type: web

spec:
  revisionHistoryLimit: 10
  updateStrategy:
    rollingUpdate:
      maxUnavailable: 1                                                           #注意:此处建议使用数字形式
    type: OnDelete
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      nodeSelector:
        daemonset: "nginx"                                                        #注意:此处为标签信息,与容器同级。且标签的Key是字符串形式
      containers:
        - name: nginx-web
          imagePullPolicy: IfNotPresent
          image: registry.cn-beijing.aliyuncs.com/publicspaces/nginx:1.22.1
  • 更新DaemonSet
kubectl replace -f daemonset-pod-nginx.yaml
  • 查看Pod运行情况
kubectl get pod -owide
  • 增加节点
#哪个节点需要部署DaemonSet的Pod,就在那台Node节点上添加标签即可。DaemonSet会自动在该Node上创建节点。
kubectl label nodes k8s-04 daemonset=nginx

更新和回滚

可更新内容

DaemonSet的可更新内容与Deployment基本一样,同样可以使用kubectl set和yaml两种方式进行更新。

  1. 镜像版本
  • 更新 StatefulSet 对象中的 spec.template.spec.containers.image 字段,以指定新的容器镜像版本。
  1. 副本数
  • 更新 StatefulSet 对象中的 spec.replicas 字段,以指定副本的数量。
  1. 资源请求和限制:
  • 更新 StatefulSet 对象中的 spec.template.spec.containers.resources 字段,以更改容器的资源请求(如 CPU、内存)和资源限制。
  1. 环境变量
  • 更新 StatefulSet 对象中的 spec.template.spec.containers.env 字段,以添加、删除或更改容器环境变量。
  1. 配置文件
  • 更新 StatefulSet 对象中的 spec.template.spec.containers.volumeMounts 和 spec.template.spec.volumes 字段,以挂载新的配置文件或更改现有配置文件的路径。
  1. 服务端口
  • 更新 StatefulSet 对象中的 spec.template.spec.containers.ports 字段。
  1. 重启策略
  • 更新 StatefulSet 对象中的 spec.template.spec.restartPolicy 字段,以更改容器的重启策略。

更新

  • 手动更新
  kubectl set image daemonset daemonset-nginx nginx-web=registry.cn-beijing.aliyuncs.com/publicspaces/nginx:1.22.5 --record=true
  • ymal更新
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: daemonset-nginx
  namespace: default
  labels:
    app: nginx
    type: web

spec:
  revisionHistoryLimit: 10
  updateStrategy:
    rollingUpdate:
      maxUnavailable: 1                                                           #注意:此处建议使用数字形式
    type: RollingUpdate
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx-web
          imagePullPolicy: IfNotPresent
          image: registry.cn-beijing.aliyuncs.com/publicspaces/nginx:1.22.5
kubectl replace -f daemonset-pod-nginx.yaml
  • 查看更新
kubectl get daemonsets.apps daemonset-nginx -owide

回滚

  • 查看历史部署版本信息
kubectl rollout history daemonset daemonset-nginx

#daemonset-nginx:查看某个daemonset的历史版本
  • 查看指定版本的详细信息
kubectl rollout history daemonset daemonset-nginx --revision=1

#--revision=1:指定版本号回滚
  • 回滚到上一次版本部署
kubectl rollout undo daemonset daemonset-nginx
  • 回滚到指定版本的部署
kubectl rollout undo daemonset daemonset-nginx --to-revision=1

HPA自动扩缩容

简介

什么是HPA

HPA 指的是 Kubernetes 的自动扩缩容(Horizontal Pod Autoscaler)功能。
HPA可以根据应用程序的负载自动调整 Pod 的副本数量。
HPA 会监控你指定的指标(如 CPU 使用率或内存使用率),并根据这些指标自动增加或减少 Pod 的副本数。

主要特点和用途

  1. 自动缩放:HPA 可以根据应用程序的负载自动增加或减少 Pod 的副本数量。这意味着你不需要手动调整 Pod 的副本数,HPA 会根据负载自动调整。
  2. 基于指标的缩放:HPA 支持多种指标,包括 CPU 使用率、内存使用率、请求量和响应时间。你可以根据这些指标设置缩放规则。
  3. 可配置的缩放规则:你可以设置 HPA 的缩放规则,包括目标 CPU 使用率、目标副本数、缩放因子等。这些规则可以帮助你根据负载自动调整 Pod 的副本数。
  4. 多维度缩放:HPA 支持多维度缩放,这意味着你可以根据不同的指标设置不同的缩放规则。这有助于提高应用程序的性能和可用性。
  5. 支持多种工作负载:HPA 支持多种工作负载,包括 Deployment、StatefulSet 和 ReplicaSet。这意味着你可以将 HPA 应用于不同的 Kubernetes 资源。

注意:

  1. HPA是基于metrics-server的监控值与Pod定义的requests值对比实现自动扩缩容。
  2. yaml中必须定义requests参数。
  3. 必须安装metrics-server。

作用范围

  • 适用对象
    • **Deployment:**HPA 可以自动根据 Deployment 中 Pod 的 CPU 或内存使用情况来调整 Deployment 中 Pod 的副本数量。
    • **ReplicaSet:**HPA 可以根据 ReplicaSet 中 Pod 的 CPU 或内存使用情况来调整 Pod 的副本数量。
    • StatefulSet:HPA可以根据 StatefulSet 中 Pod 的 CPU 或内存使用情况来调整 Pod 的副本数量。
    • **replicationcontroller:**HPA可以根据 ReplicationController 中 Pod 的 CPU 或内存使用情况来调整 Pod 的副本数量。
  • 不适应对象
    • **DaemonSet:**通常不需要根据资源使用情况来调整副本数量。
    • **Job和CronJob:**Job 和 CronJob 通常是为了执行一次性或周期性的任务,因此它们的 Pod 数量通常是固定的。

常见应用场景

  1. 弹性伸缩:当应用程序的负载变化时,HPA 可以根据预设的规则自动增加或减少 Pod 的副本数,以保证应用程序的性能和可扩展性。
  2. 应对突发流量:在应对突发流量时,HPA 可以快速增加 Pod 的副本数,以处理大量的并发请求,从而保证应用程序的稳定性和可用性。
  3. 负载均衡:HPA 可以自动根据负载情况调整 Pod 的副本数,从而实现负载均衡,避免某些 Pod 因为过载而影响整个应用程序的性能。
  4. 资源优化:通过自动调整 Pod 的副本数,HPA 可以优化资源的使用,避免资源浪费,同时保证应用程序的性能。
  5. 持续集成/持续部署(CI/CD):在 CI/CD 过程中,HPA 可以自动调整 Pod 的副本数,以适应不同的测试和部署阶段。
  6. 故障转移和自我修复:当一个 Pod 失败时,HPA 可以自动增加副本数,以恢复服务,从而保证应用程序的可用性和稳定性。
  7. 多维度缩放:HPA 支持多维度缩放,可以根据不同的指标(如 CPU 使用率、内存使用率、请求量和响应时间)设置不同的缩放规则,从而提高应用程序的性能和可用性。
  8. 动态资源调整:在应用程序的性能需求发生变化时,HPA 可以自动调整 Pod 的资源请求和限制,以适应新的需求。
  9. 多云和混合云环境:在多云和混合云环境中,HPA 可以跨不同环境自动调整 Pod 的副本数,以实现资源的优化和统一管理。
  10. 微服务架构:在微服务架构中,HPA 可以针对每个服务自动调整 Pod 的副本数,从而实现微服务的独立部署和扩展。

应用

以Deployment对象为例。

部署metrics-server

  • 下载配置文件
wget https://github.com/kubernetes-sigs/metrics-server/releases/download/v0.6.0/components.yaml
  • 调整镜像地址
sed -i 's#k8s.gcr.io/metrics-server/metrics-server:v0.6.0#registry.aliyuncs.com/google_containers/metrics-server:v0.6.0#g' components.yaml
  • 部署服务
kubectl create -f components.yaml
  • 验证服务
kubectl top node

基于CPU动态扩缩容-手动

  • 编译yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  namespace: default
  name: deployment-nginx
  labels:
    app: nginx
    type: web
    version: v1

spec:
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx-web
          image: registry.cn-beijing.aliyuncs.com/publicspaces/nginx:1.22.5
          imagePullPolicy: IfNotPresent
          resources:
            limits:
              cpu: 1000m
              memory: 1024Mi
            requests:
              cpu: 100m
              memory: 512Mi
      restartPolicy: Always
  replicas: 3
  • 命令实现自动扩缩容
kubectl autoscale deployment deployment-nginx --cpu-percent=10 --min=2 --max=7

#解释
#deployment-nginx:指定自动扩缩容的deployment名称
#--cpu-percent=10:指定cpu的百分比,此处指定当CPU使用率超过10%时开启自动扩容
#--min=2:指定deployment空闲时最少缩容的Pod数量
#--max=7:指定deployment繁忙时最多扩容的Pod数量
  • 查看资源占比
kubectl get hpa

基于CPU动态扩缩容-yaml

  • yaml文件实现自动扩缩容
apiVersion: apps/v1
kind: Deployment
metadata:
  namespace: default
  name: deployment
  labels:
    app: nginx

spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx-web
          imagePullPolicy: IfNotPresent
          image: registry.cn-beijing.aliyuncs.com/publicspaces/nginx:1.23.
          resources:
            limits:
              cpu: 1000m
              memory: 1024Mi
            requests:
              cpu: 10m
              memory: 512Mi
      restartPolicy: Always


---
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
  name: hpa-nginx
  namespace: default
  labels:
    app: hpa

spec:
  maxReplicas: 7
  minReplicas: 2
  targetCPUUtilizationPercentage: 50
  scaleTargetRef:
    kind: Deployment
    name: deployment-nginx
  • 创建Deployment
kubectl create -f hpa-deployment-pod-nginx.yaml
  • 查看资源占比
kubectl get hpa
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值