【Kubernetes】k8s集群Pod控制器

目录

一.Pod控制器作用

二.Pod控制器类型

[1.Deployment(简称deploy) + ReplicaSet(简称rs)](#1.Deployment(简称deploy) + ReplicaSet(简称rs))

2.StatefulSet(简称sts)

创建SatefulSet控制器

3.DaemonSet(简称ds)

4.Job

5.CronJob(简称cj)


一.Pod控制器作用

Pod控制器,又称之为工作负载(workload),是用于实现管理pod的中间层,确保pod资源符合预

期的状态,pod的资源出现故障时,会尝试进行重启,当根据重启策略无效,则会重新新建pod的

资源

二.Pod控制器类型

1.Deployment(简称deploy) + ReplicaSet(简称rs)

Deployment

  • 部署无状态应用(没有实时数据需要存储)
  • 负责创建和管理ReplicaSet,维护Pod副本数与预期状态保持一致
  • 负责创建和删除控制器管理的Pod资源,有多个Pod副本时是并行创建启动的,升级策略默认为滚动更新的方式

应用场景:web服务

复制代码
#获取创建资源的命令
kubectl create deployment XXX  --image   --dry-run=client -o yaml  >  XXX.yaml
kubectl get deployment XXX  -o yaml >  XXX.yaml
kubectl edit deployment XXX ;手动复制

#更新资源
kubectl set deployment XXX  容器=镜像名
kubectl edit deployment XXX
kubectl apply -f XXX.yaml

#回滚资源
kubectl rollout history  deployment XXX
kubectl rollout undo  deployment XXX  --to-revision=N

#发布资源
kubectl expose deployment XXX  --port   --target-port   --type

ReplicaSet

代用户创建指定数量的pod副本,确保pod副本数量符合预期状态,并且支持滚动式自动扩容和缩

容功能。

ReplicaSet主要三个组件组成:

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

帮助用户管理无状态的pod资源,精确反应用户定义的目标数量,但是RelicaSet不是直接使用的控

制器,而是使用Deployment

2.StatefulSet(简称sts)

部署有状态应用(有实时数据需要存储,且数据有上下文的关系)

需要提前创建一个Headless Service资源(无头服务,ClusterIP为None的service资源),在sts资

源配置中使用serviceName字段指定Headless Service资源名称

每个Pod名称标识都是唯一且固定不变的(标识为 0 到 n-1)

每个Pod都可以有自己专属的持久化存储(基于PVC模板 volumeClaimTemplates 实现的)

K8S集群内的Pod可以通过 <Pod名称>.<Headless Service资源名称>.<命名空间> 格式解析出sts控

制器管理的Pod资源的PodIP(基于Headless Service和CoreDNS实现的)

创建、滚动升级、扩容、缩容Pod副本时默认都是有序进行的(由sts.spec.podManagementPolicy

字段决定的,默认为OrderedReady,如果设置为Parallel则并行的管理Pod)

创建、扩容是升序进行的(顺序为Pod标识从0到n-1),滚动升级、缩容是倒序进行的(顺序为

Pod标识从n-1到0)

Service资源的类型:4个常规类型(ClusterIP、NodePort、LoadBalancer、ExternalName)+

1个特殊类型(Headless Service)

常见的应用场景:数据库

https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/

创建SatefulSet控制器

复制代码
创建SatefulSet控制器,必须先创建Headless Service
vim demo1-svc.yaml 
apiVersion: v1
kind: Service
metadata:
  labels:
    app: demo1-svc
  name: demo1-svc
  namespace: xy101
spec:
  ports:
  - name: http
    port: 8080
    protocol: TCP
    targetPort: 80
  selector:
    app: myapp
  type: ClusterIP
  clusterIP: None                 #设置为none即创建Headless Service
 
kubectl apply -f demo1-svc.yaml 
kubectl get svc -n xy101

vim demo2-sts.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
  labels:
    app: demo2-sts
  name: demo2-sts
  namespace: xy101
spec:
  serviceName: demo1-svc           #此处名字必与创建的svc资源名称一致
  replicas: 3
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - image: soscscs/myapp:v1
        name: myapp
        ports:
        - containerPort: 80
        resources: {}
 
kubectl apply -f demo2-sts.yaml
kubectl get pod -n xy101

扩容
kubectl scale -n xy101 statefulset demo2-sts --replicas=6
SatefulSet控制器创建资源、扩容都是有序创建
缩容
kubectl scale -n xy101 statefulset demo2-sts --replicas=3
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名称.统一的域名
nslookup demo2-sts-0.demo1-svc.xy101.svc.cluster.local

kubectl scale -n xy101 statefulset demo2-sts --replicas=0
kubectl scale -n xy101 statefulset demo2-sts --replicas=3
kubectl exec -it -n xy101 demo-pod -- sh
nslookup demo2-sts-0.demo1-svc.xy101.svc.cluster.local

滚动升级

复制代码
kubectl set image -n xy101 sts demo2-sts myapp=soscscs/myapp:v2  #倒序进行升级

持久化存储

复制代码
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

kubectl exec -it -n xy101 demo2-sts-0 -- sh
/ # cd /mnt
/mnt # echo '123' > x.txt
/mnt # exit
kubectl exec -it -n xy101 demo2-sts-1 -- sh
/ # cd /mnt
/mnt # echo '234' > y.txt
/mnt # exit

kubectl delete -n xy101 pod demo2-sts-0
kubectl delete -n xy101 pod demo2-sts-1
pod "demo2-sts-1" deleted
kubectl get pod -n xy101 
 
 
 
#无论怎么删除pod,数据都不会丢失

3.DaemonSet(简称ds)

通常用于部署需要在每个node节点上都要部署的daemon(守护进程)级别的无状态应用

理论上可以在K8S集群的所有node节点上都创建一个相同的Pod副本,无论node节点何时加入到

K8S集群(需要考虑到taint污点和cordon不可调度的影响)

ds资源配置不需要设置Pod副本数量replicas

应用场景: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

一次性的部署短期任务的Pod资源,Pod容器不会持续运行,并要求任务执行完毕后容器成功退出

且不再重启

Job资源配置的容器重启策略要求不能设置为Always,一般设置为 Never(推荐)或 OnFailure

如果任务执行失败导致Pod容器异常退出,Job会根据backoffLimit字段的值决定重建Pod来重试任

务的次数(默认为6)

应用场景:数据库迁移、批处理脚本、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

vim demo4-job.yaml
apiVersion: batch/v1
kind: Job
metadata:
  labels:
    app: demo4-job
  name: demo4-job
  namespace: xy101
spec:
  backoffLimit: 2      #设置job失败后进行重试的次数
  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 1"
        volumeMounts:
        - name: scj-vol
          mountPath: /mnt
        resources: {}
      restartPolicy: Never
 
kubectl apply -f demo4-job.yaml

5.CronJob(简称cj)

周期性的部署短期任务的Pod资源,Pod容器不会持续运行,并要求任务执行完毕后容器成功退出

且不再重启

Job资源配置的容器重启策略要求不能设置为Always,一般设置为 Never(推荐)或 OnFailure

Job会根据schedule字段设置的周期表去执行任务,格式为"分 时 日 月 周",支持 - / , 符号

应用场景:通知,备份

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
相关推荐
❀͜͡傀儡师4 小时前
docker一键部署HFish蜜罐
运维·docker·容器
DO_Community4 小时前
DigitalOcean容器注册表推出多注册表支持功能
服务器·数据库·docker·kubernetes
dnpao5 小时前
linux onlyoffice服务向docker容器中添加中文字体
linux·运维·docker
回忆是昨天里的海5 小时前
k8s暴露服务-Ingress环境部署
云原生·容器·kubernetes
tzhou644526 小时前
Kubernetes Pod 入门
云原生·容器·kubernetes
java_logo6 小时前
Dify 开源 LLM 应用开发平台企业级 Docker Compose 部署手册
docker·容器·开源·dify部署·dify部署文档·dify部署方案·dify部署教程
jarreyer7 小时前
【docker的gpu加速相关问题解决记录】
运维·docker·容器
韭菜钟7 小时前
制作自定义Docker镜像并部署使用
运维·docker·容器
椰汁菠萝7 小时前
docker部署gitlab
docker·容器·gitlab
知识分享小能手7 小时前
Ubuntu入门学习教程,从入门到精通,Ubuntu 22.04 中安装 Docker 容器 —— 知识点详解(26)
学习·ubuntu·docker