⭐6. Kubernetes核心资源之Pod控制器实战

ReplicaSet

  • 一种副本控制器,简称rs,主要是控制由其管理的pod,使pod副本的数量始终维持在预设的个数
  • 并支持pod数量扩缩容,镜像版本升级
  • 官方建议不要直接使用ReplicaSet,用Deployments更好,并提供很多其它有用的特性

Deployment

  • 通过控制ReplicaSet来控制Pod,并支持滚动升级、回退版本,适合无状态的服务部署
  • 当某个应用有新版本发布时,Deployment会同时操作两个版本的ReplicaSet
  • 其内置多种滚动升级策略,会按照既定策略降低老版本的Pod数量,同时也创建新版本的Pod
  • Deployment控制器不直接管理Pod对象,而是 Deployment 管理ReplicaSet, 再由ReplicaSet管理Pod对象

DaemonSet

  • 在K8S集群部署中由于节点数量不定,那么如果我们需要对每个节点中都运行一个守护进程、日志收集进程等情况时,在k8s中如何实现呢?这个时候就是DaemonSet应用场景了
  • 这类Pod 运行在K8S 集群里的每一个节点(Node)上,确保所有节点上有且仅有一个pod
  • 有新的节点加入 K8S集群后,该 Pod 会自动地在新节点上被创建出来
  • 而当旧节点被删除后,它上面的 Pod也相应地会被回收掉
  • 应用场景:监控告警Agent、日志组件、监控组件等

StatefulSet

  • 像RS、Deployment、DaemonSet都是面向无状态的服务,所管理的Pod的IP、名字,启停顺序都是随机
  • StatefulSet就是有状态的集合,管理所有有状态的服务,
  • StatefulSet 中的 Pod 具有黏性的、独一无二的身份标识,重新调度后PodName和HostName不变
  • Pod重新调度后还是能访问到相同的持久化数据,基于PVC实现
  • 分配给每个 Pod 的唯一顺序索引,Pod 的名称的形式为 <statefulset name>-<ordinal index>

Horizontal Pod Autoscaler

  • 可以基于 CPU 利用率或其他指标实现Pod水平自动扩缩
  • 被伸缩的pod需要是通过deployment或者replica set管理
  • HPA不能应用于不可伸缩的对象,如:DaemonSets
  • 由资源来决定控制器行为,控制器周期性调整目标pod的副本数量,让目标pod的实际cpu使用率符合用户指定的数值

Job

  • 普通任务容器控制器,只会执行一次,只要完成任务就立即退出,不需要重启或重建
  • 容器中的进程在正常运行结束后不会对其进行重启,而是将pod对象置于completed状态
  • 若容器中的进程因错误而终止,则需要依据配置确定是否需要重启
  • 应用场景:批处理程序,完成后容器就退出等

Cronjob:

  • Linux 中有 cron 程序定时执行任务,K8s的 CronJob 提供了类似的功能,可以定时执行 Job
  • 创建的Pod负责周期性任务控制
  • 应用场景:执行周期性的重复任务,如备份数据、发送邮件、数据报表、报告生成等

  1. ReplicaSet
  • 可控制器Yaml模板介绍:
apiVersion: apps/v1 # 版本号
kind: ReplicaSet  #资源文件 
metadata: # 元对象信息
  name: xdclass-rs #rs控制器名称
  namespace: dev #名称空间
spec: #具体详情
  replicas: 5 #副本数量
  selector: # 选择器,指定rs控制器管理哪些pod资源
    matchLabels: # 标签匹配规则
      app: xdclass-nginx-pod #标签key是app,值是xdclass-nginx-pod
      
  template: # pod模板,当数量不满足的时候,根据下面编码创建pod副本
    metadata: # 元对象信息
      labels: # pod资源标签
        app: xdclass-nginx-pod
    spec: #具体详情
      containers: # 容器数组列表
      - name: xdclass-nginx  #容器名称
        image: nginx:1.23.0  # 镜像和版本
  • 案例文件 replicaset-nginx.yaml
apiVersion: apps/v1
kind: ReplicaSet   
metadata:
  name: xdclass-rs
  namespace: dev
spec:
  replicas: 5
  selector: 
    matchLabels:
      app: xdclass-nginx-pod
  template:
    metadata:
      labels:
        app: xdclass-nginx-pod
    spec:
      containers:
      - name: xdclass-nginx
        image: nginx:1.23.0
  • 操作
#创建
kubectl apply -f replicaset-nginx.yaml

#查看
kubectl get pods,deploy,replicaset -o wide -n dev

# 命令行缩容
kubectl scale rs xdclass-rs --replicas=2 -n dev

# 删除,可以直接删除rs;也可以通过yaml删除
kubectl delete -f replicaset-nginx.yaml

  1. Deplotment
  • 配置文件 deploy-nginx-pod.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: xdclass-deploy
  namespace: dev
spec:
  replicas: 5
  selector: 
    matchLabels:
      app: xdclass-nginx-pod
  template:
    metadata:
      labels:
        app: xdclass-nginx-pod
    spec:
      containers:
      - name: xdclass-nginx
        image: nginx:1.23.0
  • 操作
#创建
kubectl apply -f deploy-nginx-pod.yaml

# 查看deployment
kubectl get deployment -n dev

#查看
kubectl get pods,deploy,replicaset -o wide -n dev


# 删除,通过yaml删除
kubectl delete -f deploy-nginx-pod.yaml

image.png

  • NAME 列出了集群中 Deployment 的名称。
  • READY 显示应用程序的可用的“副本”数,格式是“就绪个数/期望个数”。
  • UP-TO-DATE 显示为了达到期望状态已经更新的副本数。
  • AVAILABLE 显示可用的副本数。
  • AGE 应用程序运行的时间。

  1. K8S的Deployment控制器滚动升级 (金丝雀发布 or 灰度发布)
  • Deployment更新有两种方式:
spec:
  strategy:  # 策略
    type: RollingUpdate / Recreate
  • Recreate : 删除全部旧的pod,然后创建新的pod
  • RollingUpdate:滚动升级更新,删除部分,更新部分,在整个更新过程中,存在两个版本的pod
    • maxUnavailable:
  1. 升级过程中不可用Pod的最大数量,默认为25%

  2. 在滚动更新时,我们可以忍受多少个 Pod 无法提供服务

  3. 值越小越能保证服务稳定,更新越平滑

    • maxSurge :
  4. 升级过程中可以超过期望的Pod的最大数量,默认为25%;

  5. 在滚动更新时,可以有多少个额外的 Pod

  6. 值调的越大,副本更新速度越快

  • 配置文件 deploy-rollout.yaml:
MaxUnavailable为0, 在新 Pod 启动并就绪之前,不要关闭任何旧Pod
MaxSurge 为100%, 立即启动所有新 Pod,也就是有足够的资源希望尽快完成更新。

默认两个值都是 25%
如果更新一个 100 Pod 的 Deployment,会立刻创建 25 个新 Old,同时会关闭 25 个旧 Pod;
每次有 Pod 启动就绪,就可以关闭旧 Pod
apiVersion: apps/v1
kind: Deployment
metadata:
  name: xdclass-deploy
  namespace: dev
spec:
  replicas: 5
  revisionHistoryLimit: 5  #保留历史版本5个
  strategy: 
    type: RollingUpdate
  selector: 
    matchLabels:
      app: xdclass-nginx-pod
  template:
    metadata:
      labels:
        app: xdclass-nginx-pod
    spec:
      containers:
      - name: xdclass-nginx
        image: nginx:1.23.0
  • 执行 :
# 创建
kubectl apply -f deploy-rollout.yaml

# 删除
kubectl delete -f deploy-rollout.yaml
  • 查看控制器参数 :
 kubectl describe deploy xdclass-deploy -n dev

image.png

  • 滚动升级 :
kubectl set image deployment/xdclass-deploy xdclass-nginx=nginx:1.15.8 -n dev

备注
	追加 --record 以保存正在更改资源的 kubectl 命令,方便查看history版本列表修改命令
	kubectl set image deployment/xdclass-deploy xdclass-nginx=nginx:1.15.8 -n dev --record=true
	
	kubectl set image deployment/xdclass-deploy xdclass-nginx=nginx:1.23.0 -n dev --record=true
  • 动态查看升级过程,存在多个不同版本 :
kubectl get pods -n dev -w
  • 发布回滚 :
    • history 升级历史记录
    • undo 默认回滚上一版本 ,使用–to-revision回滚到指定版本
    • pause 暂停版本升级发布
    • resume 继续恢复刚暂停的版本升级
    • status 升级状态
# 查看历史版本列表
kubectl rollout history deployment/xdclass-deploy -n dev

# 查看具体某一个历史版本信息
kubectl rollout history deployment/xdclass-deploy -n dev --revision=2

# 回滚上一版本
kubectl rollout undo deployment/xdclass-deploy -n dev

# 回滚指定版本
kubectl rollout undo deployment/xdclass-deploy -n dev --to-revision=2

# 查看升级情况
kubectl rollout status deployment/xdclass-deploy -n dev

# 删除deployment
kubectl delete -f deploy-nginx-pod.yaml
  1. DaemonSet
  • **案例 ** daemonset-nginx.yaml
apiVersion: apps/v1
kind: DaemonSet   
metadata:
  name: xdclass-ds
  namespace: dev
spec:
  selector: 
    matchLabels:
      app: xdclass-nginx-pod
  template:
    metadata:
      labels:
        app: xdclass-nginx-pod
    spec:
      containers:
      - name: xdclass-nginx
        image: nginx:1.23.0
        imagePullPolicy: IfNotPresent
  • **操作 : **
#创建
kubectl apply -f daemonset-nginx.yaml

#只有一个节点,多个节点的话,每个节点都有一个pod
kubectl get pod,deploy,rs,ds -n dev
  1. **Job控制器 : **

**参数讲解 : **

apiVersion: batch/v1
kind: Job
metadata:
  name: xdclass-job
  namespace: dev
spec:
  parallelism: 2 #job并发运行Pods的数量,默认 1
  completions: 3 #job需要成功运行Pods的次数,默认 1
  backoffLimit: 5 #job失败后进行重试的次数,默认是6
  activeDeadlineSeconds: 100 #job运行超时时间,当job超过timeout时间,则job的状态也会更新为failed
  template:
    spec:
      restartPolicy: Never #job重启策略,OnFailure或Never 
      containers:
      - name: demo
        image: busybox:1.35.0 
				# 容器的启动命令列表,在pod中的容器初始化完毕后运行命令
				command: ["echo","hello xdclass.net k8s job"]  

**案例实战 : **

apiVersion: batch/v1
kind: Job
metadata:
  name: xdclass-job
spec:
  parallelism: 2
  completions: 3
  backoffLimit: 5
  activeDeadlineSeconds: 100
  template:
    spec:
      restartPolicy: Never
      containers:
      - name: demo
        image: busybox:1.35.0 
        command: ["echo","hello xdclass.net k8s job"]

**操作 : **

kubectl get job -n dev -o wide

kubectl get pods -o wide

#查看日志
kubectl logs xdclass-job-75xfb
  • 11
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值