目录

一、Pod控制器及其作用

二、Pod控制器类型

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

2.StatefulSet(简称sts)

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

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐