Pod 控制器

前言

        Pod 是 Kubernetes 集群中能够被创建和管理的最小部署单元。所以需要有工具去操作和管理它们的生命周期,这里就需要用到控制器了。

        Pod 控制器由 master 的 kube-controller-manager 组件提供,常见的此类控制器有 Replication Controller、ReplicaSet、Deployment、DaemonSet、StatefulSet、Job 和 CronJob 等,它们分别以不同的方式管理 Pod 资源对象。

一、pod 控制器的相关知识

1.1 pod控制器的作用

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

按照pod的创建安方式可以将其分为两类:

  • 自主式pod:kubernetes直接创建出来的pod,这种pod删除后就没有了,也不会重建
  • 控制器创建的pod:通过控制器创建的pod,这种pod删除了之后还会自动重建

Pod与控制器之间的关系:

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

1.2 pod控制器的多种类型

1、ReplicaSet: 代用户创建指定数量的pod副本,确保pod副本数量符合预期状态,并且支持滚动式自动扩容和缩容功能。
ReplicaSet主要三个组件组成:
(1)用户期望的pod副本数量
(2)标签选择器,判断哪个pod归自己管理
(3)当现存的pod数量不足,会根据pod资源模板进行新建
帮助用户管理无状态的pod资源,精确反应用户定义的目标数量,但是RelicaSet不是直接使用的控制器,而是使用Deployment。

2、Deployment:工作在ReplicaSet之上,用于管理无状态应用,目前来说最好的控制器。支持滚动更新和回滚功能,还提供声明式配置。
ReplicaSet 与Deployment 这两个资源对象逐步替换之前RC的作用。

3、DaemonSet:用于确保集群中的每一个节点只运行特定的pod副本,通常用于实现系统级后台任务。比如ELK服务
特性:服务是无状态的
服务必须是守护进程

4、StatefulSet:管理有状态应用

5、Job:只要完成就立即退出,不需要重启或重建

6、Cronjob:周期性任务控制,不需要持续后台运行

1.3 pod容器中的有状态和无状态的对比 

(1)有状态实例 

  • 实例之间有差别,每个实例都有自己的独特性,元数据不同,例如etcd,zookeeper
  • 实例之间不对等的关系,以及依靠外部存储的应用 


(2)无状态实例 

  • deployment认为所有的pod都是一样的
  • 不用考虑顺序的要求
  • 不用考虑在哪个node节点上运行
  • 可以随意扩容和缩容

二、Deployment 控制器

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

示例:

vim nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-deploymentlabels:app: nginx	
spec:replicas: 3selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx:1.15.4ports:- containerPort: 80kubectl create -f nginx-deployment.yamlkubectl get pods,deploy,rs

查看控制器配置

kubectl edit deployment/nginx-deployment
apiVersion: apps/v1
kind: Deployment
metadata:annotations:deployment.kubernetes.io/revision: "1"creationTimestamp: "2021-04-19T08:13:50Z"generation: 1labels:app: nginx					#Deployment资源的标签name: nginx-deploymentnamespace: defaultresourceVersion: "167208"selfLink: /apis/extensions/v1beta1/namespaces/default/deployments/nginx-deploymentuid: d9d3fef9-20d2-4196-95fb-0e21e65af24a
spec:progressDeadlineSeconds: 600replicas: 3					#期望的pod数量,默认是1revisionHistoryLimit: 10selector:matchLabels:app: nginxstrategy:rollingUpdate:maxSurge: 25%				#升级过程中会先启动的新Pod的数量不超过期望的Pod数量的25%,也可以是一个绝对值maxUnavailable: 25%		#升级过程中在新的Pod启动好后销毁的旧Pod的数量不超过期望的Pod数量的25%,也可以是一个绝对值type: RollingUpdate			#滚动升级template:metadata:creationTimestamp: nulllabels:app: nginx				#Pod副本关联的标签spec:containers:- image: nginx:1.15.4				#镜像名称imagePullPolicy: IfNotPresent	#镜像拉取策略name: nginxports:- containerPort: 80				#容器暴露的监听端口protocol: TCPresources: {}terminationMessagePath: /dev/termination-logterminationMessagePolicy: FilednsPolicy: ClusterFirstrestartPolicy: Always				#容器重启策略schedulerName: default-schedulersecurityContext: {}terminationGracePeriodSeconds: 30
......//查看历史版本
kubectl rollout history deployment/nginx-deployment
deployment.apps/nginx-deployment
REVISION  CHANGE-CAUSE
1         <none>

三、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 | Kubernetes

示例:

apiVersion: v1
kind: Service
metadata:name: nginx        #服务名称labels:app: nginx
spec:ports:- port: 80name: webclusterIP: None
#表明这是一个Headless Service(无头服务),即没有ClusterIP,
#通常用于StatefulSet以直接访问Pods。selector:app: nginx        #服务选择器,用于关联具有相同标签"app: nginx"的Pods
---
apiVersion: apps/v1
kind: StatefulSet        #表示创建的是有状态应用集
metadata:name: web            #应用集名称
spec:selector:matchLabels:app: nginx        #选择器标签,确保StatefulSet管理的Pods具有匹配的标签"app: nginx"。serviceName: "nginx"        #引用的Service名称,用于Pod间的通信replicas: 3                #声明副本数量为3template:        #Pod模板,定义了每个Pod的元数据和规范metadata:labels:app: nginxspec:terminationGracePeriodSeconds: 10containers:- name: nginximage: nginx:1.18ports:- containerPort: 80name: webvolumeMounts:- name: wwwmountPath: /usr/share/nginx/html
#卷挂载,将名为"www"的卷挂载到"/usr/share/nginx/html"路径,以便存储静态网页内容。volumeClaimTemplates:        #卷声明模板,定义了动态创建PVC 的规则- metadata:name: www            # PVC名称spec:accessModes: [ "ReadWriteOnce" ]  #设置卷访问模式storageClassName: "my-storage-class"    #指定存储类名resources:requests:storage: 1Gi  #请求的存储资源量

3.1 StatefulSet 的 三个组件

从上面的应用场景可以发现,StatefulSet由以下几个部分组成:
●Headless Service(无头服务):用于为Pod资源标识符生成可解析的DNS记录。
●volumeClaimTemplates(存储卷申请模板):基于静态或动态PV供给方式为Pod资源提供专有的固定存储。
●StatefulSet:用于管控Pod资源。

(1) 为什么要有headless?

        在deployment中,每一个pod是没有名称,是随机字符串,是无序的。而statefulset中是要求有序的,每一个pod的名称必须是固定的。当节点挂了,重建之后的标识符是不变的,每一个节点的节点名称是不能改变的。pod名称是作为pod识别的唯一标识符,必须保证其标识符的稳定并且唯一。
        为了实现标识符的稳定,这时候就需要一个headless service 解析直达到pod,还需要给pod配置一个唯一的名称。

(2)为什么要有volumeClaimTemplate?

        大部分有状态副本集都会用到持久存储,比如分布式系统来说,由于数据是不一样的,每个节点都需要自己专用的存储节点。而在 deployment中pod模板中创建的存储卷是一个共享的存储卷,多个pod使用同一个存储卷,而statefulset定义中的每一个pod都不能使用同一个存储卷,由此基于pod模板创建pod是不适应的,这就需要引入volumeClainTemplate,当在使用statefulset创建pod时,会自动生成一个PVC,从而请求绑定一个PV,从而有自己专用的存储卷。

服务发现:就是应用服务之间相互定位的过程。
应用场景:
●动态性强:Pod会飘到别的node节点
●更新发布频繁:互联网思维小步快跑,先实现再优化,老板永远是先上线再慢慢优化,先把idea变成产品挣到钱然后再慢慢一点一点优化
●支持自动伸缩:一来大促,肯定是要扩容多个副本

K8S里服务发现的方式---DNS,使K8S集群能够自动关联Service资源的“名称”和“CLUSTER-IP”,从而达到服务被集群自动发现的目的。

实现K8S里DNS功能的插件:
●skyDNS:Kubernetes 1.3之前的版本
●kubeDNS:Kubernetes 1.3至Kubernetes 1.11
●CoreDNS:Kubernetes 1.11开始至今

3.2 SatefulSet 控制器的案例演示

安装CoreDNS,仅二进制部署环境需要安装CoreDNS

方法一:
下载链接:https://github.com/kubernetes/kubernetes/blob/master/cluster/addons/dns/coredns/coredns.yaml.basevim transforms2sed.sed
s/__DNS__SERVER__/10.0.0.2/g
s/__DNS__DOMAIN__/cluster.local/g
s/__DNS__MEMORY__LIMIT__/170Mi/g
s/__MACHINE_GENERATED_WARNING__/Warning: This is a file generated from the base underscore template file: coredns.yaml.base/gsed -f transforms2sed.sed coredns.yaml.base > coredns.yaml该命令的作用是应用transforms2sed.sed文件中定义的sed规则或脚本,对coredns.yaml.base文件进行
文本处理或转换,然后将处理后的结果保存到新的文件coredns.yaml中。这种操作常用于配置文件的批量
修改、格式调整等场景,通过编写sed脚本可以高效地自动化处理文本任务方法二:上传 coredns.yaml 文件kubectl create -f coredns.yamlkubectl get pods -n kube-systemvim nginx-service.yaml
apiVersion: v1  
kind: Service  
metadata:name: nginx-servicelabels:app: nginx  
spec:type: NodePort  ports:- port: 80targetPort: 80  selector:app: nginxkubectl create -f nginx-service.yamlkubectl get svc
NAME            TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
kubernetes      ClusterIP   10.96.0.1       <none>        443/TCP        5d19h
nginx-service   NodePort    10.96.173.115   <none>        80:31756/TCP   10svim pod6.yaml 
apiVersion: v1
kind: Pod
metadata:name: dns-test
spec:containers:- name: busyboximage: busybox:1.28.4args:- /bin/sh- -c- sleep 36000restartPolicy: Neverkubectl create -f pod6.yaml //解析kubernetes和nginx-service名称
kubectl exec -it dns-test sh
/ # nslookup kubernetes
Server:    10.96.0.10
Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.localName:      kubernetes
Address 1: 10.96.0.1 kubernetes.default.svc.cluster.local
/ # nslookup nginx-service
Server:    10.96.0.10
Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.localName:      nginx-service
Address 1: 10.96.173.115 nginx-service.default.svc.cluster.local

查看statefulset的定义

kubectl explain statefulset

KIND:     StatefulSet
VERSION:  apps/v1DESCRIPTION:StatefulSet represents a set of pods with consistent identities. Identitiesare defined as: - Network: A single stable DNS and hostname. - Storage: Asmany VolumeClaims as requested. The StatefulSet guarantees that a givennetwork identity will always map to the same storage identity.FIELDS:apiVersion	<string>kind	<string>metadata	<Object>spec	<Object>status	<Object>

kubectl explain statefulset.spec

KIND:     StatefulSet
VERSION:  apps/v1RESOURCE: spec <Object>DESCRIPTION:Spec defines the desired identities of pods in this set.A StatefulSetSpec is the specification of a StatefulSet.FIELDS:podManagementPolicy	<string>  #Pod管理策略replicas	<integer>    #副本数量revisionHistoryLimit	<integer>   #历史版本限制selector	<Object> -required-    #选择器,必选项serviceName	<string> -required-  #服务名称,必选项template	<Object> -required-    #模板,必选项updateStrategy	<Object>       #更新策略volumeClaimTemplates	<[]Object>   #存储卷申请模板,必选项

清单定义StatefulSet

        如上所述,一个完整的 StatefulSet 控制器由一个 Headless Service、一个 StatefulSet 和一个 volumeClaimTemplate 组成。如下资源清单中的定义:

apiVersion: v1
kind: Service
metadata:name: myapp-svc         #服务名称labels:app: myapp-svc        #服务标签
spec:ports:- port: 80name: web            #定义了一个端口,容器端口80,名称为webclusterIP: None        #设置为None,表明这是一个无头服务selector:app: myapp-pod        #选择器标签,用于匹配StatefulSet中Pod的标签
---
apiVersion: apps/v1
kind: StatefulSet
metadata:name: myapp                #有状态应用集名称
spec:serviceName: myapp-svc        #指定了关联的(Service)服务名称replicas: 3selector:matchLabels:app: myapp-pod        #匹配Pod的标签template:metadata:labels:app: myapp-pod        #Pod模板的标签spec:containers:- name: myappimage: ikubernetes/myapp:v1ports:- containerPort: 80name: web                #容器开放端口80,与服务定义相匹配(name名称要一样)volumeMounts:- name: myappdatamountPath: /usr/share/nginx/html#将名为myappdata的卷挂载到容器的/usr/share/nginx/html目录下volumeClaimTemplates:- metadata:name: myappdata    #定义了PVC的名称annotations:          #动态PV创建时,使用annotations在PVC里声明一个StorageClass对象的标识进行关联volume.beta.kubernetes.io/storage-class: nfs-client-storageclassspec:accessModes: ["ReadWriteOnce"]        #设置访问模式resources:requests:storage: 2Gi        #请求2Gi的存储空间

解析上例:由于 StatefulSet 资源依赖于一个实现存在的 Headless 类型的 Service 资源,所以需要先定义一个名为 myapp-svc 的 Headless Service 资源,用于为关联到每个 Pod 资源创建 DNS 资源记录。接着定义了一个名为 myapp 的 StatefulSet 资源,它通过 Pod 模板创建了 3 个 Pod 资源副本,并基于 volumeClaimTemplates 向前面创建的PV进行了请求大小为 2Gi 的专用存储卷。

如果你StorageClass + nfs-client-provisioner 动态创建pv已经创建完成,那么可直接加载该yaml文件。

想要进行动态部署可见我上一个博客。

kubectl apply -f stateful-demo.yaml

kubectl get pvc

若你没有 做动态创建,那么可以使用静态创建    步骤如下:

//创建pv
//stor01节点
mkdir -p /data/volumes/v{1,2,3,4,5}vim /etc/exports
/data/volumes/v1 192.168.80.0/24(rw,no_root_squash)
/data/volumes/v2 192.168.80.0/24(rw,no_root_squash)
/data/volumes/v3 192.168.80.0/24(rw,no_root_squash)
/data/volumes/v4 192.168.80.0/24(rw,no_root_squash)
/data/volumes/v5 192.168.80.0/24(rw,no_root_squash)systemctl restart rpcbind
systemctl restart nfsexportfs -arvshowmount -e//定义PV
vim pv-demo.yaml
apiVersion: v1
kind: PersistentVolume
metadata:name: pv001labels:name: pv001
spec:nfs:path: /data/volumes/v1server: stor01accessModes: ["ReadWriteMany","ReadWriteOnce"]capacity:storage: 1Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:name: pv002labels:name: pv002
spec:nfs:path: /data/volumes/v2server: stor01accessModes: ["ReadWriteOnce"]capacity:storage: 2Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:name: pv003labels:name: pv003
spec:nfs:path: /data/volumes/v3server: stor01accessModes: ["ReadWriteMany","ReadWriteOnce"]capacity:storage: 2Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:name: pv004labels:name: pv004
spec:nfs:path: /data/volumes/v4server: stor01accessModes: ["ReadWriteMany","ReadWriteOnce"]capacity:storage: 2Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:name: pv005labels:name: pv005
spec:nfs:path: /data/volumes/v5server: stor01accessModes: ["ReadWriteMany","ReadWriteOnce"]capacity:storage: 2Gikubectl apply -f pv-demo.yamlkubectl get pv
NAME      CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM     STORAGECLASS   REASON    AGE
pv001     1Gi        RWO,RWX        Retain           Available                                      7s
pv002     2Gi        RWO            Retain           Available                                      7s
pv003     2Gi        RWO,RWX        Retain           Available                                      7s
pv004     2Gi        RWO,RWX        Retain           Available                                      7s
pv005     2Gi        RWO,RWX        Retain           Available                           			7s//创建statefulset
kubectl apply -f stateful-demo.yaml kubectl get svc  #查看创建的无头服务myapp-svc
NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)             AGE
kubernetes   ClusterIP   10.96.0.1        <none>        443/TCP             50d
myapp-svc    ClusterIP   None             <none>        80/TCP              38skubectl get sts    #查看statefulset
NAME      DESIRED   CURRENT   AGE
myapp     3         3         55skubectl get pvc    #查看pvc绑定
NAME                STATUS    VOLUME    CAPACITY   ACCESS MODES   STORAGECLASS   AGE
myappdata-myapp-0   Bound     pv002     2Gi        RWO                           1m
myappdata-myapp-1   Bound     pv003     2Gi        RWO,RWX                       1m
myappdata-myapp-2   Bound     pv004     2Gi        RWO,RWX                       1mkubectl get pv    #查看pv绑定
NAME      CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM                       STORAGECLASS   REASON    AGE
pv001     1Gi        RWO,RWX        Retain           Available                                                        6m
pv002     2Gi        RWO            Retain           Bound       default/myappdata-myapp-0                            6m
pv003     2Gi        RWO,RWX        Retain           Bound       default/myappdata-myapp-1                            6m
pv004     2Gi        RWO,RWX        Retain           Bound       default/myappdata-myapp-2                            6m
pv005     2Gi        RWO,RWX        Retain           Available                                                        6mkubectl get pods   #查看Pod信息
NAME                     READY     STATUS    RESTARTS   AGE
myapp-0                  1/1       Running   0          2m
myapp-1                  1/1       Running   0          2m
myapp-2                  1/1       Running   0          2m

扩容与缩容演示

当删除的时候是从myapp-2开始进行删除的,关闭是逆向关闭

kubectl delete -f stateful-demo.yaml

可以看到,在我们执行了delete命令后 statefulset控制的pod 并没有如我们所想逆向关闭

若要确保Pod按照预期的顺序逆向关闭,除非有特殊需求使用直接删除StatefulSet的方式,否则建议通过操作StatefulSet的副本数(比如逐步减少.spec.replicas的数量)来优雅地缩容应用,这样Kubernetes会更有序地管理Pod的生命周期。如果确实需要直接删除单个Pod,可通过kubectl delete pod <pod-name>命令,并且监控删除过程以确认行为符合预期。

想要达到效果 我们可以使用以下方法: 缩容

kubectl edit statefulsets.apps myapp

不过,需要注意的是,对于StatefulSet而言,由于每个Pod都有固定的标识和顺序,减少副本数至0的操作应当更加谨慎,特别是涉及到有状态应用和持久化存储时,确保数据妥善处理和备份,避免数据丢失或混乱。而对于无状态应用的Deployment,减少副本数到0则是较为常规的操作。

通过降序,进行pod的删除

注意:此时PVC依旧存在的,再重新创建(扩容)pod时,依旧会重新去绑定原来的pvc

kubectl apply -f stateful-demo.yaml

kubectl edit statefulsets.apps myapp

滚动更新

        StatefulSet 控制器将在 StatefulSet 中删除并重新创建每个 Pod。它将以与 Pod 终止相同的顺序进行(从最大的序数到最小的序数),每次更新一个 Pod。在更新其前身之前,它将等待正在更新的 Pod 状态变成正在运行并就绪。

如下操作的滚动更新是按照2-0的顺序更新。

vim stateful-demo.yaml  		#修改image版本为v2
.....
image: ikubernetes/myapp:v2
....kubectl apply -f stateful-demo.yaml

kubectl get pods -w   #查看滚动更新的过程

解析 pod 名称

SatefulSet 在创建的每一个Pod中,每一个pod自己的名称都是可以被解析的

从上面的解析,我们可以看到在容器当中可以通过对Pod的名称进行解析到ip。其解析的域名格式如下:

(pod_name).(service_name).(namespace_name).svc.cluster.local

总结

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

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

常规service和无头服务区别
service:一组Pod访问策略,提供cluster-IP群集之间通讯,还提供负载均衡和服务发现。
Headless service:无头服务,不需要cluster-IP,而是直接以DNS记录的方式解析出被代理Pod的IP地址。

四、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

官方案例(监控)DaemonSet | Kubernetes

vim ds.yaml 
apiVersion: apps/v1
kind: DaemonSet 
metadata:name: nginx-daemonSetlabels:app: nginx
spec:selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx:1.15.4ports:- containerPort: 80

DaemonSet会在每个node节点都创建一个Pod

五、Job 控制器

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

Job | Kubernetes

vim job.yaml
apiVersion: batch/v1
kind: Job
metadata:name: pi
spec:template:spec:nodeName: node01containers:- name: piimage: perlcommand: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(2000)"]restartPolicy: NeverbackoffLimit: 4//参数解释
.spec.template.spec.restartPolicy该属性拥有三个候选值:OnFailure,Never和Always。默认值为
Always。它主要用于描述Pod内容器的重启策略。在Job中只能将此属性设置为OnFailure或Never,否则
Job将不间断运行。.spec.backoffLimit用于设置job失败后进行重试的次数,默认值为6。默认情况下,除非Pod失败或容器
异常退出,Job任务将不间断的重试,此时Job遵循 .spec.backoffLimit上述说明。
一旦.spec.backoffLimit达到,作业将被标记为失败。"perl" 运行的命令。
"-Mbignum=bpi" Perl模块加载参数,启用大数支持以计算圆周率。
"-wle" 执行Perl脚本的选项,其中-w开启警告,-l使输出自动换行,-e后面跟执行的代码。
"print bpi(2000)" 实际执行的Perl代码,计算圆周率到小数点后2000位。

在node01节点下载perl镜像,因为镜像比较大,所以建议提前下载好

docker pull perl

在master节点上执行

kubectl apply -f job.yaml 

清除job资源

kubectl delete -f job.yaml

六、CronJob 

周期性任务,像Linux的Crontab一样。
周期性任务
应用场景:通知,备份

使用 CronJob 运行自动化任务 | Kubernetes

//每分钟打印hello
vim cronjob.yaml
apiVersion: batch/v1beta1
kind: CronJob
metadata:name: hello
spec:schedule: "*/1 * * * *"jobTemplate:spec:template:spec:containers:- name: helloimage: busyboximagePullPolicy: IfNotPresentargs:- /bin/sh- -c- date; echo Hello from the Kubernetes clusterrestartPolicy: OnFailure
//cronjob其它可用参数的配置spec:concurrencyPolicy: Allow			#声明了 CronJob 创建的任务执行时发生重叠如何处理(并发性规则仅适用于相同 CronJob 创建的任务)。spec仅能声明下列规则中的一种:●Allow (默认):CronJob 允许并发任务执行。●Forbid:CronJob 不允许并发任务执行;如果新任务的执行时间到了而老任务没有执行完,CronJob 会忽略新任务的执行。●Replace:如果新任务的执行时间到了而老任务没有执行完,CronJob 会用新任务替换当前正在运行的任务。startingDeadlineSeconds: 15		#它表示任务如果由于某种原因错过了调度时间,开始该任务的截止时间的秒数。过了截止时间,CronJob 就不会开始任务,且标记失败.如果此字段未设置,那任务就没有最后期限。successfulJobsHistoryLimit: 3		#要保留的成功完成的任务数(默认为3)failedJobsHistoryLimit:1         #要保留多少已完成和失败的任务数(默认为1)suspend:true                     #如果设置为 true ,后续发生的执行都会被挂起。 这个设置对已经开始的执行不起作用。默认是 false。schedule: '*/1 * * * *'			#必需字段,作业时间表。在此示例中,作业将每分钟运行一次jobTemplate:						#必需字段,作业模板。这类似于工作示例

kubectl create -f cronjob.yaml

kubectl get cronjob

//如果报错:Error from server (Forbidden): Forbidden (user=system:anonymous, verb=get, resource=nodes, subresource=proxy) ( pods/log hello-1621587780-c7v54)
//解决办法:绑定一个cluster-admin的权限
kubectl create clusterrolebinding system:anonymous --clusterrole=cluster-admin --user=system:anonymous

总结

Pod 控制器有几种?
1、Deployment+ReplicaSet  部署无状态应用的Pod
2、StatefulSet    部署有状态应用的Pod
3、DaemonSet      在K8S集群的所有Node节点上部署相同的Pod
4、Job            部署一次性的任务Pod,完成后就会退出并不会重启
5、CronJob        部署周期性的任务Pod,完成后就会退出并不会重启Deployment
1、部署无状态应用的
2、创建和管理 ReplicaSet(RS)和Pod资源,维护Pod副本数量与期望值相同
3、创建和删除Pod时是并行执行的,升级时是先创建一部分新Pod,再删除一部分旧PodStatefulSet
1、部署有状态应用的   
2、每个Pod的名称是唯一且固定不变的,而且每个Pod应该拥有自己专属的持久化存储(基于PVC模板volumeClaimTemplates绑定PV)
3、需要关联 Headless Service(ClusterIP为None),在K8S集群内部可通过<pod_name>.<svc.name>.<namespace_name>.svc.cluster.local 的格式解析出Pod IP (基于无头服务和CoreDNS实现)4、创建、删除、升级、扩缩容Pod都是有序进行的(默认为串行执行的):创建 是升序执行的(顺序为Pod标识序号0..n-1),删除、升级是逆序执行的(顺序为 n-1..0)扩缩容都是逆序执行的(顺序为 n-1..0),升级时会先删除旧Pod,再创建新Podspec.podManagementPolicy: Parallel  #可设置StatefulSet创建和删除Pod时为并行执行service类型种类  4+1
ClusterIP  虚拟IP
NodePort   对外开放
LoadBalancer
ExtenalNameHeadless Service    无头服务常规service与Headless Service的区别
常规service:一组Pod的访问策略,提供ClusterIP在K8S集群内部访问,还提供负载均衡和服务发现功能
Headless Service:无头服务,可以不需要ClusterIP,与StatefulSet资源关联配合CoreDNS
实现通过 Pod名称 解析出 PodIPDaemonSet
1、理论上可以在K8S集群的所有Node节点上创建同类型的Pod资源(无论Node节点什么加入到K8S集群)
2、会受到Node节点上的污点或者cordon不可调度设置的影响。可以在Pod配置中设置容忍忽略污点,设置uncordon解除不可调度
3、不需要设置副本数replicasJob
1、部署一次性任务的资源(pod)
2、任务正常完成后Pod容器会立即退出并不会再重启(Job类型Pod容器的retartPolicy通常设置为Never),也不会重建Pod
3、如果任务异常完成Pod容器异常退出,会重建Pod重试任务,重试次数根据 backoffLimit 配置(默认6次)CronJob
1、部署周期性任务的资源,一次任务至少创建一个Pod
2、任务正常完成后Pod容器会立即退出并不会再重启(Job类型Pod容器的retartPolicy不设置为Always),也不会重建Pod
3、使用 spec.schedule 字段设置时间周期表,格式为 '分 时 日 月 周'

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/845008.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

React-生成随机数和日期格式化

生成随机数 uuid文档&#xff1a;https://github.com/uuidjs/uuid npm install uuid import {v4 as uuidV4} from uuid 使用&#xff1a; uuidV4() 日期格式化 dayjs文档&#xff1a;安装 | Day.js中文网 npm install dayjs import dayjs from dayjs

算法-扫描线

目录 什么是扫描线算法&#xff1f; 扫描线简单应用 更多的扫描线 什么是扫描线算法&#xff1f; 在计算几何中&#xff0c;扫描线算法&#xff08;scan line algorithm&#xff09;一般用来解决几何图形的面积交并&#xff0c;周长交并问题&#xff0c;扫描线算法的核心思想…

SAPUI5基础知识3 - 引导过程(Bootstrap)

1. 背景 在上一篇博客中&#xff0c;我们已经建立出了第一个SAPUI5项目&#xff0c;接下来&#xff0c;我们将为这个项目添加引导过程。 在动手练习之前&#xff0c;让我们先解释一下什么引导过程。 1.1 什么是引导过程&#xff1f; 在计算机科学中&#xff0c;引导过程也称…

5、css3 自动动画渐变背景

效果例图&#xff1a;&#xff08;因gif图片太大&#xff0c;而csdn只能上传小于5m图片&#xff0c;所以无法上传&#xff09; 1、首先上传html代码&#xff1a; <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8">&l…

【鸟哥】Linux笔记-硬件搭配

在Linux这个系统当中&#xff0c;几乎所有的硬件设备文件都在/dev这个目录内。打印机与软盘呢&#xff1f;分别是/dev/lp0, /dev/fd0。 几个常见的设备与其在Linux当中的文件名&#xff1a; 如果你的机器使用的是跟网际网络供应商 &#xff08;ISP&#xff09; 申请使用的云端…

二叉树的构建和遍历(oj题)

一、题目链接 https://www.nowcoder.com/practice/4b91205483694f449f94c179883c1fef?tpId60&&tqId29483&rp1&ru/activity/oj&qru/ta/tsing-kaoyan/question-ranking 二、题目思路 利用先序遍历的方法&#xff0c;构建二叉树。为了保证在递归中&#xf…

USB主机模式——Android

理论 摘自&#xff1a;USB 主机和配件概览 | Connectivity | Android Developers (google.cn) Android 通过 USB 配件和 USB 主机两种模式支持各种 USB 外围设备和 Android USB 配件&#xff08;实现 Android 配件协议的硬件&#xff09;。 在 USB 主机模式下&#xff0…

Redis 中的 Zset 数据结构详解

目录 用法 1. 增 2. 删 3. 查 4. 交&#xff0c;并 编码方式 应用场景 Redis 中的 Zset&#xff08;有序集合&#xff09;是一种将元素按照分数进行排序的数据结构。与上篇写的SetRedis 中的 Set 数据结构详解不同&#xff0c;Zset 中的每个元素都关联一个浮点数类型的…

Jmeter的线程组之间传递参数

使用jemter做接口测试&#xff0c;有时候需要会遇到不同线程组之间调用相同变量的情况&#xff0c;最多见的就是token的传递&#xff0c;网上有很多处理方法&#xff0c;这里只记录setProperty的办法&#xff0c;一招鲜走遍天&#xff01; 首先我有两个线程组&#xff1a; 线程…

vm:为虚拟机配置多个虚拟网卡(ubuntu20.04)

前言&#xff1a; 环境&#xff1a;虚拟机 ubuntu 20.04 要求&#xff1a;如标题&#xff0c;但是这里针对的是 ubuntu 20.04&#xff0c;对于其他操作系统&#xff0c;可以找一下其他操作系统对应的配置文件是什么 vm 添加虚拟网卡 首先进入 vm&#xff1a; 点击设置&#xf…

JVM监控-JMX探针的安装和使用

jvm监控的搭建和使用 ​ Java Management Extensions&#xff08;JMX&#xff09;是一种Java标准&#xff0c;用于管理和监控Java应用程序&#xff0c;特别是分布式系统。它提供了一种标准化的方式来管理应用程序的各种方面&#xff0c;包括性能监控、配置更改、事件通知等。目…

nodemcu32s 和 mini D1 组局域网并用 webSocket 通信

实现思路 使用 mini D1 来搭建一个 webSocket 服务&#xff0c;然后使用 nodemcu32 连接&#xff0c;然后就可以进行通信了。 服务端代码&#xff08;mini D1&#xff09; 在代码中主要是需要控制好 loop 函数中的延时&#xff0c;也就是最后一行代码 delay&#xff0c;如果…

JS-51-Node.js10-yarn

一、yarn的简介 Yarn 是一款 JavaScript 的包管理工具&#xff08;npm的代替方案&#xff09;&#xff0c;是 Facebook, Google, Exponent 和 Tilde 开发的一款新的 JavaScript 包管理工具。 正如 Yarn 官网的介绍&#xff0c;Yarn 的具有速度快 、安全 、可靠 的优点&#x…

MathType2025数学公式编辑器有哪些新增功能?

在当今科技飞速发展的时代&#xff0c;数学、科学和工程教育领域对于精确性和效率的要求日益增高。随着教育数字化的不断深入&#xff0c;传统的教学方式和科研手段正逐渐被新型的数字工具所取代。在这一过程中&#xff0c;MathType作为一款强大的数学公式编辑器&#xff0c;其…

多维时序 | Matlab实现SA-BP模拟退火算法优化BP神经网络多变量时间序列预测

多维时序 | Matlab实现SA-BP模拟退火算法优化BP神经网络多变量时间序列预测 目录 多维时序 | Matlab实现SA-BP模拟退火算法优化BP神经网络多变量时间序列预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现SA-BP模拟退火算法优化BP神经网络多变量时间序列预…

React-组件通信

组件通信 概念&#xff1a;组件通信就是组件之间的数据传递&#xff0c;根据组件嵌套关系的不同&#xff0c;有不同的通信方法 父传子 基础实现 实现步骤&#xff1a; 1.父组件传递数据-在子组件标签上绑定属性 2.子组件接收数据-子组件通过props参数接收数据 props说明 1.…

哪个牌子的无线麦克风好用?全网揭秘无线麦克风一拖二哪个牌子好

​在浩瀚的音频产品海洋中&#xff0c;如何挑选一款适合自己的无线领夹麦克风&#xff1f;这确实是一个值得深思的问题。今天&#xff0c;我为你精心推荐这几款无线领夹麦克风&#xff0c;它以其卓越的音质、稳定的性能和便捷的无线连接&#xff0c;赢得了众多用户的青睐。无论…

独家首发 | 基于多级注意力机制的并行预测模型

基于Transformer-BiGRUGlobalAttention-CrossAttention的并行预测模型! 往期精彩内容&#xff1a; 时序预测&#xff1a;LSTM、ARIMA、Holt-Winters、SARIMA模型的分析与比较-CSDN博客 VMD CEEMDAN 二次分解&#xff0c;Transformer-BiGRU预测模型-CSDN博客 独家原创 | 基…

机器学习算法手撕(一):KD树

import math import matplotlib.pyplot as pltclass Node:def __init__(self, data, leftNone, rightNone):self.data dataself.left leftself.right right# 创建KDTree类 class KDTree:def __init__(self, k):self.k kdef create_tree(self,dataset,depth):if not dataset…

辅导男朋友转算法岗的第2天|self Attention与kv cache

文章目录 公式KV CacheMHA、MQA、GQA 面试题为什么除以 d k \sqrt{d_k} dk​ ​Multihead的好处decoder-only模型在训练阶段和推理阶段的input有什么不同&#xff1f;手撕必背-多头注意力 公式 $ \text{Output} \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right) \times …