Controller作用及分类

controller用于控制pod

控制器主要分为:

  • Deployments 部署无状态应用,控制pod升级,回退

  • ReplicaSet 副本集,控制pod扩容,裁减

  • ReplicationController(相当于ReplicaSet的老版本,现在建议使用Deployments加ReplicaSet替代RC)

  • StatefulSets 部署有状态应用,结合Service、存储等实现对有状态应用部署

  • DaemonSet 守护进程集,运行在所有集群节点(包括master), 比如使用filebeat,node_exporter

  • Jobs 一次性

  • Cronjob 周期性

Deployment

创建deployment类型应用

apiVersion: apps/v1
kind: Deployment
metadata:
  name: deploy-nginx            # deployment名
spec:                
  replicas: 1                    # 副本集,deployment里使用了replicaset
  selector:
    matchLabels:
      app: nginx                # 匹配的pod标签,表示deployment和rs控制器控制带有此标签的pod
  template:                        # 代表pod的配置模板
    metadata:
      labels:
        app: nginx                # pod的标签
    spec:
      containers:                # 以下为pod里的容器定义
      - name: nginx
        image: nginx:1.15-alpine
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80

版本升级

kubectl set image deployment deploy-nginx nginx=nginx:1.16-alpine --record

--record  表示会记录下来

版本回退

1, 查看版本历史信息
kubectl rollout history deployment deploy-nginx
2, 定义要回退的版本(还需要执行才是真的回退版本)
kubectl rollout history deployment deploy-nginx --revision=1
3, 执行回退
kubectl rollout undo deployment deploy-nginx --to-revision=1

副本扩容

kubectl scale deployment deploy-nginx --replicas=2

副本裁减

kubectl scale deployment deploy-nginx --replicas=1

滚动更新

更新策略

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

删除式更新

1.杀死所有旧版本的Pod,此时Pod无法正常对外提供服务; 2.创建新的RS,启动新的Pod; 3.等待Pod就绪,对外提供服务;

apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployment-nginx-test
  namespace: default
spec:
  strategy:         # 滚动更新策略
    type: Recreate  # Recreate表示的是删除式更新,也称为单批次更新;
  replicas: 2
  selector:
    matchLabels:
      app: nginx-deployment

  template:
    metadata:
      labels:
        app: nginx-deployment
    spec:
      containers:
      - name: nginx
        image: nginx:1.16
        imagePullPolicy: IfNotPresent
        ports:
        - name: http
          containerPort: 80

滚动更新

滚动更新时,应用升级期间还要确保可用的Pod对象数量不低于阈值以确保可用持续处理客户端的服务请求,变动的方式和Pod对象的数量范围将通过spec.strategy.rollingUpdate.maxSurge和spec.strategy.rollingUpdate.maxUnavailable两个属性同时进行定义

1.创建新的RS,然后根据新的镜像运行新的Pod。

2.删除旧的Pod,启动新的Pod,当新Pod就绪后,继续删除旧Pod,启动新Pod。

3.持续第二步过程,一直到所有Pod都被更新成功。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployment-nginx-test
  namespace: default
spec:
  strategy:
    type: RollingUpdate
  replicas: 2
  selector:
    matchLabels:
      app: nginx-deployment

  template:
    metadata:
      labels:
        app: nginx-deployment
    spec:
      containers:
      - name: nginx
        image: nginx:1.16
        imagePullPolicy: IfNotPresent
        ports:
        - name: http
          containerPort: 80

滚动更新参数

maxUnavailable (最大不可用数)
    定义:在更新过程中,允许不可用的Pod的最大数量或百分比
    作用:控制更新速度,值越大更新越快但风险越高
    示例值:数字(如1)或百分比(如25%)
    默认值:25%
maxSurge (最大峰值数)
    定义:在更新过程中,允许创建的超过期望副本数的Pod的最大数量或百分比
    作用:控制资源使用,值越大更新越快但消耗资源越多
    示例值:数字(如1)或百分比(如25%)
    默认值:25%
通用场景:    
rollingUpdate:
  maxUnavailable: 25%
  maxSurge: 25%

DaemonSet

DaemonSet介绍

  • DaemonSet能够让所有(或者特定)的节点运行同一个pod。

  • 当节点加入到K8S集群中,pod会被(DaemonSet)调度到该节点上运行,当节点从K8S集群中被移除,被DaemonSet调度的pod会被移除

  • 如果删除DaemonSet,所有跟这个DaemonSet相关的pods都会被删除。

  • 如果一个DaemonSet的Pod被杀死、停止、或者崩溃,那么DaemonSet将会重新创建一个新的副本在这台计算节点上。

  • DaemonSet一般应用于日志收集、监控采集、分布式存储守护进程等

DaemonSet应用案例

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: daemonset-nginx            
spec:
  selector:
    matchLabels:
      name: nginx-ds
  template:
    metadata:
      labels:
        name: nginx-ds
    spec:
      tolerations:                        # tolerations代表容忍
      - key: node-role.kubernetes.io/master  # 能容忍的污点key
        effect: NoSchedule   # kubectl explain pod.spec.tolerations查看(能容忍的污点effect)
      containers:
      - name: nginx
        image: nginx:1.15-alpine
        imagePullPolicy: IfNotPresent
        resources:    # resources资源限制是为了防止master节点的资源被占太多(根据实际情况配置)
          limits:
            memory: 100Mi
          requests:
            memory: 100Mi

Job

Job介绍

● 对于ReplicaSet而言,它希望pod保持预期数目、持久运行下去,除非用户明确删除,否则这些对象一直存在,它们针对的是耐久性任务,如web服务等。
● 对于非耐久性任务,比如压缩文件,任务完成后,pod需要结束运行,不需要pod继续保持在系统中,这个时候就要用到Job。
● Job负责批量处理短暂的一次性任务 (short lived one-off tasks),即仅执行一次的任务,它保证批处理任务的一个或多个Pod成功结束。

Job应用案例

apiVersion: batch/v1
kind: Job
metadata:
  name: mysql-dump
spec:
  template:
    metadata:
      name: mysql-dump
    spec:
      nodeName: k8s-master2
      containers:
      - name: mysql-dump
        image: mysql:5.7
        command: ["/bin/sh","-c","mysqldump --host=mysql-test -uroot -pabc123 --databases mysql > /root/mysql2022.sql"]
        volumeMounts:
        - mountPath: "/root"
          name: mysql-data
      restartPolicy: Never
      volumes:
      - name: mysql-data
        hostPath:
          path: /opt/mysqldump


其他参数:
spec:
  completions: 10                                               # 执行job的次数
  parallelism: 1                                                # 执行job的并发数
  template:
    metadata:

CronJob

CronJob介绍

  • 类似于Linux系统的crontab,在指定的时间周期运行相关的任务

  • 时间格式:分时日月周

CronJob应用案例

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: mysql-dump
spec:
  schedule: "*/1 * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          nodeName: worker02
          containers:
          - name: c1
            image: mysql:5.7
            command: ["/bin/sh","-c","mysqldump --host=mysql-test -uroot -pabc123 --databases mysql > /root/mysql`date +%Y%m%d%H%M`.sql"]
            volumeMounts:
              - name: mysql-data
                mountPath: "/root"
          restartPolicy: Never
          volumes:
            - name: mysql-data
              hostPath:
                path: /opt/mysqldump

StatefulSet

作用

  • StatefulSet 是用来管理有状态应用的控制器。

  • StatefulSet 用来管理某Pod集合的部署和扩缩, 并为这些 Pod 提供持久存储和持久标识符。

无状态应用与有状态应用

无状态应用

  • 如nginx

  • 请求本身包含了响应端为响应这一请求所需的全部信息。每一个请求都像首次执行一样,不会依赖之前的数据进行响应。

  • 不需要持久化的数据

  • 无状态应用的多个实例之间互不依赖,可以无序的部署、删除或伸缩

有状态应用

  • 如mysql

  • 前后请求有关联与依赖

  • 需要持久化的数据

  • 有状态应用的多个实例之间有依赖,不能相互替换:无论怎么调度,每个 Pod 都有一个永久不变的 ID。

特点

  • 稳定的、唯一的网络标识符。 (通过headless服务实现)

  • 稳定的、持久的存储。 (通过PV,PVC,storageclass实现)

  • 有序的、优雅的部署和缩放。

  • 有序的、自动的滚动更新。

创建StatefulSet应用

apiVersion: v1
kind: Service
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  ports:
  - port: 80
    name: web
  clusterIP: None                                   # 无头服务
  selector:
    app: nginx
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: web                                            # statefulset的名称
spec:
  serviceName: "nginx"
  replicas: 3                                        # 3个副本
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.15-alpine
        ports:
        - containerPort: 80
          name: web
        volumeMounts:
        - name: www
          mountPath: /usr/share/nginx/html
  volumeClaimTemplates:
  - metadata:
      name: www
    spec:
      accessModes: [ "ReadWriteOnce" ]
      storageClassName: "nfs-client"        # 与前面定义的storageclass名称对应
      resources:
        requests:
          storage: 1Gi

应用滚动更新

它将按照与 Pod 终止相同的顺序(从最大序号到最小序号)进行,每次更新一个 Pod。

StatefulSet可以使用partition参数来实现金丝雀更新,partition参数可以控制StatefulSet控制器更新的Pod。

kubectl patch sts web -p '{"spec":{"updateStrategy":{"rollingUpdate":{"partition":2}}}}'
使用patch参数来指定了StatefulSet控制器的partition参数为2,表示当更新时,只有Pod的编号大于等于2的才更新。
kubectl set image sts/web nginx=nginx:latest

如何实现全部更新呢?
kubectl patch sts web -p '{"spec":{"updateStrategy":{"rollingUpdate":{"partition":0}}}}'
kubectl set image sts/web nginx=nginx:latest

应用扩容与缩容

在StatefulSet扩容时,会创建一个新的Pod,该Pod与之前的所有Pod都是有顺序的,并且新Pod的序号最大。在缩容时,StatefulSet控制器删除的也是序号最大的Pod。

kubectl scale sts web --replicas=4

results matching ""

    No results matching ""