pod控制器

Posted 敲击岁月

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了pod控制器相关的知识,希望对你有一定的参考价值。

pod控制器

pod控制器简介

pod控制器,又称为工作负载(workload),是用于实现管理pod的中间层,确保pod资源符合预期的状态,pod的资源出现故障时,会尝试进行重启,当重启策略无效,会重新创建新的pod。

pod控制器分为有状态和无状态的
有状态:
1.实例之间有差别,每个实例都有自己的独特性,元数据不同,例如etcd,zookeeper
2.实例之间不对等的关系,以及依靠外部存储的应用

无状态:
1.deployment认为所有的pod都是一样的
2.不用考虑顺序的要求
3.不用考虑在哪个node节点上运行
4.可以随意扩容和缩容

常规service和无头服务的区别
service:一组pod访问策略,提供cluster-ip集群之间通讯,还提供负载均衡和服务发现
Headless service:无头服务,不需要cluster-ip,直接绑定具体的pod的IP

pod控制器有多种类型:

ReplicaSet代用户创建指定数量的pod副本数量,确保pod副本数量符合预期状态,并且支持滚动式自动扩容和缩容功能
Deployment工作在ReplicaSet之上,用于管理无状态应用,目前来说最好的控制器。支持滚动更新和回滚功能
DaemonSet用于确保集群中的每一个节点只运行特定的pod副本,通常用于实现系统级后台任务。比如ELK服务。管理的服务是无状态的,服务是守护进程
StatefulSet管理有状态应用
Job只要完成就立即退出,不需要重启或重建
Cronjob周期性任务控制,不需要持续后台运行

pod与控制器之间的关系
pod通过控制器实现应用的运维,如伸缩,升级等

Deployment

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




statefulset

部署有状态应用
稳定的持久化存储,即pod重新调度后还是能访问到相同的持久化数据,基于PVC来实现
稳定的网络标志,即pod重新调度后其podname和hostname不变,基于headless service(无头服务,没有cluster IP的service)来实现有序部署,有序扩展,即pod是有顺序的,在部署或者扩展的时候要依据定义的顺序依次进行(即从1到N-1,在下一个pod运行之前所有之前的pod必须都是running和ready状态),基于init containers来实现
有序收缩,有序删除
常见的应用场景:数据库

无论是Kube-dns还是CoreDNS,基本原理都是利用监听Kubernetes的Service和Pod,生成DNS记录,然后通过重新配置Kubelet的DNS选项让新启动的Pod使用Kube-dns或CoreDNS提供的Kubernetes集群内域名解析服务




vim statefulset.yaml
apiVersion: v1
kind: Service
metadata:
  name: myapp-svc
  labels:
    app: myapp-svc
spec:
  ports:
  - port: 80
    name: web
  clusterIP: None
  selector:
    app: myapp-pod
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: myapp
spec:
  serviceName: myapp-svc
  replicas: 3
  selector:
    matchLabels:
      app: myapp-pod
  template:
    metadata:
      labels:
        app: myapp-pod
    spec:
      containers:
      - name: myapp
        image: ikubernetes/myapp:v1
        ports:
        - containerPort: 80
          name: web
        volumeMounts:
        - name: myappdata
          mountPath: /usr/share/nginx/html
  volumeClaimTemplates:
  - metadata:
      name: myappdata
    spec:
      accessModes: ["ReadWriteOnce"]
      resources:
        requests:
          storage: 2Gi



daemonset

daemonset确保全部(或者一些)node上运行一个pod副本,当有node加入集群时,也会为他们新增一个pod。当有node从集群移除时,这些pod也会被回收。删除daemonset将会删除它创建的所有的pod
应用场景:运行日志收集,监控,集群存储daemon

apiVersion: apps/v1
kind: DaemonSet 
metadata:
  name: nginx-daemon
  labels:
    app: nginx
spec:
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.15.4
        ports:
        - containerPort: 80


job

分为普通任务和定时任务
常用语运行哪些仅需要执行一次的任务
应用场景:数据库迁移,批处理脚本,视频解码,离线数据处理,kube-bench扫描

apiVersion: batch/v1
kind: Job
metadata:
  name: pi
spec:
  template:
    spec:
      containers:
      - name: pi
        image: perl
        command: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(2000)"]
      restartPolicy: Never   
  backoffLimit: 4

cronjob

周期性任务
应用场景:通知,备份

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: hello
spec:
  schedule: "*/1 * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: hello
            image: busybox
            args:
            - /bin/sh
            - -c
            - date; echo Hello from the Kubernetes cluster
          restartPolicy: OnFailure

以上是关于pod控制器的主要内容,如果未能解决你的问题,请参考以下文章

HPA

影响K8S Pod分配和调度策略的两大关键特性

影响K8S Pod分配和调度策略的两大关键特性

k8s中的pod控制器之DeploymentDaemonSetStatefulSet

kubernetes入门到实战Stateless控制器详解

ExtJs 4:如何在一个请求中发送所有修改、新和删除的记录?