简介

k8s中所有的内容都抽象为资源, 资源实例化之后,叫做对象。

资源类型介绍

  • 工作负载型资源对象(workload):Pod,ReplicaSet,Deployment,StatefulSet,DaemonSet,Job,Cronjob …
  • 服务发现及均衡资源对象:Service,Ingress …
  • 配置与存储资源对象:Volume(存储卷),CSI(容器存储接口,可以扩展各种各样的第三方存储卷),ConfigMap,Secret,DownwardAPI
  • 集群级资源:Namespace,Node,Role,ClusterRole,RoleBinding,ClusterRoleBinding
  • 元数据型资源:HPA,PodTemplate,LimitRange

工作负载资源

Deployment

为了更好地解决服务编排的问题,k8s在V1.2版本开始,引入了deployment控制器,值得一提的是,这种控制器并不直接管理pod,
而是通过管理replicaset来间接管理pod,即:deployment管理replicaset,replicaset管理pod。所以deployment比replicaset的功能更强大。

img

deployment的主要功能有下面几个:

  • 支持replicaset的所有功能
  • 支持发布的停止、继续
  • 支持版本的滚动更新和版本回退

编写资源清单

 1  $ cat test-deploy.yaml
 2  apiVersion: apps/v1
 3  kind: Deployment
 4  metadata:
 5    name: test-deployment
 6    namespace: dev
 7  spec:
 8    replicas: 3
 9    selector:
10      matchLabels:
11       app: nginx-pod
12    template:
13      metadata:
14        labels:
15          app: nginx-pod
16      spec:
17        containers:
18        - name: nginx
19          image: nginx:1.17.1
20  

运行清单

$ k apply -f test-deploy.yaml
deployment.apps/test-deployment created 

查看效果

$ k get deploy -A
  NAMESPACE              NAME                           READY   UP-TO-DATE   AVAILABLE   AGE
  dev                    test-deployment                3/3     3            3           94s
  guestbook-system       guestbook-controller-manager   1/1     1            1           59d
  kube-system            coredns                        2/2     2            2           63d
  kubernetes-dashboard   dashboard-metrics-scraper      1/1     1            1           14d
  kubernetes-dashboard   kubernetes-dashboard           1/1     1            1           14d

可以看出deploy已经运行成功,3副本已处于READY状态。

再查看它运行中的清单:

$ k get deploy -n dev test-deployment -o yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  annotations:
    deployment.kubernetes.io/revision: "1"
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"apps/v1","kind":"Deployment","metadata":{"annotations":{},"name":"test-deployment","namespace":"dev"},"spec":{"replicas":3,"selector":{"matchLabels":{"app":"nginx-pod"}},"template":{"metadata":{"labels":{"app":"nginx-pod"}},"spec":{"containers":[{"image":"nginx:1.17.1","name":"nginx"}]}}}}
  creationTimestamp: "2022-09-28T12:35:22Z"
  generation: 1
  name: test-deployment
  namespace: dev
  resourceVersion: "5045809"
  uid: 40feb568-1343-4046-8708-7e1bf5e5c384
spec:
  #spec.progressDeadlineSeconds 是可选配置项,用来指定在系统报告Deployment的failed progressing一一表现为resource的状态中 type=Progressing 、 Status=False 、 Reason=ProgressDeadlineExceeded 前可以等待的Deployment进行的秒数。Deployment controller会继续重试该Deployment。未来,在实现了自动回滚后, deployment controller在观察到这种状态时就会自动回滚。
  progressDeadlineSeconds: 600
  #.spec.replicas 是可以选字段,指定期望的pod数量,默认是1。
  replicas: 3
  revisionHistoryLimit: 10
  #.spec.selector是可选字段,用来指定 label selector ,圈定Deployment管理的pod范围。如果被指定, .spec.selector 必须匹配 .spec.template.metadata.labels,否则它将被API拒绝。如果.spec.selector 没有被指定, .spec.selector.matchLabels 默认是.spec.template.metadata.labels。在Pod的template跟.spec.template不同或者数量超过了.spec.replicas规定的数量的情况下,Deployment会杀掉label跟selector不同的Pod。
  selector:
    matchLabels:
      app: nginx-pod
  #.spec.strategy 指定新的Pod替换旧的Pod的策略。 .spec.strategy.type 可以是"Recreate"或者是"RollingUpdate"。"RollingUpdate"是默认值。
  strategy:
    rollingUpdate:
      #spec.strategy.rollingUpdate.maxSurge 是可选配置项,用来指定可以超过期望的Pod数量的最大个数。该值可以是一个绝对值(例如5)或者是期望的Pod数量的百分比(例如10%)。当 MaxUnavailable 为0时该值不可以为0。通过百分比计算的绝对值向上取整。默认值是1。
      maxSurge: 25%
      #.spec.strategy.rollingUpdate.maxUnavailable 是可选配置项,用来指定在升级过程中不可用Pod的最大数量。该值可以是一个绝对值(例如5),也可以是期望Pod数量的百分比(例如10%)。通过计算百分比的绝对值向下取整。 如 果 .spec.strategy.rollingUpdate.maxSurge 为0时,这个值不可以为0。默认值是1。例如,该值设置成30%,启动rolling update后旧的ReplicatSet将会立即缩容到期望的Pod数量的70%。新的Pod ready后,随着新的ReplicaSet的扩容,旧的ReplicaSet会进一步缩容确保在升级的所有时刻可以用的Pod数量至少是期望Pod数量的70%。
      maxUnavailable: 25%
    #滚动更新,简单定义 更新期间pod最多有几个等。可以指定 maxUnavailable 和 maxSurge 来控制 rolling update 进程。
    type: RollingUpdate
  #.spec.template 是 .spec中唯一要求的字段。.spec.template 是 pod template. 它跟 Pod有一模一样的schema,除了它是嵌套的并且不需要apiVersion 和 kind字段。另外为了划分Pod的范围,Deployment中的pod template必须指定适当的label(不要跟其他controller重复了,参考selector)和适当的重启策略。.spec.template.spec.restartPolicy 可以设置为 Always , 如果不指定的话这就是默认配置。
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: nginx-pod
    spec:
      containers:
      - image: nginx:1.17.1
        imagePullPolicy: IfNotPresent
        name: nginx
        resources: {}
        #terminationMessagePath 表示容器的异常终止消息的路径,默认在 /dev/termination-log 下。当容器退出时,可以通过容器的状态看到退出信息。
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
      #“ClusterFirst“:如果DNS查询与配置好的默认集群域名前缀不匹配,则将查询请求转发到从节点继承而来,作为查询的上游服务器。
      dnsPolicy: ClusterFirst
      restartPolicy: Always
      #spec:schedulername参数指定调度器的名字,可以为 pod 选择某个调度器进行调度
      schedulerName: default-scheduler
      #安全上下文(Security Context)定义 Pod 或 Container 的特权与访问控制设置。
      securityContext: {}
      terminationGracePeriodSeconds: 30
status:
  availableReplicas: 3
  conditions:
  - lastTransitionTime: "2022-09-28T12:35:25Z"
    lastUpdateTime: "2022-09-28T12:35:25Z"
    message: Deployment has minimum availability.
    reason: MinimumReplicasAvailable
    status: "True"
    type: Available
  - lastTransitionTime: "2022-09-28T12:35:22Z"
    lastUpdateTime: "2022-09-28T12:35:25Z"
    message: ReplicaSet "test-deployment-5d9c9b97bb" has successfully progressed.
    reason: NewReplicaSetAvailable
    status: "True"
    type: Progressing
  observedGeneration: 1
  readyReplicas: 3
  replicas: 3
  updatedReplicas: 3

ReplicaSet

ReplicaSet是kubernetes中的一种副本控制器,主要作用是控制由其管理的pod,使pod副本的数量始终维持在预设的个数。

kubernetes官方推荐不要直接使用ReplicaSet,用Deployments取而代之,Deployments是比ReplicaSet更高级的概念,它会管理ReplicaSet并提供很多其它有用的特性,最重要的是Deployments支持声明式更新,声明式更好相比于命令式更新的好处是不会丢失历史变更。总结起来就是:不要再直接使用ReplicaSet。

查看效果

$ k get rs -A
NAMESPACE              NAME                                      DESIRED   CURRENT   READY   AGE
dev                    test-deployment-5d9c9b97bb                3         3         3       23h
guestbook-system       guestbook-controller-manager-84cd65964f   1         1         1       60d
kube-system            coredns-78fcd69978                        2         2         2       64d
kubernetes-dashboard   dashboard-metrics-scraper-7c857855d9      1         1         1       15d
kubernetes-dashboard   kubernetes-dashboard-6b79449649           1         1         1       15d

查看清单:

$ k get rs -n dev test-deployment-5d9c9b97bb -o yaml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  annotations:
    deployment.kubernetes.io/desired-replicas: "3"
    deployment.kubernetes.io/max-replicas: "4"
    deployment.kubernetes.io/revision: "1"
  creationTimestamp: "2022-09-28T12:35:22Z"
  generation: 1
  labels:
    app: nginx-pod
    pod-template-hash: 5d9c9b97bb
  name: test-deployment-5d9c9b97bb
  namespace: dev
  ownerReferences:
  - apiVersion: apps/v1
    #控制特定的从属对象是否可以阻止垃圾收集删除其所有者对象
    blockOwnerDeletion: true
    controller: true
    kind: Deployment
    name: test-deployment
    uid: 40feb568-1343-4046-8708-7e1bf5e5c384
  resourceVersion: "5045808"
  uid: 1dc27f38-b2db-48a1-b76a-ad044e3da2d7
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx-pod
      pod-template-hash: 5d9c9b97bb
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: nginx-pod
        pod-template-hash: 5d9c9b97bb
    spec:
      containers:
      - image: nginx:1.17.1
        imagePullPolicy: IfNotPresent
        name: nginx
        resources: {}
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
      dnsPolicy: ClusterFirst
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext: {}
      terminationGracePeriodSeconds: 30
status:
  availableReplicas: 3
  fullyLabeledReplicas: 3
  observedGeneration: 1
  readyReplicas: 3
  replicas: 3

Pod

Pod是kubernetes中最小的资源管理组件,Pod也是最小化运行容器化应用的资源对象。一个Pod代表着集群中运行的一个进程。

$ k get pod -A
NAMESPACE              NAME                                            READY   STATUS    RESTARTS         AGE
dev                    test-deployment-5d9c9b97bb-7hmqb                1/1     Running   0                23h
dev                    test-deployment-5d9c9b97bb-bdwhq                1/1     Running   0                23h
dev                    test-deployment-5d9c9b97bb-l9fj2                1/1     Running   0                23h
guestbook-system       guestbook-controller-manager-84cd65964f-c2z8x   2/2     Running   184 (34h ago)    60d
kube-system            coredns-78fcd69978-s52td                        1/1     Running   7 (11d ago)      64d
kube-system            coredns-78fcd69978-z5fvx                        1/1     Running   7 (11d ago)      64d
kube-system            etcd-docker-desktop                             1/1     Running   7 (11d ago)      64d
kube-system            kube-apiserver-docker-desktop                   1/1     Running   7 (11d ago)      64d
kube-system            kube-controller-manager-docker-desktop          1/1     Running   7 (11d ago)      64d
kube-system            kube-proxy-b5954                                1/1     Running   7 (11d ago)      64d
kube-system            kube-scheduler-docker-desktop                   1/1     Running   146 (34h ago)    64d
kube-system            storage-provisioner                             1/1     Running   229 (34h ago)    64d
kube-system            vpnkit-controller                               1/1     Running   4395 (17m ago)   64d
kubernetes-dashboard   dashboard-metrics-scraper-7c857855d9-g4slf      1/1     Running   1 (11d ago)      15d
kubernetes-dashboard   kubernetes-dashboard-6b79449649-lrnz8           1/1     Running   10 (3d10h ago)   15d

查看清单:

$ k get pod -n dev test-deployment-5d9c9b97bb-7hmqb -o yaml
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: "2022-09-28T12:35:22Z"
  generateName: test-deployment-5d9c9b97bb-
  labels:
    app: nginx-pod
    pod-template-hash: 5d9c9b97bb
  name: test-deployment-5d9c9b97bb-7hmqb
  namespace: dev
  ownerReferences:
  - apiVersion: apps/v1
    blockOwnerDeletion: true
    controller: true
    kind: ReplicaSet
    name: test-deployment-5d9c9b97bb
    uid: 1dc27f38-b2db-48a1-b76a-ad044e3da2d7
  resourceVersion: "5045804"
  uid: 06aeda67-ccaa-4715-ab1a-992ae409cd12
spec:
  containers:
  - image: nginx:1.17.1
    imagePullPolicy: IfNotPresent
    name: nginx
    resources: {}
    terminationMessagePath: /dev/termination-log
    terminationMessagePolicy: File
    volumeMounts:
    - mountPath: /var/run/secrets/kubernetes.io/serviceaccount
      name: kube-api-access-sgghr
      readOnly: true
  dnsPolicy: ClusterFirst
  enableServiceLinks: true
  nodeName: docker-desktop
  #优先级在普通的 pod 执行优先级的剔除是没什么问题的,但是在 job 控制器来运行的 pod 上就是一个灾难,如果 job 控制器运行的任务计划 pod 正在执行任务,此时因为集群节点的资源不够用导致 job 的 pod 被剔除集群节点,从而导致指定运行的任务被搁置,为了解决这个问题,可以在 PriorityClass 中设置属性 preemptionPolicy ,当它的值为 preemptionLowerPriorty(默认)时,则正常执行抢占策略(表示优先级低会被剔除)。如果将值设置为 Never 时则为默认不抢占,不会被剔除而是等待调度机会。
  preemptionPolicy: PreemptLowerPriority
  priority: 0
  restartPolicy: Always
  schedulerName: default-scheduler
  securityContext: {}
  serviceAccount: default
  serviceAccountName: default
  terminationGracePeriodSeconds: 30
  tolerations:
  - effect: NoExecute
    key: node.kubernetes.io/not-ready
    operator: Exists
    tolerationSeconds: 300
  - effect: NoExecute
    key: node.kubernetes.io/unreachable
    operator: Exists
    tolerationSeconds: 300
  volumes:
  - name: kube-api-access-sgghr
    projected:
      defaultMode: 420
      sources:
      - serviceAccountToken:
          expirationSeconds: 3607
          path: token
      - configMap:
          items:
          - key: ca.crt
            path: ca.crt
          name: kube-root-ca.crt
      - downwardAPI:
          items:
          - fieldRef:
              apiVersion: v1
              fieldPath: metadata.namespace
            path: namespace
status:
  conditions:
  - lastProbeTime: null
    lastTransitionTime: "2022-09-28T12:35:22Z"
    status: "True"
    type: Initialized
  - lastProbeTime: null
    lastTransitionTime: "2022-09-28T12:35:25Z"
    status: "True"
    type: Ready
  - lastProbeTime: null
    lastTransitionTime: "2022-09-28T12:35:25Z"
    status: "True"
    type: ContainersReady
  - lastProbeTime: null
    lastTransitionTime: "2022-09-28T12:35:22Z"
    status: "True"
    type: PodScheduled
  containerStatuses:
  - containerID: docker://1453a8ace21fbf107edd376e3357e7c9880afe6c67b2fdde535092bb8c654ddf
    image: nginx:1.17.1
    imageID: docker-pullable://nginx@sha256:b4b9b3eee194703fc2fa8afa5b7510c77ae70cfba567af1376a573a967c03dbb
    lastState: {}
    name: nginx
    ready: true
    restartCount: 0
    started: true
    state:
      running:
        startedAt: "2022-09-28T12:35:24Z"
  hostIP: 192.168.65.4
  phase: Running
  podIP: 10.1.0.57
  podIPs:
  - ip: 10.1.0.57
  qosClass: BestEffort
  startTime: "2022-09-28T12:35:22Z" 

Statefulset

应用场景

  • 稳定的不共享持久化存储:即每个pod的存储资源是不共享的,且pod重新调度后还是能访问到相同的持久化数据,基于pvc实现。
  • 稳定的网络标志:即pod重新调度后其PodName和HostName不变,且PodName和HostName是相同的,基于Headless Service来实现的。
  • 有序部署,有序扩展:即pod是有顺序的,在部署或者扩展的时候是根据定义的顺序依次依序部署的(即从0到N-1,在下一个Pod运行之前所有之前的pod必都是Running状态或者Ready状态),是基于init containers来实现的。
  • 有序收缩:在pod删除时是从最后一个依次往前删除,即从N-1到0.

基于上面的特性,可以发现statefulset由以下几个部分组成:

  • 用于定义网络标志(DNS domain)的headless service
  • 用于**创建pvc的volumeClaimTemplates**
  • 具体的statefulSet应用

创建yaml文件示例

apiVersion: v1
kind: Service
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  ports:
  - port: 80
    name: web
  clusterIP: None                                 # 要点1,可以不用指定clusterIP
  selector:
    app: nginx
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: web
spec:
  serviceName: "nginx"                           # 要点2,指定serviceName名称
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:alpine
        ports:
        - containerPort: 80
          name: web

查看效果

# mosp @ mospdeMacBook-Pro in ~/study/myblog/mospan-hugo-blog on git:master x [17:35:39]
$ k get sts -A
NAMESPACE   NAME   READY   AGE
default     web    3/3     24h

# 可以看出StatefulSet不走ReplicalSet
$ k get rs -A
NAMESPACE              NAME                                      DESIRED   CURRENT   READY   AGE
guestbook-system       guestbook-controller-manager-84cd65964f   1         1         1       63d
kube-system            coredns-78fcd69978                        2         2         2       67d
kubernetes-dashboard   dashboard-metrics-scraper-7c857855d9      1         1         1       19d
kubernetes-dashboard   kubernetes-dashboard-6b79449649           1         1         1       19d

# mosp @ mospdeMacBook-Pro in ~/study/myblog/mospan-hugo-blog on git:master x [11:11:00]
$ k get svc -A
NAMESPACE              NAME                                           TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                  AGE
default                kubernetes                                     ClusterIP   10.96.0.1       <none>        443/TCP                  67d
default                nginx                                          ClusterIP   None            <none>        80/TCP                   24h
guestbook-system       guestbook-controller-manager-metrics-service   ClusterIP   10.107.190.68   <none>        8443/TCP                 63d
kube-system            kube-dns                                       ClusterIP   10.96.0.10      <none>        53/UDP,53/TCP,9153/TCP   67d
kubernetes-dashboard   dashboard-metrics-scraper                      ClusterIP   10.96.38.104    <none>        8000/TCP                 19d
kubernetes-dashboard   kubernetes-dashboard                           ClusterIP   10.102.50.227   <none>        443/TCP                  19d

# mosp @ mospdeMacBook-Pro in ~/study/myblog/mospan-hugo-blog on git:master x [11:11:13]
$ k get pod -A
NAMESPACE              NAME                                            READY   STATUS    RESTARTS         AGE
default                web-0                                           1/1     Running   0                24h
default                web-1                                           1/1     Running   0                24h
default                web-2                                           1/1     Running   0                24h

查看清单

  1. 查看service

    $ k get svc nginx -n -o yaml
    apiVersion: v1
    kind: Service
    metadata:
      annotations:
        kubectl.kubernetes.io/last-applied-configuration: |
          {"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"labels":{"app":"nginx"},"name":"nginx","namespace":"default"},"spec":{"clusterIP":"None","ports":[{"name":"web","port":80}],"selector":{"app":"nginx"}}}
      creationTimestamp: "2022-10-02T03:06:17Z"
      labels:
        app: nginx
      name: nginx
      namespace: default
      resourceVersion: "5343708"
      uid: ff6a9fb8-4abd-4fda-af08-6ecdf7695b5a
    spec:
      clusterIP: None
      clusterIPs:
      - None
      #kube-proxy 基于 spec.internalTrafficPolicy 的设置来过滤路由的目标服务端点。当它的值设为 Local 时,只选择节点本地的服务端点。当它的值设为 Cluster 或缺省时,则选择所有的服务端点。
      internalTrafficPolicy: Cluster
      ipFamilies:
      - IPv4
      #用spec.ipFamilyPolicy字段配置的,可设置为以下选项之一:
      #SingleStack
      #PreferDualStack
      #RequireDualStack
      #要使用双堆栈支持,你需要设置.spec.ipFamilyPolicy为PreferredDualStack或RequiredDualStack。此功能在Kubernetes中默认启用,还包括通过IPv4和IPv6地址的脱离集群出口路由。
      ipFamilyPolicy: SingleStack
      ports:
      - name: web
        port: 80
        protocol: TCP
        targetPort: 80
      selector:
        app: nginx
      #使用svc.spec.sessionAffinity设置会话亲和性,默认是None。指定为ClientIP会使来自同一个Client IP的请求转发到同一个Pod上。
      sessionAffinity: None
      type: ClusterIP
    status:
      loadBalancer: {}
    
  2. 查看StatefulSet

     1  $ k get sts web -o yaml
     2  apiVersion: apps/v1
     3  kind: StatefulSet
     4  metadata:
     5    annotations:
     6      kubectl.kubernetes.io/last-applied-configuration: |
     7        {"apiVersion":"apps/v1","kind":"StatefulSet","metadata":{"annotations":{},"name":"web","namespace":"default"},"spec":{"replicas":3,"selector":{"matchLabels":{"app":"nginx"}},"serviceName":"nginx","template":{"metadata":{"labels":{"app":"nginx"}},"spec":{"containers":[{"image":"nginx:alpine","name":"nginx","ports":[{"containerPort":80,"name":"web"}]}]}}}}
     8    creationTimestamp: "2022-10-02T03:06:17Z"
     9    generation: 1
    10    name: web
    11    namespace: default
    12    resourceVersion: "5343757"
    13    uid: b68fa0b0-ce5e-428c-b39e-b41956ddcc12
    14  spec:
    15    #pod管理策略,v1.7+可以通过.spec.podManagementPolicy设置pod的管理策略,支持以下俩中方式
    16    #OrderedReady:默认方式,按照pod的次序依次创建每个pod并等待ready之后才创建后面的pod。
    17    #Parallel:并行创建或删除pod,和deployment类型的pod一样。(不等待前面的pod ready就开始创建所有的pod)。
    18    podManagementPolicy: OrderedReady
    19    replicas: 3
    20    revisionHistoryLimit: 10
    21    selector:
    22      matchLabels:
    23        app: nginx
    24    serviceName: nginx
    25    template:
    26      metadata:
    27        creationTimestamp: null
    28        labels:
    29          app: nginx
    30      spec:
    31        containers:
    32        - image: nginx:alpine
    33          imagePullPolicy: IfNotPresent
    34          name: nginx
    35          ports:
    36          - containerPort: 80
    37            name: web
    38            protocol: TCP
    39          resources: {}
    40          terminationMessagePath: /dev/termination-log
    41          terminationMessagePolicy: File
    42        dnsPolicy: ClusterFirst
    43        restartPolicy: Always
    44        schedulerName: default-scheduler
    45        securityContext: {}
    46        terminationGracePeriodSeconds: 30
    47    updateStrategy:
    48      rollingUpdate:
    49        partition: 0
    50      type: RollingUpdate
    51  status:
    52    availableReplicas: 3
    53    collisionCount: 0
    54    currentReplicas: 3
    55    currentRevision: web-6d796b6548
    56    observedGeneration: 1
    57    readyReplicas: 3
    58    replicas: 3
    59    updateRevision: web-6d796b6548
    60    updatedReplicas: 3
    61  
    
  3. 查看Pod清单

    $ k get pod web-0 -o yaml
    apiVersion: v1
    kind: Pod
    metadata:
      creationTimestamp: "2022-10-02T03:06:17Z"
      generateName: web-
      labels:
        app: nginx
        controller-revision-hash: web-6d796b6548
        statefulset.kubernetes.io/pod-name: web-0
      name: web-0
      namespace: default
      ownerReferences:
      - apiVersion: apps/v1
        blockOwnerDeletion: true
        controller: true
        kind: StatefulSet
        name: web
        uid: b68fa0b0-ce5e-428c-b39e-b41956ddcc12
      resourceVersion: "5343727"
      uid: 04b8e1f1-eed1-493e-a9b3-3b0791eca087
    spec:
      containers:
      - image: nginx:alpine
        imagePullPolicy: IfNotPresent
        name: nginx
        ports:
        - containerPort: 80
          name: web
          protocol: TCP
        resources: {}
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
        volumeMounts:
        - mountPath: /var/run/secrets/kubernetes.io/serviceaccount
          name: kube-api-access-v2xb5
          readOnly: true
      dnsPolicy: ClusterFirst
      enableServiceLinks: true
      hostname: web-0
      nodeName: docker-desktop
      preemptionPolicy: PreemptLowerPriority
      priority: 0
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext: {}
      serviceAccount: default
      serviceAccountName: default
      subdomain: nginx
      terminationGracePeriodSeconds: 30
      tolerations:
      - effect: NoExecute
        key: node.kubernetes.io/not-ready
        operator: Exists
        tolerationSeconds: 300
      - effect: NoExecute
        key: node.kubernetes.io/unreachable
        operator: Exists
        tolerationSeconds: 300
      volumes:
      - name: kube-api-access-v2xb5
        projected:
          defaultMode: 420
          sources:
          - serviceAccountToken:
              expirationSeconds: 3607
              path: token
          - configMap:
              items:
              - key: ca.crt
                path: ca.crt
              name: kube-root-ca.crt
          - downwardAPI:
              items:
              - fieldRef:
                  apiVersion: v1
                  fieldPath: metadata.namespace
                path: namespace
    status:
      conditions:
      - lastProbeTime: null
        lastTransitionTime: "2022-10-02T03:06:17Z"
        status: "True"
        type: Initialized
      - lastProbeTime: null
        lastTransitionTime: "2022-10-02T03:06:18Z"
        status: "True"
        type: Ready
      - lastProbeTime: null
        lastTransitionTime: "2022-10-02T03:06:18Z"
        status: "True"
        type: ContainersReady
      - lastProbeTime: null
        lastTransitionTime: "2022-10-02T03:06:17Z"
        status: "True"
        type: PodScheduled
      containerStatuses:
      - containerID: docker://bd6e1b11a24457b4892fd83fb306ec2bac9adca1a280b079b9502a0672a9d521
        image: nginx:alpine
        imageID: docker-pullable://nginx@sha256:082f8c10bd47b6acc8ef15ae61ae45dd8fde0e9f389a8b5cb23c37408642bf5d
        lastState: {}
        name: nginx
        ready: true
        restartCount: 0
        started: true
        state:
          running:
            startedAt: "2022-10-02T03:06:18Z"
      hostIP: 192.168.65.4
      phase: Running
      podIP: 10.1.0.72
      podIPs:
      - ip: 10.1.0.72
      qosClass: BestEffort
      startTime: "2022-10-02T03:06:17Z"
    

DaemonSet

作用及概念

DaemonSet确保集群中每个(部分)node运行一份po副本,当node加入集群时创建pod,当node离开集群时回收pod。

如果删除DaemonSet,其创建的所有pod也被删除, DaemonSet中的pod覆盖整个集群。

当需要在集群内每个node运行同一个pod,使用 DaemonSet是有价值的,以下是典型使用场景:

  • 运行集群存储守护进程,如 glusterd、ceph
  • 运行集群日志收集守护进程,如 fluent、 logstash
  • 运行节点监控守护进程,如 Prometheus Node Exporter, collectd, Datadog agent,

配置清单

$ cat daemonset-demo.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: deamonset-demo
  namespace: default
spec:
  selector:
    matchLabels:
     app: nginx-ds
  template:
    metadata:
      labels:
        app: nginx-ds
    spec:
      containers:
      - name: nginx
        image: nginx:1.17.1

查看效果

# mosp @ mospdeMacBook-Pro in ~/study/k8s/resource/daemonset [18:51:51]
$ k get ds -A
NAMESPACE     NAME             DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR            AGE
default       deamonset-demo   1         1         1       1            1           <none>                   10m
kube-system   kube-proxy       1         1         1       1            1           kubernetes.io/os=linux   68d

# mosp @ mospdeMacBook-Pro in ~/study/k8s/resource/daemonset [18:53:22]
$ k get rs -A
NAMESPACE              NAME                                      DESIRED   CURRENT   READY   AGE
guestbook-system       guestbook-controller-manager-84cd65964f   1         1         1       63d
kube-system            coredns-78fcd69978                        2         2         2       68d
kubernetes-dashboard   dashboard-metrics-scraper-7c857855d9      1         1         1       19d
kubernetes-dashboard   kubernetes-dashboard-6b79449649           1         1         1       19d

# mosp @ mospdeMacBook-Pro in ~/study/k8s/resource/daemonset [18:53:28]
$ k get pod -A
NAMESPACE              NAME                                            READY   STATUS    RESTARTS          AGE
default                deamonset-demo-lbmmq                            1/1     Running   0                 10m

Job

作用及概念

详见:k8s Job详解

配置清单

$ cat job-demo.yaml

apiVersion: batch/v1
kind: Job
metadata:
  name: echo-time
spec:
  completions: 10 #任务个数
  parallelism: 5 #并行数
  backoffLimit: 2 #失败最多执行几次
  template:
    spec:
      containers:
      - name: echo-time
        image: centos:latest
        imagePullPolicy: IfNotPresent
        command:
        - /bin/bash
        - "-c"
        - "for i in `seq 1 100`;do echo $i: `date` && sleep 1;done"
      restartPolicy: OnFailure

查看效果

# mosp @ mospdeMacBook-Pro in ~/study/k8s/resource/job [20:17:06]
$ k get job -A
NAMESPACE   NAME        COMPLETIONS   DURATION   AGE
default     echo-time   10/10         3m28s      5m40s

# mosp @ mospdeMacBook-Pro in ~/study/k8s/resource/job [20:20:49]
$ k get pod -A
NAMESPACE              NAME                                            READY   STATUS      RESTARTS         AGE
default                deamonset-demo-lbmmq                            1/1     Running     1 (9h ago)       5d1h
default                echo-time--1-24lfm                              0/1     Completed   0                4m7s
default                echo-time--1-5drjv                              0/1     Completed   0                4m9s
default                echo-time--1-869rd                              0/1     Completed   0                4m7s
default                echo-time--1-8fd7m                              0/1     Completed   0                4m9s
default                echo-time--1-cqfjs                              0/1     Completed   0                5m52s
default                echo-time--1-f276r                              0/1     Completed   0                5m52s
default                echo-time--1-h4v9l                              0/1     Completed   0                5m52s
default                echo-time--1-lx4ww                              0/1     Completed   0                5m52s
default                echo-time--1-qd4kc                              0/1     Completed   0                4m8s
default                echo-time--1-zfchg                              0/1     Completed   0                5m52s

每个Pod日志都能从1输出到100。

cronJob

作用及概念

CronJobs 对于创建周期性的、反复重复的任务很有用,例如执行数据备份或者发送邮件。 CronJobs 也可以用来计划在指定时间来执行的独立任务,例如计划当集群看起来很空闲时 执行某个 Job。

配置清单

$ cat cronjob-demo.yaml
apiVersion: batch/v1
kind: CronJob
metadata:
  name: cronjob-demo
spec:
  schedule: "*/1 * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: cronjob-demo
            image: busybox
            imagePullPolicy: IfNotPresent
            command:
            - /bin/sh
            - -c
            - date; echo Hello from the Kubernetes cluster
          restartPolicy: OnFailure

查看效果

# mosp @ mospdeMacBook-Pro in ~/study/k8s/resource [20:27:32]
$ k get cronjobs.batch -A
NAMESPACE   NAME           SCHEDULE      SUSPEND   ACTIVE   LAST SCHEDULE   AGE
default     cronjob-demo   */1 * * * *   False     0        40s             7m53s

# mosp @ mospdeMacBook-Pro in ~/study/k8s/resource [20:27:40]
$ k get pod -A
NAMESPACE              NAME                                            READY   STATUS      RESTARTS         AGE
default                cronjob-demo-27761065--1-bjdj7                  0/1     Completed   0                2m47s
default                cronjob-demo-27761066--1-z9ttq                  0/1     Completed   0                107s
default                cronjob-demo-27761067--1-9x5fn                  0/1     Completed   0                47s

通过观察发现,它只保留最新的3个pod,其他的将被删除掉免得占用资源。

HPA

作用及概念

Label&Annotation&Selector

Label

详见:k8s中label和label selector的基本概念及使用方法

Annotation

详见:K8s Annotation(注解)

Selector

Label selector的使用场景:

1.kube-controller进程通过资源对象RC上定义的Label Selector来筛选要监控的Pod副本的数量,从而实现Pod副本的数量始终符合预期设定的全自动控制流程

2.kupe-proxy进程通过Service的Label Selector来选择对应的Pod,自动建立器每个Service到对应Pod的请求转发路由表,从而实现Service的智能负载均衡机制

3.通过对某些Node定义特定的Label,并且在Pod定义文件中使用NodeSelector这种标签调度策略,Kube-scheduler进程可以实现Pod定向调度的特性

详见: k8s selector_k8s之Label与Selector

参考资料

1.k8s之terminationMessagePath
2.Kubernetes之DNS
3.Kubernetes——调度器Scheduler
4.k8s之securityContext
5.Kubernetes的所有者和依赖
6.k8s之pod详解
7.kubernetes 之 pod 调度策略(一)
8.污点(taints)和容忍度(tolerations)
9.k8s网络模型-服务内部流量策略
10.k8s中statefulset资源类型的深入理解
11.k8s job简介和访问
12.k8s-HPA

微信扫一扫

作者:mospan
微信关注:墨斯潘園
本文出处:http://mospany.github.io/2022/09/28/resource/
文章版权归本人所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。