• kubernetes 核心技术-controller


    Kubernetes 通常不会直接创建 Pod,而是通过 Controller 来管理 Pod 。Controller 中定义了 Pod 的部署特性,比如有几个副本,在什么样的 Node 上运行等,pod和controller之间通过yaml文件中的selector与label标签建立关系。

    为了满足不同的业务场景,Kubernetes 提供了多种 Controller,包括 Deployment、ReplicaSet、DaemonSet、StatefuleSet、Job 等。

    ReplicaSet

    实现了 Pod 的多副本管理,目的是在任何时候都维持一组稳定的pod副本,常用来确保指定数量的pod副本可用。

    使用 Deployment 时会自动创建 ReplicaSet,也就是说 Deployment 是通过 ReplicaSet 来管理 Pod 的多个副本,我们通常不需要直接使用 ReplicaSet,而是通过Deployment去使用ReplicaSet,这样的话我们就不需要担心和其他机制的冲突(如:ReplicaSet不支持滚动更新,但是Deployment支持)。

    一个ReplicaSet的示例:

    apiVersion: apps/v1
    kind: ReplicaSet
    metadata:
      name: frontend
      labels:
        app: guestbook
        tier: frontend
    spec:
      # modify replicas according to your case
      replicas: 3
      selector:
        matchLabels:
          tier: frontend
      template:
        metadata:
          labels:
            tier: frontend
        spec:
          containers:
          - name: php-redis
            image: gcr.io/google_samples/gb-frontend:v3

    ReplicaSet中.spec.template.metadata.labels必须跟spec.selector 相同,不然会被API拒绝。

    使用kubectl delete可以删除ReplicaSet及其pod,Garbage collection默认会删除所有相关pod。若只想删除ReplicaSet而不删除pod,需要指定--cascade=false。删除ReplicaSet后,可以创建具有相同selector的ReplicaSet来管理原先的pod,但不会使用新ReplicaSet的podTemplate来更新原先的pod。若想自动更新pod,使用Deployment。

    总之,不建议直接使用 ReplicaSet,而是通过Deployment去使用ReplicaSet。

    Deployment

    这是在使用kubernetes时候,大家部署系统或者是服务经常使用的一种controller类型。因为我们可以通过它来使用ReplicaSet来为我们部署的应用进行副本的创建。
    一般在实际的运用中,大家用 Deployment 做应用的真正的管理,而 Pod 是组成 Deployment 最小的单元。

    使用deployment部署应用(基于yaml方式)

    1.编写或生成yaml文件:kubectl create deployment nginx --image=nginx:1.8 --dry-run -o yaml > nginx.yaml

    [root@master ~]# kubectl create deployment nginx --image=nginx:1.8 --dry-run -o yaml > nginx.yaml
    W0413 03:47:05.133957   72422 helpers.go:535] --dry-run is deprecated and can be replaced with --dry-run=client.
    [root@master ~]# ll
    -rw-r--r--  1 root root  388 Apr 13 03:47 nginx.yaml

    注意,上一步的目的是快速的生成一个yaml模板,方便修改后使用,当然也可以自己直接写yaml文件。

    在生成的yaml文件中,可以看到selector与label的匹配关系:

    2.使用已生成的yaml文件部署应用:kubectl apply -f nginx.yaml

    [root@master ~]# kubectl apply -f nginx.yaml 
    deployment.apps/nginx created
    [root@master ~]# kubectl get pod 
    NAME                     READY   STATUS              RESTARTS   AGE
    nginx-7c96855774-7h7bq   0/1     ContainerCreating   0          9s

    3.对外发布(暴露对外端口),并重新生成yaml文件:kubectl expose deployment nginx --port=80 --type=NodePort --target-port=80 --name=nginx-server -o yaml > nginx-server.yaml

    [root@master ~]# kubectl expose deployment nginx --port=80 --type=NodePort --target-port=80 --name=nginx-server -o yaml > nginx-server.yaml 
    [root@master ~]# kubectl get pod,svc
    NAME                         READY   STATUS    RESTARTS   AGE
    pod/nginx-7c96855774-7h7bq   1/1     Running   0          10m
    
    NAME                   TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
    service/kubernetes     ClusterIP   10.96.0.1       <none>        443/TCP        27d
    service/nginx-server   NodePort    10.111.125.48   <none>        80:31491/TCP   26s
    [root@master ~]# ll
    total 32
    -rw-r--r--  1 root root 1074 Apr 14 00:39 nginx-server.yaml
    -rw-r--r--  1 root root  388 Apr 13 03:47 nginx.yaml

     这里两个yaml文件,nginx.yaml是pod的,nginx-server.yaml是service的(真实服务)。

    应用升级与回滚(以nginx的pod为例)

    1.新建版本为1.8 nginx的pod

    yaml文件为:其中副本数为2

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      creationTimestamp: null
      labels:
        app: nginx
      name: nginx
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: nginx
      strategy: {}
      template:
        metadata:
          creationTimestamp: null
          labels:
            app: nginx
        spec:
          containers:
          - image: nginx:1.8
            name: nginx
            resources: {}
    status: {}

    使用yaml文件部署应用:由于yaml文件中副本数为2,会有2个pod

    [root@master ~]# kubectl apply -f nginx.yaml 
    deployment.apps/nginx created
    [root@master ~]# kubectl get pods 
    NAME                     READY   STATUS    RESTARTS   AGE
    nginx-7c96855774-jg8hm   1/1     Running   0          36s
    nginx-7c96855774-ntwlw   1/1     Running   0          36s

    2.升级nginx版本1.8至1.9:kubectl set image deployment nginx nginx=nginx:1.9

    [root@master ~]# kubectl set image deployment nginx nginx=nginx:1.9
    deployment.apps/nginx image updated
    [root@master ~]# kubectl get pods
    NAME                     READY   STATUS              RESTARTS   AGE
    nginx-77766dd89-fcm9r    0/1     ContainerCreating   0          16s
    nginx-7c96855774-jg8hm   1/1     Running             0          16m
    nginx-7c96855774-ntwlw   1/1     Running             0          16m

    在这个过程中,可以使用命令来查看升级的状态:kubectl rollout status deployment nginx

    [root@master ~]# kubectl rollout status deployment nginx
    Waiting for deployment "nginx" rollout to finish: 1 out of 2 new replicas have been updated...
    Waiting for deployment "nginx" rollout to finish: 1 out of 2 new replicas have been updated...
    Waiting for deployment "nginx" rollout to finish: 1 out of 2 new replicas have been updated...
    Waiting for deployment "nginx" rollout to finish: 1 old replicas are pending termination...
    Waiting for deployment "nginx" rollout to finish: 1 old replicas are pending termination...
    deployment "nginx" successfully rolled out

    等到升级成功完毕后,再去查看pods:

    [root@master ~]# kubectl get pods
    NAME                    READY   STATUS    RESTARTS   AGE
    nginx-77766dd89-fcm9r   1/1     Running   0          5m20s
    nginx-77766dd89-rld2x   1/1     Running   0          4m51s

    可以发现,在升级的过程中,并不是直接kill掉原来的两个pod,而是启动玩新版本的pod后,再去kill掉老的,这种替换的机制保证了服务提供不间断。

    另一方面,在node节点上也会发现已经有新版本的nginx镜像被下载:

    [root@node1 ~]# docker images nginx*
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    nginx               1.9                 c8c29d842c09        4 years ago         183MB
    nginx               1.8                 0d493297b409        5 years ago         133MB

    3.回滚版本

    每次rollout都会创建revision,默认系统会保存deployment的rollout,可通过指定revision来rollback deployment。

    首先可以查看历史升级的版本: kubectl rollout history deployment nginx

    [root@master ~]# kubectl rollout history deployment nginx
    deployment.apps/nginx 
    REVISION  CHANGE-CAUSE
    1         <none>
    2         <none>

    其中第一个版本就是1.8,第二个版本都是1.9

    如果是回滚到上一个版本:kubectl rollout undo deployment nginx

    [root@master ~]# kubectl rollout undo deployment nginx
    deployment.apps/nginx rolled back

    如果是回滚到指定版本:kubectl rollout undo deployment nginx --to-revision=2,其中--to-revision就是上述通过rollout history查询出来的版本号

    [root@master ~]# kubectl rollout undo deployment nginx --to-revision=2
    deployment.apps/nginx rolled back

    最后可以通过查看deployment的详细信息来验证当前的版本:kubectl describe deployment nginx

    [root@master ~]# kubectl describe deployment nginx
    Name:                   nginx
    Namespace:              default
    CreationTimestamp:      Wed, 14 Apr 2021 05:50:54 +0800
    Labels:                 app=nginx
    Annotations:            deployment.kubernetes.io/revision: 4
    Selector:               app=nginx
    Replicas:               2 desired | 2 updated | 2 total | 2 available | 0 unavailable
    StrategyType:           RollingUpdate
    MinReadySeconds:        0
    RollingUpdateStrategy:  25% max unavailable, 25% max surge
    Pod Template:
      Labels:  app=nginx
      Containers:
       nginx:
        Image:        nginx:1.9
    
    。。。。。。。。

    应用弹性伸缩

    当前只有2个pod,复制为10个:kubectl scale deployment nginx --replicas=10

    [root@master ~]# kubectl get pods
    NAME                     READY   STATUS    RESTARTS   AGE
    nginx-7c96855774-8m6q9   1/1     Running   0          7m31s
    nginx-7c96855774-nzvld   1/1     Running   0          7m30s
    [root@master ~]# kubectl scale deployment nginx --replicas=10
    deployment.apps/nginx scaled
    [root@master ~]# kubectl get pods
    NAME                     READY   STATUS    RESTARTS   AGE
    nginx-7c96855774-2dk89   1/1     Running   0          9s
    nginx-7c96855774-2ttfw   1/1     Running   0          9s
    nginx-7c96855774-8m6q9   1/1     Running   0          8m41s
    nginx-7c96855774-cn6vr   1/1     Running   0          9s
    nginx-7c96855774-gfzrq   1/1     Running   0          9s
    nginx-7c96855774-nzvld   1/1     Running   0          8m40s
    nginx-7c96855774-r4sdt   1/1     Running   0          9s
    nginx-7c96855774-rtdrb   1/1     Running   0          9s
    nginx-7c96855774-vjzg2   1/1     Running   0          9s
    nginx-7c96855774-vrqck   1/1     Running   0          9s

    若cluster启动HPA(horizontal Pod autoscaling),还可以设置deployment的autoscaler:

    kubectl autoscale deployment nginx --min=10 --max=15 --cpu-percent=80

    表示数量在10-15之间,cpu使用率为80%。

    DaemonSet

    用于每个 Node 最多只运行一个 Pod 副本的场景。正如其名称所揭示的,DaemonSet 通常用于运行 daemon(守护程序)。当有Node加入集群时,也会为他们新增一个Pod,当有Node从集群中移除时,这个Pod同时也会回收。在删除DaemonSet的时候,会删除他创建的所有Pod。

    使用DaemonSet的一些例子:
    1.在每个node上运行一个集群存储服务,例如glusterd,ceph(分布式文件系统);
    2.在每个node上运行一个日志收集服务,例如fluentd、logstash;
    3.在每个node上运行一个节点监控服务,例如Prometheus Node Exporter。

    DaemonSet的描述文件和Deployment非常相似,只需要修改Kind,并去掉副本数量的配置即可:

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

    查看Pod在Node上的分布:一个node上一个pod

    [root@master service-daemonset]# kubectl get pods -o wide
    NAME                    READY   STATUS    RESTARTS   AGE   IP            NODE    NOMINATED NODE   READINESS GATES
    nginx-daemonset-fl44w   1/1     Running   0          20s   10.244.1.28   node1   <none>           <none>
    nginx-daemonset-wgkbv   1/1     Running   0          20s   10.244.2.30   node2   <none>           <none>

    删除一个pod,会自动重新创建一个,保持一个node上一个pod:

    [root@master service-daemonset]# kubectl get pods -o wide
    NAME                    READY   STATUS    RESTARTS   AGE   IP            NODE    NOMINATED NODE   READINESS GATES
    nginx-daemonset-fl44w   1/1     Running   0          20s   10.244.1.28   node1   <none>           <none>
    nginx-daemonset-wgkbv   1/1     Running   0          20s   10.244.2.30   node2   <none>           <none>
    [root@master service-daemonset]# kubectl delete pod nginx-daemonset-fl44w
    pod "nginx-daemonset-fl44w" deleted
    [root@master service-daemonset]# kubectl get pods -o wide
    NAME                    READY   STATUS    RESTARTS   AGE   IP            NODE    NOMINATED NODE   READINESS GATES
    nginx-daemonset-8q4sn   1/1     Running   0          3s    10.244.1.29   node1   <none>           <none>
    nginx-daemonset-wgkbv   1/1     Running   0          10m   10.244.2.30   node2   <none>           <none>

    StatefulSets

    RC、Deployment、DaemonSet都是面向无状态的服务,它们所管理的Pod的IP、名字,启停顺序等都是随机的。

    跟Deployment一样,StatefulSet也用来管理Pod,但不同的是,StatefulSet管理所有有状态的服务。

    StatefulSet特点:

    Pod一致性:包含次序(启动、停止次序)、网络一致性。此一致性与Pod相关,与被调度到哪个node节点无关;
    稳定的次序:对于N个副本的StatefulSet,每个Pod都在[0,N)的范围内分配一个数字序号,且是唯一的;
    稳定的网络:Pod的hostname模式为 (statefulset名称)−(序号);
    稳定的存储:通过VolumeClaimTemplate为每个Pod创建一个PV。删除、减少副本,不会删除相关的卷。

    StatefulSet本质上是Deployment的一种变体,在v1.9版本中已成为GA版本,它为了解决有状态服务的问题,它所管理的Pod拥有固定的Pod名称,启停顺序,在StatefulSet中,Pod名字称为网络标识(hostname),还必须要用到持久存储。

    使用的场景有:MySQL集群、MongoDB集群、Akka集群、ZooKeeper集群等。

    任何可以提供实际请求处理能力的pod最终都要封装成统一的service才能对外提供服务。在Deployment中,与之对应的服务是service,而在StatefulSet中与之对应的headless service,即无头服务,与service的区别就是它没有Cluster IP,解析它的名称时将返回该Headless Service对应的全部Pod的Endpoint列表,即当访问该service时,将直接获得Pod的IP,进行直接访问。

    除此之外,StatefulSet在Headless Service的基础上又为StatefulSet控制的每个Pod副本创建了一个DNS域名,这个域名的格式为:
    $(podname).(headless server name)
    FQDN(全限定域名):$(podname).(headless server name).namespace.svc.cluster.local

    一个StatefulSet控制器的组成:

    Headless Service:用来定义Pod的唯一网络标识( DNS domain);
    volumeClaimTemplates :存储卷申请模板,创建PVC,指定pvc名称大小,将自动创建pvc,且pvc必须由存储类供应;
    StatefulSet :定义具体应用,比如名为Nginx,有三个Pod副本,并为每个Pod定义了一个域名部署statefulset。

    为什么需要 headless service 无头服务?
    在用Deployment时,每一个Pod名称是没有顺序的,是随机字符串,因此是Pod名称是无序的,但是在statefulset中要求必须是有序 ,每一个pod不能被随意取代,pod重建后pod名称还是一样的。而pod IP是变化的,所以是以Pod名称来识别。pod名称是pod唯一性的标识符,必须持久稳定有效。这时候要用到无头服务,它可以给每个Pod一个唯一的名称 。

    为什么需要volumeClaimTemplate?
    对于有状态的副本集都会用到持久存储,对于分布式系统来讲,它的最大特点是数据是不一样的,所以各个节点不能使用同一存储卷,每个节点有自已的专用存储,但是如果在Deployment中的Pod template里定义的存储卷,是所有副本集共用一个存储卷,数据是相同的,因为是基于模板来的 ,而statefulset中每个Pod都要自已的专有存储卷,所以statefulset的存储卷就不能再用Pod模板来创建了,于是statefulSet使用volumeClaimTemplate,称为卷申请模板,它会为每个Pod生成不同的pvc,并绑定pv,从而实现各pod有专用存储。这就是为什么要用volumeClaimTemplate的原因。

    部署一个StatefulSet服务:

    yaml文件:

    #首先需要一个无头service,其中 clusterIP: None
    apiVersion: v1
    kind: Service
    metadata:
      name: nginx-headless
      namespace: default
    spec:
      selector:
         run: nginx
      clusterIP: None
      ports:
      - port: 80
        targetPort: 80
    
    ---
    #StatefulSet控制器,说明3个nginx副本都是有状态服务
    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: nginx-statefulset
      namespace: default
    spec:
      serviceName: nginx
      replicas: 3
      selector:
        matchLabels:
          run: nginx
      template:
        metadata:
          labels:
            run: nginx
        spec:
          containers:
          - image: nginx:1.8
            name: nginx
            ports:
            - containerPort: 80

    查看pod与svc:

    [root@master service-statefulsets]# kubectl get pods
    NAME                  READY   STATUS    RESTARTS   AGE
    nginx-statefulset-0   1/1     Running   0          7s
    nginx-statefulset-1   1/1     Running   0          6s
    nginx-statefulset-2   1/1     Running   0          3s
    [root@master service-statefulsets]# kubectl get svc
    NAME             TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
    kubernetes       ClusterIP   10.96.0.1    <none>        443/TCP   37d
    nginx-headless   ClusterIP   None         <none>        80/TCP    18s

    如果观察pod的创建过程,会发现是有序创建的(如果delete,同样也是有序删除,删除的顺序正好相反,从N-1到0),按照0-1-2的顺序,并且每个 Pod 都拥有一个基于其顺序索引的稳定的主机名。

    Pod的hostname由StatefulSet的name以及其ordinal index组成,$(statefulset name)-$(ordinal)。若StatefulSet存在N个pod, ordinal index为0~N-1。示例中创建3个pod,分别名为nginx-statefulset-0,nginx-statefulset-1,nginx-statefulset-2。

    如果重启pod会发现,pod中的ip会变化,但是pod的名称不会发生变化;这就是为什么不要在其他应用中使用 StatefulSet 中的 Pod 的 IP 地址进行连接,而应该使用唯一domain进行连接,因为domain是稳定的,这点很重要。

    StatefulSet使用headless service来控制pod的domain。Service控制的domain的格式为:$(service name).$(namespace).svc.cluster.local,其中cluster.local为cluster domain。当Pod创建后,获得匹配的DNS subdomain,格式为$(podname).$(governing service domain),即$(podname).$(service name).$(namespace).svc.cluster.local。如示例中的:nginx-statefulset-0.nginx-headless.default.svc.cluster.local。

    另外,StatefulSet一般都会使用VolumeClaimTemplate(本例未使用),比如:

      volumeClaimTemplates:
      - metadata:
          name: www
        spec:
          accessModes: [ "ReadWriteOnce" ]
          storageClassName: "my-storage-class"
          resources:
            requests:
              storage: 1Gi

    K8s会为每个VolumeClaimTemplate创建一个PersistentVolume,每个pod将获取一个PersistentVolume,其storage class为my-storage-class并具有1GB的存储。当不指定storage class时,将使用默认的storage class。当Pod被schedule到node上时,它的volumeMounts将mount生成的PersistentVolume。

    注意:PersistentVolumes在pod或StatefulSet删除后并不会被删除,需要人工删除。

    Job

    服务类容器通常持续提供服务,需要一直运行,比如 http server,daemon 等;而工作类容器则是一次性任务,比如批处理程序,完成后容器就退出。

    Kubernetes 的 Deployment、ReplicaSet 和 DaemonSet 都用于管理服务类容器;对于工作类容器,我们用 Job。

    Job创建一个或多个pod并确保指定数量的pod成功终止,当指定数量的pod成功终止后,job结束。

    一个Job示例,计算2000位π:

    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

    restartPolicy :是指当前的重启策略。对于 Job,只能设置为 Never (从不)或者 OnFailure(失败时)。对于其他 controller(比如 Deployment)可以设置为 Always 。

    backoffLimit :设置pod失败后的重试次数,默认为6

    启动这个job并查看:

    [root@master service-job]# kubectl apply -f job.yaml 
    job.batch/pi created
    [root@master service-job]# kubectl get job
    NAME   COMPLETIONS   DURATION   AGE
    pi     0/1           14s        14s
    [root@master service-job]# kubectl get pods
    NAME                    READY   STATUS              RESTARTS   AGE
    nginx-daemonset-8q4sn   1/1     Running             0          144m
    nginx-daemonset-wgkbv   1/1     Running             0          155m
    pi-x5m4s                0/1     ContainerCreating   0          21s

    过一会,当completions为 1/1 表示成功运行了这个job,同时pod的状态为的Completed表示这个job已经运行完成:

    [root@master service-job]# kubectl get job
    NAME   COMPLETIONS   DURATION   AGE
    pi     1/1           75s        2m57s
    [root@master service-job]# kubectl get pods
    NAME                    READY   STATUS      RESTARTS   AGE
    nginx-daemonset-8q4sn   1/1     Running     0          146m
    nginx-daemonset-wgkbv   1/1     Running     0          157m
    pi-x5m4s                0/1     Completed   0          3m

    此时通过pod日志来查看job的执行结果:kubectl logs pi-x5m4s

    [root@master service-job]# kubectl logs pi-x5m4s 
    3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337867831652712019091456485669234603486104543266482133936072602491412737245870066063155881748815209209628292540917153643678925903600113305305488204665213841469519415116094330572703657595919530921861173819326117931051185480744623799627495673518857527248912279381830119491298336733624406566430860213949463952247371907021798609437027705392171762931767523846748184676694051320005681271452635608277857713427577896091736371787214684409012249534301465495853710507922796892589235420199561121290219608640344181598136297747713099605187072113499999983729780499510597317328160963185950244594553469083026425223082533446850352619311881710100031378387528865875332083814206171776691473035982534904287554687311595628638823537875937519577818577805321712268066130019278766111959092164201989380952572010654858632788659361533818279682303019520353018529689957736225994138912497217752834791315155748572424541506959508295331168617278558890750983817546374649393192550604009277016711390098488240128583616035637076601047101819429555961989467678374494482553797747268471040475346462080466842590694912933136770289891521047521620569660240580381501935112533824300355876402474964732639141992726042699227967823547816360093417216412199245863150302861829745557067498385054945885869269956909272107975093029553211653449872027559602364806654991198818347977535663698074265425278625518184175746728909777727938000816470600161452491921732172147723501414419735685481613611573525521334757418494684385233239073941433345477624168625189835694855620992192221842725502542568876717904946016534668049886272327917860857843838279679766814541009538837863609506800642251252051173929848960841284886269456042419652850222106611863067442786220391949450471237137869609563643719172874677646575739624138908658326459958133904780275901

    有时也会同时运行多个pod来提高job的执行效率,此时可以通过设置.spec.completions和.spec.parallelism属性来完成不同的任务。

    completions表示成功完成的任务数量,parallelism表示并行任务数量,默认都为1.当parallelism设置为0时,job将被暂停。比如:

    当Job complete,将不会创建pod,old pod也不会被删除,这样可以查看log。同时,Job也存在,这样可以查看status。可以通过kubectl delete来人工删除。

    [root@master service-job]# kubectl delete -f job.yaml 
    job.batch "pi" deleted
    
    或者
    [root@master service-job]# kubectl delete job pi
    job.batch "pi" deleted

    Job终止可能因为失败次数超过.spec.backoffLimit,或者因为job的运行时间炒超过设置的.spec.activeDeadlineSeconds。当Job的运行时间超过activeDeadlineSeconds,所有运行的pod被终止,Job状态变为Failed,reason: DeadlineExceeded。

    CronJob

    Linux 中有 cron 程序定时执行任务,Kubernetes 的 CronJob 提供了类似的功能,可以定时执行 Job,解决了某些批处理任务需要定时反复执行的问题。

    一个CronJob示例:

    apiVersion: batch/v1beta1
    kind: CronJob
    metadata:
      name: hello
    spec:
      schedule: "*/1 * * * *"
      jobTemplate:
        spec:
          template:
            spec:
              containers:
              - name: hello
                image: busybox
                command: ["echo","hello k8s job!"]
              restartPolicy: OnFailure

    schedule 指定什么时候运行 Job,其格式与 Linux cron 一致。这里 */1 * * * * 的含义是每一分钟启动一次。

    等待几分钟,然后通过 kubectl get jobs 查看 Job 的执行情况:

    [root@master service-cronjob]# kubectl get cronjob
    NAME    SCHEDULE      SUSPEND   ACTIVE   LAST SCHEDULE   AGE
    hello   */1 * * * *   False     0        39s             7m32s
    [root@master service-cronjob]# kubectl get job
    NAME               COMPLETIONS   DURATION   AGE
    hello-1619459040   1/1           16s        2m46s
    hello-1619459100   1/1           17s        106s
    hello-1619459160   1/1           16s        46s

    通过AGE发现 每个job都比之前的多了 60s,即每一分钟执行一次job

    使用 kubect get pods 和 kubectl logs 命令查看:

    [root@master service-cronjob]# kubectl get pods
    NAME                     READY   STATUS      RESTARTS   AGE
    hello-1619459100-gxn27   0/1     Completed   0          2m51s
    hello-1619459160-f5p8x   0/1     Completed   0          111s
    hello-1619459220-f2k76   0/1     Completed   0          51s
    [root@master service-cronjob]# kubectl logs hello-1619459100-gxn27
    hello k8s job!

    参考:

    https://www.pianshen.com/article/80111234551/

    https://zhuanlan.zhihu.com/p/88202304

    StatefulSet:https://blog.csdn.net/weixin_44729138/article/details/106054025

    Job:https://www.cnblogs.com/benjamin77/p/9903280.html

  • 相关阅读:
    ACR2010_TNF拮抗剂促进SpA患者椎体侵蚀的修复
    2010年10月第1期(ACR2010专刊AS篇)_中信国健临床通讯目录
    ACR2010_中轴型SpA患者使用TNF拮抗剂治疗后放射学进展与全身炎症消退相关
    ACR2010_小剂量依那西普对达到缓解的AS患者有效
    ACR2010_在高风险人群中应用新版RA分类标准可能发现更多临床前RA
    ACR2010_常规医疗环境下TNF拮抗剂对RA骨侵蚀的修复作用
    ACR2010_HLA B27阳性的极早期AS患者停用TNF拮抗剂后疗效持续: 3个月随机安慰剂对照试验后随访40周
    .net委托与事件 中庸
    筛选法因子之和
    POJ2488 A Knight's Journey 解题报告
  • 原文地址:https://www.cnblogs.com/xulan0922/p/14649016.html
Copyright © 2020-2023  润新知