Pod控制器

pod按创建方式分类

自主式pod  //kubernetes直接创建出来的pod,删除之后不会重启
控制器创建的pod  //通过控制器创建的pod,删除之后还会重建

pod控制器分类

ReplicationController //已废弃,由ReplicaSet替代

ReplicaSet //保证指定数量的Pod运行,支持pod数量变更,镜像版本变更

Deployment //控制ReplicaSet来控制Pod,支持滚动升级,版本回退

Horizontal Pod Autoscaler //根据集群负载自动调整Pod数量,实现消峰填谷

DaemonSet //在集群中的指定Node上都运行一个副本,一般用于守护进程类的任务

Job // 创建出来的pod,只有完成任务就立即退出,用于执行一次性任务

Cronjob //创建的pod会周期性的执行,执行周期性任务

StatefulSet //管理由状态应用

ReplicaSet(RS)

保证一定数量的pod能够正常运行,持续监听这些pod的运行状态

pod发生故障,就会重启或重建

支持pod数量的扩缩容和版本镜像的升级

 apiVersion: apps/v1
 kind: ReplicaSet
 metadata:
  name: pc-replicaset
  namespace: dev
  labels:
   controller: rs
 spec:
  replicas: 3
  selector:
   matchLabels:
    app: nginx-pod
   matchExpressions:
    - {key:app, operator: In, values: [nginx-pod]}
  template:
   labels:
    app: nginx-pod
   spec:
    containers:
    - name: nginx
      image: nginx:1.17.1
扩缩容

编辑yaml文件
kubectl edit rs pc-replicaset -n dev
修改spec.replicas的值

命令
kubectl scale rs pc-replicaset --replicas=2 -n dev

镜像升级
编辑yaml文件
kubectl edit rs pc-replicaset -n dev
修改spec.template.container.image的值

命令
kubectl set image rs pc-replicaset nginx=nginx:1.17.2 -n dev
删除ReplicaSet,

先replicas调整为0,删除所有pod后,再删除rs
kubectl delete rs pc-replicaset -n dev

仅删除rs对象,不删除pod
kubectl delete rs pc-replicaset -n dev --cascade=false

推荐
kubectl delete -f pc-replicaset.yaml

Deployment(Deploy)

解决服务编排的问题,

不直接管理pod,通过管理ReplicaSet来间接管理Pod

支持ReplicaSet的所有功能
支持发布的停止和继续
支持版本滚动升级和版本回退
apiVersion: apps/v1
 kind: Deployment
 metadata:
  name: 
  namespace: dev
  labels:
   controller: deploy
 spec:
  replicas: 3
  revisionHistoryLimit: 3 //保留历史版本,默认是10
  paused: false //暂停部署,默认是false
  progressDeadlineSeconds: 600 //部署超时时间,默认600s
  strategy:
   type: RollingUpdate //滚动更新
   rollingUpdate:
    maxSurge: 30% //最大额外可以存在的副本数,可以为百分比,整数
    maxUnavailable: 30% //最大不可用状态的Pod的最大值,可以为百分比,整数
  selector:
   matchLabels:
    app: nginx-pod
   matchExpressions:
    - {key:app, operator: In, values: [nginx-pod]}
  template:
   metadata:
    labels:
     app: nginx-pod
   spec:
    containers:
    - name: nginx
      image: nginx:1.17.1
//创建deploy
kubectl create -f pc-deployment.yaml --record=true

kubectl get deploy pc-deployment -n dev
kubectl get rs -n dev
kubectl get pod -n dev

//删除deploy
kubectl delete -f pc-deployment.yaml

扩缩容

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

kubectl edit deploy pc-deploy -n dev
修改replicas的值

kubectl get deploy pc-deployment -n dev
kubectl get pods -n dev

镜像更新

重建更新

strategy:
  type: Recreate //创建新pod,会杀掉已存在的pod
 
 验证
 kubectl set image deploy pc-deployment-recreate nginx=nginx:1.17.2 -n dev
 
 kubectl get pod -n dev -w
 

滚动更新(默认)

strategy;
  type: RollingUpdate //滚动更新,删除一部分,重启一部分,新旧共存
  RollingUpdate:
   maxSurge: //在升级过程中可以超过期望的Pod的最大数量
   maxUnavailable: //在升级过程中不可用的Pod的最大数量

 验证
 kubectl set image deploy pc-deployment-recreate nginx=nginx:1.17.2 -n dev
 
 kubectl get pod -n dev -w

版本回退

更新镜像以后,查看rs,旧的还存在,只是相关pod数量为0,产生新的rs,相关pod数量为3
kubectl get rs -n dev

kubectl rollout 版本升级相关功能

kubectl rollout 
  status 显示当前升级状态
  history 显示升级历史记录
  pause 暂停版本升级过程
  resume 继续升级
  restart 重启版本升级过程
  undo 回滚到上一次版本,(--to-revision回滚到指定版本)
kubectl rollout status deploy pc-deployment -n dev

kubectl rollout history deploy pc-deployment -n dev //创建的时候需要 --record才能显示

//--to-revision=1 指定回退版本,不设置,返回上一版本
kubectl rollout undo deploy pc-deployment --to-revision=1 -n dev

金丝雀发布

//更新deploy的版本,并暂停更新,老的rs-pod依旧存在,并产生一个新的rs-pod,不再发生变化
kubectl set image deploy pc-deployment nginx=nginx:v1.17.4 -n dev &&
kubectl rollout pause deploy pc-deployment -n dev

//查看rs
kubectl get rs -n dev

//观察更新状态
kubectl rollout status deploy pc-deployment -n dev

//没有问题,继续更新
kubectl rollout resume deploy pc-deployment -n dev

Horizontal Pod Autoscaler(HPA)

通过监测Pod的使用情况,实现Pod的自动调整

HPA可以获得Pod的利用率,和HPA中定义的指标对比,同时计算出需要

伸缩的具体值,实现Pod数量的调整。

追踪分析目标Pod的负载变化情况,来决定是否需要针对性的调整Pod

的副本数

创建deployment
kubectl run pc-deploy-hpa --image=nginx:1.17.1 --requests=cpu=100m -n dev
kubectl apply -f pc-deploy-hpa.yaml

暴露service
kubectl expose deployment pc-deploy-hpa --type=NodePort --port=80 -n dev

kubectl get deploy,pod,svc -n dev

kubectl apply -f pc-deploy-hpa.yaml

用postman对节点进行压测,分别打开三个终端,观察pod,hpa,deploy的变化

hpa配置项

spec:
 minReplicas: 1  //最小副本数
 maxReplicas: 10 //最大副本数
 targetCPUUtilizationPercentage: 3 //cpu的占用率
 scaleTargetRef: //设置deployment
  apiVersion: apps/v1
  kind: Deployment
  name: pc-deploy-hpa

DaemonSet (DS)

保证集群中的每一台节点上都运行一个副本,一般用于日志收集,节点监控

Pod提供的功能每个节点都需要且只需要一个

每当向集群中添加一个节点时,指定的pod副本也将添加到该节点上

当节点从集群中移除时,Pod也就被垃圾回收了

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: //名称
  namespace: dev
  labels:
   controller: DaemonSet
spec:
  revisionHistoryLimit: 3 //保留历史版本
  updateStrategy:
   type: RollingUpdate //滚动更新
   rollingUpdate:
    maxSurge: 30% //最大额外可以存在的副本数,可以为百分比,整数
    maxUnavailable: 30% //最大不可用状态的Pod的最大值,可以为百分比,整数
  selector:
   matchLabels:
    app: nginx-pod
   matchExpressions:
    - {key:app, operator: In, values: [nginx-pod]}
  template:
   metadata:
    labels:
     app: nginx-pod
   spec:
    containers:
    - name: nginx
      image: nginx:1.17.1

测试

kubectl apply -f pc-daemonset.yaml

查看
kubectl get ds pc-daemonset -n dev
kubectl get pod -n dev

每个节点都会有一个pod

Job

批量处理短暂的一次性任务

每个任务仅运行一次

Job创建的pod执行成功时,Job将记录成功结束的pod数量

当成功结束的pod达到指定的数量时,Job将完成执行

apiVersion: batch/v1
kind: Job
metadata:
  name: //名称
  namespace: dev
  labels:
   controller: Job
spec:
  completions: //Job需要成功运行pod的数量,默认是1
  parallelism: //Job在任一时刻应该并发运行pod的数量,默认是1
  activeDeadlineSeconds: //Job可运行的时间期限,超过未结束,系统会终止
  backoffLimit:6 //失败尝试次数
  manualSelector: true //
  selector: //选择器,指定该控制器管理哪些pod
   matchLabels:
    app: counter-pod
   matchExpressions:
    - {key:app, operator: In, values: [counter-pod]}
  template: //pod模版
   metadata:
    labels:
     app: counter-pod
   spec:
    restartPolicy: //只能设置Never或者OnFailure
    containers:
    - name: counter
      image: busybox:1.30
      command: ["bin/sh","-c","for i in 9 8 7 6 5 4 3 2 1]; do echo $i;sleep 3;done"]
kubectl apply -f pc-Job.yaml

kubectl get job -n dev -w

kubectl get pod -n dev -w

CrobJob

定时job

Cronjob通过Job控制器,管理pod

Cronjob可以在特定的时间点反复去运行job任务

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: //名称
  namespace: dev
  labels:
   controller: cronjob
spec:
  schedule: //cron格式的任务运行时间点,
  concurrencyPolicy: //并发执行策略,前一次任务未完成的情况下如何运行后一次任务
                     //Allow 允许jobs并发运行,默认
                     //Forbid 禁止并发运行,跳过下次
                     //Replace 下次替换当前任务
  failedJobHistoryLimit: //为失败的任务执行保留的历史记录数,默认1
  successfulJobHistoryLimit: //为成功的任务执行保留的历史记录数,默认3
  startingDeadlineSeconds: //超时时间
  jobTemplate: // Job控制器模板
    metadata:
    spec:
      completions: //Job需要成功运行pod的数量,默认是1
      parallelism: //Job在任一时刻应该并发运行pod的数量,默认是1
      activeDeadlineSeconds: //Job可运行的时间期限,超过未结束,系统会终止
      backoffLimit:6 //失败尝试次数
      manualSelector: true //
      selector: //选择器,指定该控制器管理哪些pod
       matchLabels:
        app: counter-pod
       matchExpressions:
        - {key:app, operator: In, values: [counter-pod]}
      template: //pod模版
       metadata:
        labels:
         app: counter-pod
       spec:
        restartPolicy: //只能设置Never或者OnFailure
        containers:
        - name: counter
          image: busybox:1.30
          command: ["bin/sh","-c","for i in 9 8 7 6 5 4 3 2 1]; do echo $i;sleep 3;done"]
kubectl apply -f pc-cronjob.yaml

kubectl get cronjob -n dev -w

kubectl get job -n dev -w

kubectl get pod -n dev -w
展开阅读全文

页面更新:2024-04-18

标签:控制器   百分比   整数   副本   节点   集群   数量   状态   版本   时间

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top