• Kubernetes:Pod总结(二)


    Blog:博客园 个人

    承接上文

    在实际的生产使用场景中,直接用 Pod 是不合适的,因为必然会产生单点故障。因此,我们需要有一种方法来方便地创建、管理同一个服务的多个实例 Pod。Kubernetes 中引入了 Workload(工作负载) 的概念,它可以理解为 Pod 的父资源,主要的作用就是来管理多个 Pod 的生命周期。

    Workload资源主要分为以下几类:

    • Deployment 和 ReplicaSet :最常见的类型,用来管理集群上的无状态应用。
    • DaemonSet:在集群的每个节点上部署一个 Pod,适用于各种 agent 业务的场景。 such as a networking helper tool, or be part of an add-on.
    • StatefulSet:适用于各种有状态服务的场景。 例如,如果负载会将数据作持久存储,可以运行一个 StatefulSet,将每个 Pod 与某个 PersistentVolume 对应起来。
    • Job 和 CronJob: 用于一些自动化任务。Job 用来表达的是一次性的任务,而 CronJob 会根据其时间规划反复运行。

    接下来将详细介绍几种Workload资源的使用方法。

    Deployment 和 ReplicaSet

    通常,我们不直接创建Pod,而是通过Deployment来创建Pod,由 Deployment 来负责创建、更新、维护其所管理的所有 Pods。而ReplicaSet则负责控制replicas(副本)的数量。

    接下来,使用以下deployment作为例子来剖析两者的关系:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      labels:
        app: nginx
      name: nginx
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
            - image: nginx:latest
              name: nginx
          topologySpreadConstraints:
            - topologyKey: address
              maxSkew: 1
              whenUnsatisfiable: DoNotSchedule
              labelSelector:
                matchLabels:
                  app: nginx
    

    创建这个deployment:

    [root@master-1 test]# kubectl create -f nginx.yml 
    deployment.apps/nginx created
    [root@master-1 test]# kubectl get pod -o wide
    NAME                     READY   STATUS    RESTARTS   AGE   IP             NODE     NOMINATED NODE   READINESS GATES
    nginx-58c948c775-5hbhf   1/1     Running   0          20s   10.16.84.138   node-1   <none>           <none>
    nginx-58c948c775-vfdp8   1/1     Running   0          20s   10.16.247.19   node-2   <none>           <none>
    

    通过kubectl describe deploy nginx可知,有ScalingReplicaSet信息:

    Events:
      Type    Reason             Age   From                   Message
      ----    ------             ----  ----                   -------
      Normal  ScalingReplicaSet  79s   deployment-controller  Scaled up replica set nginx-58c948c775 to 2
    

    可以清晰的看到2个pod实例是通过replicaset生成的:

    [root@master-1 test]# kubectl get rs nginx-58c948c775
    NAME               DESIRED   CURRENT   READY   AGE
    nginx-58c948c775   2         2         2       4m22s
    [root@master-1 test]# kubectl describe rs nginx-58c948c775
    Name:           nginx-58c948c775
    Namespace:      default
    Selector:       app=nginx,pod-template-hash=58c948c775
    Labels:         app=nginx
                    pod-template-hash=58c948c775
    Annotations:    deployment.kubernetes.io/desired-replicas: 2
                    deployment.kubernetes.io/max-replicas: 3
                    deployment.kubernetes.io/revision: 1
    Controlled By:  Deployment/nginx
    Replicas:       2 current / 2 desired
    Pods Status:    2 Running / 0 Waiting / 0 Succeeded / 0 Failed
    Pod Template:
      Labels:  app=nginx
               pod-template-hash=58c948c775
      Containers:
       nginx:
        Image:        nginx:latest
        Port:         <none>
        Host Port:    <none>
        Environment:  <none>
        Mounts:       <none>
      Volumes:        <none>
    Events:
      Type    Reason            Age    From                   Message
      ----    ------            ----   ----                   -------
      Normal  SuccessfulCreate  4m31s  replicaset-controller  Created pod: nginx-58c948c775-5hbhf
      Normal  SuccessfulCreate  4m31s  replicaset-controller  Created pod: nginx-58c948c775-vfdp8
    

    说明:

    • NAME:列出名字空间中 ReplicaSet 的名称;
    • DESIRED:显示应用的期望副本个数,即在创建 Deployment 时所定义的值。 此为期望状态;
    • CURRENT:显示当前运行状态中的副本个数;
    • READY:显示应用中有多少副本可以为用户提供服务;
    • AGE:显示应用已经运行的时间长度。

    总结

    • 通过kubectl create创建一个deployment,那么此时就会调用deployment-controller创建一个replicaset;
    • replicaset则会调用replicaset-controller创建相应的pod;
    • 最后由default-scheduler将pod分配到对应的node节点。

    注意:尽管 ReplicaSet 可以独立使用,目前它们的主要用途是提供给 Deployment 作为 编排 Pod 创建、删除和更新的一种机制。

    DaemonSet

    DaemonSet确保全部(或者某些)节点上运行一个 Pod 的副本。 当有节点加入集群时, 也会为他们新增一个 Pod 。 当有节点从集群移除时,这些 Pod 也会被回收。删除 DaemonSet 将会删除它创建的所有 Pod。

    DaemonSet 的一些典型用法:

    • 在每个节点上运行集群守护进程,例如ceph。
    • 在每个节点上运行日志收集守护进程,例如filebeat、logstash。
    • 在每个节点上运行监控守护进程,例如Promethues Node Exporter。

    例如:

    apiVersion: apps/v1
    kind: DaemonSet
    metadata:
      name: nginx-ds
      namespace: default
    spec:
      selector:
        matchLabels:
          app: nginx-ds
          release: stable
      template:
        metadata:
          labels:
            app: nginx-ds
            release: stable
        spec:
          containers:
          - name: nginx-ds
            image: nginx:latest
            imagePullPolicy: IfNotPresent
            ports:
            - name: http
              containerPort: 80
    

    创建DaemonSet:

    [root@master-1 test]# kubectl create -f nginx-ds.yml 
    daemonset.apps/nginx-ds created
    [root@master-1 test]# kubectl get pod -o wide
    NAME             READY   STATUS    RESTARTS   AGE   IP             NODE     NOMINATED NODE   READINESS GATES
    nginx-ds-fhz7n   1/1     Running   0          97s   10.16.84.139   node-1   <none>           <none>
    nginx-ds-jvc9p   1/1     Running   0          97s   10.16.247.20   node-2   <none>           <none>
    

    注意: apiVersionkindmetadata 也是DaemonSet必需字段。

    调度指定节点:

    • nodeSelector:只调度到匹配指定 label 的 Node 上

    • nodeAffinity:功能更丰富的 Node 选择器,比如支持集合操作

    • podAffinity:调度到满足条件的 Pod 所在的 Node 上

    StatefulSet

    StatefulSet是Kubernetes中有状态应用管理的标准实现,本质上是Deployment的一种变体。

    在日常开发的应用中,通常可以分为两类:有状态无状态,比如web服务通常都是无状态的,web应用数据主要来自后端存储、缓存等中间件,而本身并不保存数据;而MySQL、Redis等中间件是有状态的,其数据也是应用自身的一部分,由此可以看出有状态应用本身会包含两部分:应用与数据。

    Jobs

    Job 会创建一个或者多个 Pods,并将继续重试 Pods 的执行,直到指定数量的 Pods 成功终止。 随着 Pods 成功结束,Job 跟踪记录成功完成的 Pods 个数。 当数量达到指定的成功个数阈值时,任务(即 Job)结束。 删除 Job 的操作会清除所创建的全部 Pods。 挂起 Job 的操作会删除 Job 的所有活跃 Pod,直到 Job 被再次恢复执行。

    示例:

    kubectl apply -f https://kubernetes.io/examples/controllers/job.yaml
    

    查看Pods:

    [root@master-1 test]# kubectl get pods
    NAME       READY   STATUS    RESTARTS   AGE
    pi-bkpn8   1/1     Running   0          36s
    

    查看输出:

    [root@master-1 test]# kubectl logs pi-bkpn8
    3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337867831652712019091456485669234603486104543266482133936072602491412737245870066063155881748815209209628292540917153643678925903600113305305488204665213841469519415116094330572703657595919530921861173819326117931051185480744623799627495673518857527248912279381830119491298336733624406566430860213949463952247371907021798609437027705392171762931767523846748184676694051320005681271452635608277857713427577896091736371787214684409012249534301465495853710507922796892589235420199561121290219608640344181598136297747713099605187072113499999983729780499510597317328160963185950244594553469083026425223082533446850352619311881710100031378387528865875332083814206171776691473035982534904287554687311595628638823537875937519577818577805321712268066130019278766111959092164201989380952572010654858632788659361533818279682303019520353018529689957736225994138912497217752834791315155748572424541506959508295331168617278558890750983817546374649393192550604009277016711390098488240128583616035637076601047101819429555961989467678374494482553797747268471040475346462080466842590694912933136770289891521047521620569660240580381501935112533824300355876402474964732639141992726042699227967823547816360093417216412199245863150302861829745557067498385054945885869269956909272107975093029553211653449872027559602364806654991198818347977535663698074265425278625518184175746728909777727938000816470600161452491921732172147723501414419735685481613611573525521334757418494684385233239073941433345477624168625189835694855620992192221842725502542568876717904946016534668049886272327917860857843838279679766814541009538837863609506800642251252051173929848960841284886269456042419652850222106611863067442786220391949450471237137869609563643719172874677646575739624138908658326459958133904780275901
    

    Tips:Job 完成时不会再创建新的 Pod,不过已有的 Pod 通常也不会被删除。 保留这些 Pod 使得你可以查看已完成的 Pod 的日志输出,以便检查错误、警告 或者其它诊断性输出。 Job 完成时 Job 对象也一样被保留下来,这样你就可以查看它的状态。 在查看了 Job 状态之后删除老的 Job 的操作留给了用户自己。

    删除Job:

    [root@master-1 test]# kubectl delete jobs/pi
    job.batch "pi" deleted
    

    也可通过CronJob来清理。

    CronJob

    FEATURE STATE: Kubernetes v1.21 [stable]

    CronJob 创建基于时隔重复调度的 Jobs。它用 Cron 格式进行编写, 并周期性地在给定的调度时间执行 Job。

    示例:

    apiVersion: batch/v1
    kind: CronJob
    metadata:
      name: hello
    spec:
      schedule: "*/1 * * * *"
      jobTemplate:
        spec:
          template:
            spec:
              containers:
              - name: hello
                image: busybox
                imagePullPolicy: IfNotPresent
                command:
                - /bin/sh
                - -c
                - date; echo Hello from the Kubernetes cluster
              restartPolicy: OnFailure
    
  • 相关阅读:
    中南财经政法大学深圳校友会政法分会上线
    我们为什么需要校友录 人脈存摺
    北京印刷学院校友录试运行
    南京理工大学校友会正式上线
    我们为什么需要校友录 校友录的传播学解读
    CC校友录贴吧 CCBarV0908 正式发布
    我们为什么需要校友录 快捷的校友信息云图
    我们为什么需要校友录 精英圈子准入证 一辈子的学分
    我们为什么需要校友录 某某大学深圳校友录年底盘点
    我们为什么需要校友录 又到一年毕业时毕业感怀文集
  • 原文地址:https://www.cnblogs.com/Rohn/p/15878011.html
Copyright © 2020-2023  润新知