zoukankan      html  css  js  c++  java
  • kubernetes-控制器statefulset和Job(十三)

       从前面的学习我们知道使用Deployment创建的pod是无状态的,当挂载了Volume之后,如果该pod挂了,Replication Controller会再启动一个pod来保证可用性,但是由于pod是无状态的,pod挂了就会和之前的Volume的关系断开,新创建的Pod无法找到之前的Pod。但是对于用户而言,他们对底层的Pod挂了是没有感知的,但是当Pod挂了之后就无法再使用之前挂载的存储卷。

        为了解决这一问题,就引入了StatefulSet用于保留Pod的状态信息。

        StatefulSet是为了解决有状态服务的问题(对应Deployments和ReplicaSets是为无状态服务而设计),其应用场景包括:

    • 1、稳定的持久化存储,即Pod重新调度后还是能访问到相同的持久化数据,基于PVC来实现
    • 2、稳定的网络标志,即Pod重新调度后其PodName和HostName不变,基于Headless Service(即没有Cluster IP的Service)来实现
    • 3、有序部署,有序扩展,即Pod是有顺序的,在部署或者扩展的时候要依据定义的顺序依次依次进行(即从0到N-1,在下一个Pod运行之前所有之前的Pod必须都是Running和Ready状态),基于init containers来实现
    • 4、有序收缩,有序删除(即从N-1到0)
    • 5、有序的滚动更新

    参考:https://kubernetes.io/docs/tutorials/stateful-application/basic-stateful-set/

     创建statefulSet示例
    [root@k8s-master1 volume]# cat nginx-demo.yaml
    apiVersion: v1
    kind: Service
    metadata:
      name: nginx
      labels:
        app: nginx
    spec:
      ports:
      - port: 80
        name: web
      clusterIP: None
      selector:
        app: nginx
    ---
    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: web
    spec:
      selector:
        matchLabels:
          app: nginx
      serviceName: "nginx"
      replicas: 3
      template:
        metadata:
          labels:
            app: nginx
        spec:
          terminationGracePeriodSeconds: 10
          containers:
          - name: nginx
            image: nginx 
            ports:
            - containerPort: 80
              name: web
            volumeMounts:
            - name: www
              mountPath: /usr/share/nginx/html
      volumeClaimTemplates:
      - metadata:
          name: www
        spec:
          accessModes: [ "ReadWriteOnce" ]
          storageClassName: "managed-nfs-storage"
          resources:
            requests:
              storage: 1Gi
    
    [root@k8s-master1 volume]# kubectl apply -f nginx-demo.yaml 
    service/nginx created
    statefulset.apps/web created
    [root@k8s-master1 volume]# kubectl get svc,sts    #查看无头服务,svc的CLUSTER—IP为None
    NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
    service/kubernetes   ClusterIP   10.0.0.1     <none>        443/TCP   9d
    service/nginx        ClusterIP   None         <none>        80/TCP    13s
    
    NAME                   READY   AGE
    statefulset.apps/web   1/3     13s
    [root@k8s-master1 volume]# kubectl get pv,pvc    #查看pv动态供给
    NAME                                                                          CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM               STORAGECLASS          REASON   AGE
    persistentvolume/default-www-web-0-pvc-7fe5d833-0a44-11e9-b58a-000c298a2b5f   1Gi        RWO            Delete           Bound    default/www-web-0   managed-nfs-storage            18s
    persistentvolume/default-www-web-1-pvc-85d17f15-0a44-11e9-b58a-000c298a2b5f   1Gi        RWO            Delete           Bound    default/www-web-1   managed-nfs-storage            14s
    persistentvolume/default-www-web-2-pvc-8aa41937-0a44-11e9-b58a-000c298a2b5f   1Gi        RWO            Delete           Bound    default/www-web-2   managed-nfs-storage            6s
    
    NAME                              STATUS   VOLUME                                                       CAPACITY   ACCESS MODES   STORAGECLASS          AGE
    persistentvolumeclaim/www-web-0   Bound    default-www-web-0-pvc-7fe5d833-0a44-11e9-b58a-000c298a2b5f   1Gi        RWO            managed-nfs-storage   24s
    persistentvolumeclaim/www-web-1   Bound    default-www-web-1-pvc-85d17f15-0a44-11e9-b58a-000c298a2b5f   1Gi        RWO            managed-nfs-storage   14s
    persistentvolumeclaim/www-web-2   Bound    default-www-web-2-pvc-8aa41937-0a44-11e9-b58a-000c298a2b5f   1Gi        RWO            managed-nfs-storage   6s
    [root@k8s-master1 volume]# kubectl get pod    #查看pod
    NAME                                    READY   STATUS    RESTARTS   AGE
    nfs-client-provisioner-f69cd5cf-rfbdb   1/1     Running   0          2m16s
    web-0                                   1/1     Running   0          33s
    web-1                                   1/1     Running   0          23s
    web-2                                   1/1     Running   0          15s

    删除statefulSet,PVC依旧存在的,再重新创建pod时,依旧会重新去绑定原来的pvc

    [root@k8s-master1 volume]# kubectl delete -f nginx-demo.yaml 
    service "nginx" deleted
    statefulset.apps "web" deleted
    [root@k8s-master1 volume]# kubectl get pods -w
    NAME                                    READY   STATUS        RESTARTS   AGE
    nfs-client-provisioner-f69cd5cf-rfbdb   1/1     Running       0          7m58s
    web-0                                   0/1     Terminating   0          6m15s
    web-1                                   0/1     Terminating   0          6m5s
    web-2                                   0/1     Terminating   0          5m57s
    web-0   0/1   Terminating   0     6m17s
    web-0   0/1   Terminating   0     6m17s
    web-2   0/1   Terminating   0     5m59s
    web-2   0/1   Terminating   0     5m59s
    web-1   0/1   Terminating   0     6m11s
    web-1   0/1   Terminating   0     6m11s
    [root@k8s-master1 volume]# kubectl apply -f nginx-demo.yaml 
    service/nginx created
    statefulset.apps/web created
    [root@k8s-master1 volume]# kubectl get pv,pvc
    NAME                                                                          CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM               STORAGECLASS          REASON   AGE
    persistentvolume/default-www-web-0-pvc-7fe5d833-0a44-11e9-b58a-000c298a2b5f   1Gi        RWO            Delete           Bound    default/www-web-0   managed-nfs-storage            9m34s
    persistentvolume/default-www-web-1-pvc-85d17f15-0a44-11e9-b58a-000c298a2b5f   1Gi        RWO            Delete           Bound    default/www-web-1   managed-nfs-storage            9m30s
    persistentvolume/default-www-web-2-pvc-8aa41937-0a44-11e9-b58a-000c298a2b5f   1Gi        RWO            Delete           Bound    default/www-web-2   managed-nfs-storage            9m22s
    
    NAME                              STATUS   VOLUME                                                       CAPACITY   ACCESS MODES   STORAGECLASS          AGE
    persistentvolumeclaim/www-web-0   Bound    default-www-web-0-pvc-7fe5d833-0a44-11e9-b58a-000c298a2b5f   1Gi        RWO            managed-nfs-storage   9m40s
    persistentvolumeclaim/www-web-1   Bound    default-www-web-1-pvc-85d17f15-0a44-11e9-b58a-000c298a2b5f   1Gi        RWO            managed-nfs-storage   9m30s
    persistentvolumeclaim/www-web-2   Bound    default-www-web-2-pvc-8aa41937-0a44-11e9-b58a-000c298a2b5f   1Gi        RWO            managed-nfs-storage   9m22s
    滚动更新

    RollingUpdate 更新策略在 StatefulSet 中实现 Pod 的自动滚动更新。 当StatefulSet的 .spec.updateStrategy.type 设置为 RollingUpdate 时,默认为:RollingUpdate。StatefulSet 控制器将在 StatefulSet 中删除并重新创建每个 Pod。 它将以与 Pod 终止相同的顺序进行(从最大的序数到最小的序数),每次更新一个 Pod。 在更新其前身之前,它将等待正在更新的 Pod 状态变成正在运行并就绪。如下操作的滚动更新是有2-0的顺序更新。

    [root@k8s-master1 volume]# vim nginx-demo.yaml 
    [root@k8s-master1 volume]# kubectl apply -f nginx-demo.yaml 
    service/nginx unchanged
    statefulset.apps/web configured
    [root@k8s-master1 volume]# kubectl get pods -w
    NAME                                    READY   STATUS        RESTARTS   AGE
    nfs-client-provisioner-f69cd5cf-rfbdb   1/1     Running       0          14m
    web-0                                   1/1     Running       0          3m42s
    web-1                                   1/1     Running       0          3m34s
    web-2                                   0/1     Terminating   0          3m24s
    web-2   0/1   Terminating   0     3m35s
    web-2   0/1   Terminating   0     3m35s
    web-2   0/1   Pending   0     0s
    web-2   0/1   Pending   0     0s
    web-2   0/1   ContainerCreating   0     0s
    web-2   1/1   Running   0     7s
    web-1   1/1   Terminating   0     3m52s
    web-1   0/1   Terminating   0     3m53s
    web-1   0/1   Terminating   0     3m54s
    web-1   0/1   Terminating   0     3m54s
    web-1   0/1   Pending   0     0s
    web-1   0/1   Pending   0     0s
    web-1   0/1   ContainerCreating   0     0s
    web-1   1/1   Running   0     23s
    web-0   1/1   Terminating   0     4m25s
    web-0   0/1   Terminating   0     4m26s
    web-0   0/1   Terminating   0     4m33s
    web-0   0/1   Terminating   0     4m33s
    web-0   0/1   Pending   0     0s
    web-0   0/1   Pending   0     0s
    web-0   0/1   ContainerCreating   0     0s
    web-0   1/1   Running   0     4s
    扩展伸缩
    [root@k8s-master1 volume]# kubectl scale sts web --replicas=5  #扩展到5个副本
    statefulset.apps/web scaled
    [root@k8s-master1 volume]# kubectl get pod -w    #动态查看扩容
    NAME                                    READY   STATUS              RESTARTS   AGE
    nfs-client-provisioner-f69cd5cf-rfbdb   1/1     Running             0          25m
    web-0                                   1/1     Running             0          9m40s
    web-1                                   1/1     Running             0          10m
    web-2                                   1/1     Running             0          10m
    web-3                                   0/1     ContainerCreating   0          12s
    web-3   1/1   Running   0     21s
    web-4   0/1   Pending   0     0s
    web-4   0/1   Pending   0     0s
    web-4   0/1   Pending   0     1s
    web-4   0/1   ContainerCreating   0     1s
    web-4   1/1   Running   0     9s
    [root@k8s-master1 volume]# kubectl get pv,pvc    #查看pv绑定
    NAME                                                                          CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM               STORAGECLASS          REASON   AGE
    persistentvolume/default-www-web-0-pvc-7fe5d833-0a44-11e9-b58a-000c298a2b5f   1Gi        RWO            Delete           Bound    default/www-web-0   managed-nfs-storage            25m
    persistentvolume/default-www-web-1-pvc-85d17f15-0a44-11e9-b58a-000c298a2b5f   1Gi        RWO            Delete           Bound    default/www-web-1   managed-nfs-storage            25m
    persistentvolume/default-www-web-2-pvc-8aa41937-0a44-11e9-b58a-000c298a2b5f   1Gi        RWO            Delete           Bound    default/www-web-2   managed-nfs-storage            25m
    persistentvolume/default-www-web-3-pvc-c7efc39f-0a47-11e9-b58a-000c298a2b5f   1Gi        RWO            Delete           Bound    default/www-web-3   managed-nfs-storage            2m10s
    persistentvolume/default-www-web-4-pvc-d498cf02-0a47-11e9-b58a-000c298a2b5f   1Gi        RWO            Delete           Bound    default/www-web-4   managed-nfs-storage            112s
    
    NAME                              STATUS   VOLUME                                                       CAPACITY   ACCESS MODES   STORAGECLASS          AGE
    persistentvolumeclaim/www-web-0   Bound    default-www-web-0-pvc-7fe5d833-0a44-11e9-b58a-000c298a2b5f   1Gi        RWO            managed-nfs-storage   25m
    persistentvolumeclaim/www-web-1   Bound    default-www-web-1-pvc-85d17f15-0a44-11e9-b58a-000c298a2b5f   1Gi        RWO            managed-nfs-storage   25m
    persistentvolumeclaim/www-web-2   Bound    default-www-web-2-pvc-8aa41937-0a44-11e9-b58a-000c298a2b5f   1Gi        RWO            managed-nfs-storage   25m
    persistentvolumeclaim/www-web-3   Bound    default-www-web-3-pvc-c7efc39f-0a47-11e9-b58a-000c298a2b5f   1Gi        RWO            managed-nfs-storage   2m13s
    persistentvolumeclaim/www-web-4   Bound    default-www-web-4-pvc-d498cf02-0a47-11e9-b58a-000c298a2b5f   1Gi        RWO            managed-nfs-storage   112s
    
    [root@k8s-master1 volume]# kubectl patch sts web -p '{"spec":{"replicas":2}}'  #缩容到两个副本
    statefulset.apps/web patched
    [root@k8s-master1 volume]# kubectl get pod -w    #动态查看缩容
    NAME                                    READY   STATUS        RESTARTS   AGE
    nfs-client-provisioner-f69cd5cf-rfbdb   1/1     Running       0          28m
    web-0                                   1/1     Running       0          12m
    web-1                                   1/1     Running       0          13m
    web-2                                   1/1     Running       0          13m
    web-3                                   1/1     Running       0          3m16s
    web-4                                   0/1     Terminating   0          2m55s
    web-4   0/1   Terminating   0     2m57s
    web-4   0/1   Terminating   0     2m57s
    web-3   1/1   Terminating   0     3m18s
    web-3   0/1   Terminating   0     3m19s
    web-3   0/1   Terminating   0     3m22s
    web-3   0/1   Terminating   0     3m22s
    web-2   1/1   Terminating   0     13m
    web-2   0/1   Terminating   0     13m
    web-2   0/1   Terminating   0     13m
    web-2   0/1   Terminating   0     13m
    更新策略
    [root@k8s-master1 volume]# kubectl patch sts web -p '{"spec":{"updateStrategy":{"rollingUpdate":{"partition":2}}}}'
    statefulset.apps/web patched
    [root@k8s-master1 volume]# kubectl describe sts web
    Name:               web
    Namespace:          default
    CreationTimestamp:  Fri, 28 Dec 2018 10:11:01 +0800
    Selector:           app=nginx
    Labels:             <none>
    Annotations:        kubectl.kubernetes.io/last-applied-configuration:
                          {"apiVersion":"apps/v1","kind":"StatefulSet","metadata":{"annotations":{},"name":"web","namespace":"default"},"spec":{"replicas":3,"select...
    Replicas:           824638349112 desired | 2 total
    Update Strategy:    RollingUpdate
      Partition:        824638947612
    Pods Status:        2 Running / 0 Waiting / 0 Succeeded / 0 Failed
    。。。
    版本升级
    [root@k8s-master1 volume]# kubectl get sts -o wide
    NAME   READY   AGE   CONTAINERS   IMAGES
    web    2/2     29m   nginx        nginx:1.14
    [root@k8s-master1 volume]# kubectl set image sts/web nginx=nginx:1.15
    statefulset.apps/web image updated
    [root@k8s-master1 volume]# kubectl get sts -o wide
    NAME   READY   AGE   CONTAINERS   IMAGES
    web    2/2     32m   nginx        nginx:1.15

    headless service做dns解析是直接解析到pod的

    [root@k8s-master1 volume]# kubectl get pod,svc -o wide
    NAME                                        READY   STATUS    RESTARTS   AGE   IP            NODE            NOMINATED NODE   READINESS GATES
    pod/nfs-client-provisioner-f69cd5cf-rfbdb   1/1     Running   0          74m   172.17.73.3   192.168.0.126   <none>           <none>
    pod/web-0                                   1/1     Running   0          59m   172.17.32.3   192.168.0.125   <none>           <none>
    pod/web-1                                   1/1     Running   0          59m   172.17.73.5   192.168.0.126   <none>           <none>
    
    NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE   SELECTOR
    service/kubernetes   ClusterIP   10.0.0.1     <none>        443/TCP   9d    <none>
    service/nginx        ClusterIP   None         <none>        80/TCP    63m   app=nginx
    [root@k8s-master1 volume]# kubectl run -it --image=busybox:1.28.4 --rm --restart=Never sh
    If you don't see a command prompt, try pressing enter.
    / # nslookup web-0.nginx
    Server:    10.0.0.2
    Address 1: 10.0.0.2 kube-dns.kube-system.svc.cluster.local
    
    Name:      web-0.nginx
    Address 1: 172.17.32.3 web-0.nginx.default.svc.cluster.local
    / # nslookup web-1.nginx
    Server:    10.0.0.2
    Address 1: 10.0.0.2 kube-dns.kube-system.svc.cluster.local
    
    Name:      web-1.nginx
    Address 1: 172.17.73.5 web-1.nginx.default.svc.cluster.local

    JOB

    https://kubernetes.io/docs/concepts/workloads/controllers/jobs-run-to-completion/

    Job分为普通任务(Job)和定时任务(CronJob)

    一次性执行

    应用场景:离线数据处理,视频解码等业务

    job示例
    [root@k8s-master1 ~]# vim job.yaml 
    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
    
    [root@k8s-master1 ~]# kubectl apply -f job.yaml
    job.batch/pi created
    [root@k8s-master1 ~]# kubectl get pod
    NAME                                    READY   STATUS      RESTARTS   AGE
    nfs-client-provisioner-f69cd5cf-rfbdb   1/1     Running     0          87m
    pi-nslj8                                0/1     Completed   0          119s
    web-0                                   1/1     Running     0          71m
    web-1                                   1/1     Running     0          72m
    [root@k8s-master1 ~]# kubectl logs pi-nslj8
    3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337867831652712019091456485669234603486104543266482133936072602491412737245870066063155881748815209209628292540917153643678925903600113305305488204665213841469519415116094330572703657595919530921861173819326117931051185480744623799627495673518857527248912279381830119491298336733624406566430860213949463952247371907021798609437027705392171762931767523846748184676694051320005681271452635608277857713427577896091736371787214684409012249534301465495853710507922796892589235420199561121290219608640344181598136297747713099605187072113499999983729780499510597317328160963185950244594553469083026425223082533446850352619311881710100031378387528865875332083814206171776691473035982534904287554687311595628638823537875937519577818577805321712268066130019278766111959092164201989380952572010654858632788659361533818279682303019520353018529689957736225994138912497217752834791315155748572424541506959508295331168617278558890750983817546374649393192550604009277016711390098488240128583616035637076601047101819429555961989467678374494482553797747268471040475346462080466842590694912933136770289891521047521620569660240580381501935112533824300355876402474964732639141992726042699227967823547816360093417216412199245863150302861829745557067498385054945885869269956909272107975093029553211653449872027559602364806654991198818347977535663698074265425278625518184175746728909777727938000816470600161452491921732172147723501414419735685481613611573525521334757418494684385233239073941433345477624168625189835694855620992192221842725502542568876717904946016534668049886272327917860857843838279679766814541009538837863609506800642251252051173929848960841284886269456042419652850222106611863067442786220391949450471237137869609563643719172874677646575739624138908658326459958133904780275898

    cronjob

    https://kubernetes.io/docs/tasks/job/automated-tasks-with-cron-jobs/

    定时任务,像Linux的Crontab一样。

    应用场景:通知,备份

    cronjob示例

    [root@k8s-master1 ~]# vim cronjob.yaml 
    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
    
    [root@k8s-master1 ~]# kubectl apply -f cronjob.yaml
    cronjob.batch/hello created
    [root@k8s-master1 ~]# kubectl get cronjob
    NAME    SCHEDULE      SUSPEND   ACTIVE   LAST SCHEDULE   AGE
    hello   */1 * * * *   False     1        5s              8s
    [root@k8s-master1 ~]# kubectl get pod
    NAME                                    READY   STATUS              RESTARTS   AGE
    hello-1545968100-zhf2w                  0/1     Completed           0          67s
    hello-1545968160-zftxj                  0/1     ContainerCreating   0          7s
    nfs-client-provisioner-f69cd5cf-rfbdb   1/1     Running             0          96m
    pi-nslj8                                0/1     Completed           0          10m
    web-0                                   1/1     Running             0          80m
    web-1                                   1/1     Running             0          81m
    [root@k8s-master1 ~]# kubectl logs hello-1545968100-zhf2w
    Fri Dec 28 03:35:14 UTC 2018
    Hello from the Kubernetes cluster
  • 相关阅读:
    delphi7在windows server 2003企业版上不能打开项目的选项(Options)窗口的解决方法
    简单的两个字“谢谢”,会让我坚持我的写作,我也要谢谢你们
    F41GUT 安装Windows server 2003系统后无法安装显卡驱动的解决办法
    远程桌面无法登录windows server 2003服务器
    F41GUT 安装Windows server 2003系统后无法安装显卡驱动的解决办法
    MS SQL Server 2000版在windows server 2003企业版系统上运行时造成数据库suspect的解决方法
    delphi7在windows server 2003企业版上不能打开项目的选项(Options)窗口的解决方法
    远程桌面无法登录windows server 2003服务器
    MS SQL Server 2000版在windows server 2003企业版系统上运行时造成数据库suspect的解决方法
    关于ajax 和josn
  • 原文地址:https://www.cnblogs.com/yuezhimi/p/10186463.html
Copyright © 2011-2022 走看看