【kubernetes】pod控制器详解

一、pod控制器概述

1、Pod控制器作用

Pod控制器,是用于实现管理pod的中间层,确保pod资源符合预期的状态,pod的资源出现故障时,会尝试进行重启,当根据重启策略无效,则会重新新建pod的资源。

2、pod控制器的类型

(1) ReplicaSet

作用:代用户创建指定数量的pod副本,确保pod副本数量符合预期状态,并且支持滚动式自动扩容和缩容功能。
ReplicaSet主要三个组件组成:

(1)用户期望的pod副本数量
(2)标签选择器,判断哪个pod归自己管理
(3)当现存的pod数量不足,会根据pod资源模板进行新建

注: ReplicaSet帮助用户管理无状态的pod资源,精确反应用户定义的目标数量,但是RelicaSet不是直接使用的控制器,而是使用Deployment来间接管理 ReplicaSet。

(2) Deployment

工作在ReplicaSet之上,用于管理无状态应用,目前来说最好的控制器。支持滚动更新和回滚功能,还提供声明式配置。
ReplicaSet 与Deployment 这两个资源对象逐步替换之前RC的作用。因为RC在滚动升级之后,会造成服务访问中断,于是K8S引入了Deployment资源

(3)DaemonSet

通常用于部署需要在每个node节点上都要部署的daemon(守护进程)级别的无状态应用
理论上可以在K8S集群的所有node节点上都创建一个相同的Pod副本,无论node节点何时加入到K8S集群(需要考虑到taint污点和cordon不可调度的影响)
ds资源配置不需要设置Pod副本数量replicas

(4)StatefulSet

管理有状态应用

(5)Job

一次性的部署短期任务的Pod资源只要完成就立即退出,不需要重启或重建

(6)Cronjob

周期性的部署短期任务的Pod资源,Pod容器不会持续运行

​​​​​

3、Pod与控制器之间的关系

controllers:在集群上管理和运行容器的 pod 对象, 控制器 通过 label-selector 与 Pod 相关联。
Pod 通过控制器实现应用的运维,如伸缩,升级等。

二、pod控制器详解

1、Deployment

  1. 部署无状态应用
  2. 管理Pod和ReplicaSet
  3. 具有上线部署、副本设定、滚动升级、回滚等功能
  4. 提供声明式更新,例如只更新一个新的image
  5. 应用场景:web服务

示例:

复制代码
vim nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx	
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.15.4
        ports:
        - containerPort: 80

kubectl create -f nginx-deployment.yaml

kubectl get pods,deploy,rs

2、SatefulSet

  • 部署有状态应用
  • 稳定的持久化存储,即Pod重新调度后还是能访问到相同的持久化数据,基于PVC来实现
  • 稳定的网络标志,即Pod重新调度后其PodName和HostName不变,基于Headless Service(即没有Cluster IP的Service)来实现
  • 有序部署,有序扩展,即Pod是有顺序的,在部署或者扩展的时候要依据定义的顺序依次进行(即从0到N-1,在下一个Pod运行之前所有之前的Pod必须都是Running和Ready状态),基于init containers来实现
  • 有序收缩,有序删除(即从N-1到0) StatefulSet 也确保 Pod 是有序删除的,即从 N-1 到 0 的顺序。
  • 常见的应用场景:数据库

创建SatefulSet控制器

1、先创建一个Headless Service

复制代码
apiVersion: v1
kind: Service
metadata:
  labels:
    app: demo-svc
  name: demo1-svc
  namespace: xy101
spec:
  ports:
  - name: http
    port: 8080
    protocol: TCP
    targetPort: 80
  selector:
    app: myapp
  type: CluserIP
  clusterIP: None

基于这个service去创建SatefulSet控制器

若要减少副本数量,以倒序的顺序开始删除

副本的删除

复制代码
当删除-个 Statefulset 时,该 Statefulset 不提供任何终止 Pod 的保证。为了实现 Statefulset 中的 Pod 可以有序且体面地终止,可以在删除之前将 Statefulset 缩容到 0
 
kubectl delete -n xy101 pod demo2-sts-1 #删除前后pod名称不会发生改变

解析pod的ip

复制代码
kubectl run -n xy101 demo-pod --image=soscscs/myapp:v1  #测试pod
kubectl exec -it -n xy101 demo-pod -- sh
cat /etc/resolv.conf
nslookup pod名称.svc名称.serivce名称
nslookup demo2-sts-0.demo1-svc.xy101.svc.cluster.local

进行滚动升级的时候,同样是倒序升级

持久化存储

复制代码
vim demo2-sts.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
  labels:
    app: demo2-sts
  name: demo2-sts
  namespace: xy101
spec:
  serviceName: demo1-svc
  replicas: 3
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - image: soscscs/myapp:v1
        name: myapp
        ports:
        - containerPort: 80
        resources: {}
        volumeMounts:
        - name: demo2-sts-pvc
          mountPath: /mnt
  volumeClaimTemplates:
  - metadata:
      name: demo2-sts-pvc
    spec:
      accessModes:
      - ReadWriteOnce
      resources:
        requests:
          storage: 2Gi
      storageClassName: nfs-client-storageclass
 
kubectl apply -f demo2-sts.yaml 
kubectl get pod -n xy101
kubectl get pv,pvc -n xy101
复制代码
[root@master01 day12]# kubectl delete -n xy101 pod demo2-sts-0
pod "demo2-sts-0" deleted
[root@master01 day12]# kubectl delete -n xy101 pod demo2-sts-1
pod "demo2-sts-1" deleted
[root@master01 day12]# kubectl get pod -n xy101 
NAME          READY   STATUS    RESTARTS   AGE
demo-pod      1/1     Running   0          176m
demo2-sts-0   1/1     Running   0          6s
demo2-sts-1   1/1     Running   0          2s
demo2-sts-2   1/1     Running   0          7m5s
 
 
 
#无论怎么删除pod,数据都不会丢失

3、DaemonSet

DaemonSet 确保全部(或者一些)Node 上运行同一个 Pod 的副本。当有 Node 加入集群时,也会为他们新增一个 Pod 。当有 Node 从集群移除时,这些 Pod 也会被回收。删除 DaemonSet 将会删除它创建的所有 Pod。

使用 DaemonSet 的一些典型用法:
●运行集群存储 daemon,例如在每个 Node 上运行 glusterd、ceph。
●在每个 Node 上运行日志收集 daemon,例如fluentd、logstash。
●在每个 Node 上运行监控 daemon,例如 Prometheus Node Exporter、collectd、Datadog 代理、New Relic 代理,或 Ganglia gmond。
应用场景:Agent

复制代码
vim demo3-ds.yaml 
apiVersion: apps/v1
kind: DaemonSet
metadata:
  labels:
    app: myapp
  name: myapp-ds
  namespace: xy101
spec:
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - image: soscscs/myapp:v1
        name: myapp
        ports:
        - containerPort: 80
        resources: {}

4 、job

Job分为普通任务(Job)和定时任务(CronJob)
常用于运行那些仅需要执行一次的任务
应用场景:数据库迁移、批处理脚本、kube-bench扫描、离线数据处理,视频解码等业务
https://kubernetes.io/docs/concepts/workloads/controllers/jobs-run-to-completion/

复制代码
vim demo4-job.yaml 
apiVersion: batch/v1
kind: Job
metadata:
  labels:
    app: demo4-job
  name: demo4-job
  namespace: xy101
spec:
  template:
    metadata:
      labels:
        app: myapp
    spec:
      volumes:
      - name: scj-vol
        hostPath:
          path: /data/volumes
          type: DirectoryOrCreate
      containers:
      - image: soscscs/myapp:v1
        name: myapp
        ports:
        - containerPort: 80
        command:
        - sh
        - -c
        - "for i in $(seq 1 10); do echo scj like xjj on $(data) >> /mnt/scj.txt; sleep 1; done; exit 0"                    #只执行十次每隔一秒
        volumeMounts:
        - name: scj-vol
          mountPath: /mnt
        resources: {}
      restartPolicy: Never

5、cronjob

周期性任务,像Linux的Crontab一样。
周期性任务
应用场景:通知,备份
https://kubernetes.io/docs/tasks/job/automated-tasks-with-cron-jobs/

复制代码
vim demo5-cj.yaml
apiVersion: batch/v1beta1
kind: CronJob
metadata:
  labels:
    app: demo5-cj
  name: demo5-cj
  namespace: xy101
spec:
  schedule: "*/1 * * * *"           #周期性执行任务
  concurrencyPolicy: Allow          #CronJob 允许并发任务执行
  startingDeadlineSeconds: 20       #过了截止时间20秒,CronJob 就不会开始任务
  successfulJobsHistoryLimit: 3     #保留的成功完成的任务数
  failedJobsHistoryLimit: 3         #保留已完成和失败的任务数
  jobTemplate:
    spec:
      #backoffLimit: 2
      template:
        metadata:
          labels:
            app: myapp
        spec:
          volumes:
          - name: scj-vol
            hostPath:
              path: /data/volumes
              type: DirectoryOrCreate
          containers:
          - image: soscscs/myapp:v1
            name: myapp
            ports:
            - containerPort: 80
            command:
            - sh
            - -c
            - "for i in $(seq 1 10); do echo scj like xjj on $(data) >> /mnt/scj.txt; sleep 1; done; exit 0"
            volumeMounts:
            - name: scj-vol
              mountPath: /mnt
相关推荐
阿里云云原生5 小时前
阿里云可观测 2026 年 4 月产品动态
云原生
qq_364371726 小时前
基于 Docker 容器化环境配置
运维·docker·容器
塔克拉玛攻城狮6 小时前
详解cni插件cilium篇一:它为什么这么快?它还有哪些高级功能?
kubernetes·cilium
阿里云云原生7 小时前
Skills Registry 公测开启:为企业打造私有的 Skill 管理中心
云原生
吃胖点儿7 小时前
DevOps与自动化原理
云原生
GentleDevin7 小时前
Docker 运维常用命令大全
docker·容器·运维命令
运维全栈笔记7 小时前
基于Docker的MinIO单机部署与功能测试指南
运维·docker·容器
阿里云云原生8 小时前
HiClaw 发布 v1.1.0,提供 Kubernetes 集群部署实现,支持 Hermes Worker 运行时
kubernetes
心机之蛙qee8 小时前
docker的安装(RHEL9)
运维·docker·容器
Cat_Rocky9 小时前
kubernetes ingress粗浅学习
学习·容器·kubernetes