当前位置:   article > 正文

Kubernetes集群Pod控制器

Kubernetes集群Pod控制器

前言

K8s 集群中,Pod 控制器是一种关键的组件,负责管理和控制Pod的生命周期。Pod 是 K8s 中最小的可部署单元,通常包含一个或多个容器,Pod 控制器则确保所需数量的 Pod 实例处于运行状态,并根据定义的规则进行自动扩展或缩减。本文将介绍 K8s 集群中 Pod 控制器的定义、类型以及 Pod 与控制器之间的关系。

目录

一、Pod 控制器介绍

1. 概述及作用

2. pod 控制器的类型

2.1 ReplicaSet

2.2 Deployment

2.3 DaemonSet

2.4 StatefulSet

2.5 Jop

2.6 CronJob

3. Pod 与控制器之间的关系 

二、控制器管理 Pod 示例 

1. Deployment 部署无状态应用

2. SatefulSet 部署有状态应用 

2.1 SatefulSet 三个组件

2.2 实现 K8S 里 DNS 功能的插件

2.3 解析 kubernetes 和 nginx-service 名称

2.4 查看 statefulset 的定义

2.5 清单定义 StatefulSet

2.5.1 定义资源清单

2.5.2 创建 statefulset 

2.5.3 删除 statefulset 

2.6 滚动更新

3. DaemonSet 一次创建多节点 

三、总结


一、Pod 控制器介绍

1. 概述及作用

概述:

Pod 控制器是一种 K8s 对象,设计用于管理和维护 Pod 实例。它们不是直接操作 Pod,而是通过与 K8s API 交互来间接控制 Pod,从而保证即使面对节点故障、Pod 终止或其他意外情况,也能维持应用的高可用性和期望的部署配置。

作用:

自动扩缩容

  • 根据预设策略自动增加或减少Pod副本的数量,以应对负载变化或确保服务的高可用性。

自我修复

  • 当检测到Pod由于各种原因(如节点故障、容器崩溃)不再运行时,控制器会自动创建新的Pod副本以替换故障实例,保持预期的Pod数量和配置。

滚动更新

  • 在不中断服务的情况下,逐步将Pod升级到新版本的应用镜像,通过逐步替换旧Pod来平滑过渡。

版本控制

  • 管理应用的多个版本,允许快速回滚到之前的版本。

有序部署和管理

  • 对于有状态应用,如数据库,使用StatefulSet控制器来确保Pod按顺序创建和销毁,维护稳定的网络标识符和存储卷。

定时任务

  • CronJob控制器能够根据预定的计划时间自动创建Job来执行一次性任务,适用于定期执行的任务,如数据备份、报表生成等。

资源组织和命名空间管理

  • 帮助组织和隔离不同的应用或服务资源,便于团队协作和资源分配。

2. pod 控制器的类型

常见的 Pod 控制器类型包括 ReplicaSet、Deployment、DaemonSet、StatefulSet、Job 和 CronJob 等。

2.1 ReplicaSet

确保在任何给定时间都有指定数量的 Pod 副本在运行,确保 Pod 副本数量符合期望值,并且支持滚动式自动扩容和缩容功能。主要三个组件组成:

  • 用户期望的 pod 副本数量
  • 标签选择器,判断哪个 pod 归自己管理
  • 当现存的 pod 数量不足,会根据 pod 资源模板进行新建

2.2 Deployment

它建立在 ReplicaSet 之上,提供了额外的功能,如滚动更新、暂停/恢复更新、版本回滚等。

2.3 DaemonSet

确保每个节点上都运行着一个指定的 Pod 实例,比如日志收集、监控代理等。当有新的节点加入集群时,DaemonSet 会自动在新节点上创建 Pod;节点从集群移除时,对应的 Pod 也会被清理。

2.4 StatefulSet

管理有状态应用设计,如数据库、需要持久化存储和稳定的网络标识(如: CEPH)。StatefulSet 中的每个 Pod 都有唯一的、持久的标识符和稳定的存储卷。它确保 Pod 按顺序启动和关闭(理论上是倒序),且在重启后仍能访问相同的存储资源,这对于维护数据一致性至关重要。

2.5 Jop

用于运行完成特定次数后终止的 Pod,即执行一次性或批处理任务。只要完成就立即退出,不需要重启或重建。

2.6 CronJob

周期性任务控制,基于时间调度来定期执行 Job,类似于Linux的cron定时任务,不需要持续后台运行。

3. Pod 与控制器之间的关系 

Controllers (控制器)是管理和运行容器的 Pod 对象的实体,在集群中,Pod 通过 Label Selector (标签与选择器)进行相关联。它们通过控制器来实现应用的运维任务,例如伸缩和升级。

可以理解为:Pod 与控制器之间是一种管理和被管理的关系,控制器利用 K8s 的标签系统来识别和控制其管理的 Pod 集合,从而实现了应用的自动化运维和高可用性。

二、控制器管理 Pod 示例 

1. Deployment 部署无状态应用

部署并维护一个由3个副本组成的 Nginx 服务,管理 Pod 和 ReplicaSet;应用场景:web服务。

① 定义 yaml 配置

  1. [root@master01 controller]# vim nginx-deployment.yaml
  2. apiVersion: apps/v1
  3. kind: Deployment
  4. metadata:
  5. name: nginx-deployment
  6. labels:
  7. app: nginx
  8. spec:
  9. replicas: 3
  10. selector:
  11. matchLabels:
  12. app: nginx
  13. template:
  14. metadata:
  15. labels:
  16. app: nginx
  17. spec:
  18. containers:
  19. - name: nginx
  20. image: nginx:1.14
  21. ports:
  22. - containerPort: 80

② 创建控制器

[root@master01 controller]# kubectl apply -f nginx-deployment.yaml

③ 获取集群中Pods、Deployments、以及 ReplicaSets 的信息

  1. [root@master01 controller]# kubectl get pod,deploy,rs
  2. NAME READY STATUS RESTARTS AGE
  3. pod/nfs-client-provisioner-5f7484cd44-ls45v 1/1 Running 0 14h
  4. pod/nginx-deployment-d9d8cf5c7-j2c8p 1/1 Running 0 50s
  5. pod/nginx-deployment-d9d8cf5c7-mf578 1/1 Running 0 50s
  6. pod/nginx-deployment-d9d8cf5c7-xqh57 1/1 Running 0 50s
  7. NAME READY UP-TO-DATE AVAILABLE AGE
  8. deployment.apps/nginx-deployment 3/3 3 3 50s
  9. # READY: 表示期望的Pod副本中有多少是Ready状态。3/3意味着所有3个副本都已准备就绪,可以接收请求。
  10. # UP-TO-DATE: 表示已经更新到最新配置的Pod副本数量,这里也是3,说明没有正在进行的更新操作或所有Pod都已经是最新配置。
  11. # AVAILABLE: 表示当前可用的Pod副本数量,同样为3,说明服务完全可用。
  12. # AGE: 显示了Deployment被创建的时间,这里是50秒。
  13. NAME DESIRED CURRENT READY AGE
  14. replicaset.apps/nginx-deployment-d9d8cf5c7 3 3 3 50s
  15. # DESIRED: 表示ReplicaSet期望维持的Pod副本数量,这里是3。
  16. # CURRENT: 实际存在的Pod副本数量,也是3,符合期望。
  17. # READY: 准备好提供服务的Pod副本数量,3个副本都已就绪。

④ 查看控制器配置

  1. kubectl edit deployment/nginx-deployment
  2. labels:
  3. app: nginx # Deployment资源的标签
  4. replicas: 3 #期望的pod数量,默认是1
  5. rollingUpdate:
  6. maxSurge: 25% # 升级过程中会先启动的新Pod的数量不超过期望的Pod数量的25%,也可以是一个绝对值
  7. maxUnavailable: 25% # 升级过程中在新的Pod启动好后销毁的旧Pod的数量不超过期望的Pod数量的25%,也可以是一个绝对值
  8. type: RollingUpdate # 滚动升级
  9. spec:
  10. template:
  11. labels:
  12. app: nginx # Pod副本关联的标签
  13. spec:
  14. containers:
  15. - image: nginx:1.14 #镜像名称
  16. imagePullPolicy: IfNotPresent #镜像拉取策略
  17. ports:
  18. - containerPort: 80 #容器暴露的监听端口
  19. restartPolicy: Always #容器重启策略

⑤ 查看历史版本

  1. [root@master01 controller]# kubectl rollout history deployment nginx-deployment
  2. deployment.apps/nginx-deployment
  3. REVISION CHANGE-CAUSE
  4. 1 <none>

小结:

deployment 部署无状态应用的管理 ReplicaSet 和 Pod 并创建 Pod,主要维护 Pod 副本数量与期望值相同;创建和删除 Pod 时,并行执行,升级时也会创建一部分再删除一部分。

2. SatefulSet 部署有状态应用 

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

 常见的应用场景:数据库StatefulSets | Kubernetes

2.1 SatefulSet 三个组件

  • Headless Service(无头服务):用于为Pod资源标识符生成可解析的DNS记录。
  • volumeClaimTemplates(存储卷申请模板):基于静态或动态PV供给方式为Pod资源提供专有的固定存储。
  • StatefulSet:用于管控Pod资源。

(1)为什么要有headless?

  • 在deployment中,每一个pod是没有名称,是随机字符串,是无序的;
  • 而statefulset中是要求有序的,每一个pod的名称必须是固定的;

当节点挂了,重建之后的标识符是不变的,每一个节点的节点名称是不能改变的。pod名称是作为pod识别的唯一标识符,必须保证其标识符的稳定并且唯一。

为了实现标识符的稳定,这时候就需要一个headless service 解析直达到pod,还需要给pod配置一个唯一的名称。

(2)为什么要有volumeClainTemplate?

大部分有状态副本集都会用到持久存储,比如分布式系统来说,由于数据是不一样的,每个节点都需要自己专用的存储节点;

  • 在 deployment中pod模板中创建的存储卷是一个共享的存储卷,多个pod使用同一个存储卷;
  • 而statefulset定义中的每一个pod都不能使用同一个存储卷,由此基于pod模板创建pod是不适应的,这就需要引入volumeClainTemplate,当在使用statefulset创建pod时,会自动生成一个PVC,从而请求绑定一个PV,从而有自己专用的存储卷。

2.2 实现 K8S 里 DNS 功能的插件

skyDNS:Kubernetes 1.3之前的版本

kubeDNS:Kubernetes 1.3至Kubernetes 1.11

CoreDNS:Kubernetes 1.11开始至今

2.3 解析 kubernetes 和 nginx-service 名称

创建一个service,然后用dns去测试解析。

① 定义 nginx-svc yaml

  1. [root@master01 controller]# vim nginx-service.yaml
  2. apiVersion: v1
  3. kind: Service
  4. metadata:
  5. name: nginx-service
  6. labels:
  7. app: nginx
  8. spec:
  9. type: NodePort
  10. ports:
  11. - port: 80
  12. targetPort: 80
  13. selector:
  14. app: nginx

② 创建 nginx-svc

  1. [root@master01 controller]# kubectl apply -f nginx-service.yaml
  2. service/nginx-service created
  3. [root@master01 controller]# kubectl get svc
  4. nginx-service NodePort 10.96.193.207 <none> 80:32037/TCP 7s

③ 定义一个dns-pod yaml

  1. [root@master01 controller]# vim dns-test.yaml
  2. apiVersion: v1
  3. kind: Pod
  4. metadata:
  5. name: dns-test
  6. spec:
  7. containers:
  8. - name: busybox
  9. image: busybox:1.28.4 #一个小型的Unix工具集合,常用于测试和基础任务
  10. args:
  11. - /bin/sh
  12. - -c
  13. - sleep 36000 #让容器运行后休眠36000秒
  14. restartPolicy: Never #指定了Pod的重启策略

④ 创建 pod

  1. [root@master01 controller]# kubectl apply -f dns-test.yaml
  2. [root@master01 controller]# kubectl get pod
  3. NAME READY STATUS RESTARTS AGE
  4. dns-test 1/1 Running 0 48s

⑤ 进入容器测试解析

  1. [root@master01 controller]# kubectl exec -it dns-test sh
  2. / # nslookup kubernetes
  3. Server: 10.96.0.10
  4. Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local
  5. Name: kubernetes
  6. Address 1: 10.96.0.1 kubernetes.default.svc.cluster.local
  7. / # nslookup nginx-service
  8. Server: 10.96.0.10
  9. Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local
  10. Name: nginx-service
  11. Address 1: 10.96.193.207 nginx-service.default.svc.cluster.local

2.4 查看 statefulset 的定义

  1. kubectl explain statefulset
  2. kubectl explain statefulset.spec
  3. FIELDS:
  4. podManagementPolicy <string> #Pod管理策略
  5. replicas <integer> #副本数量
  6. revisionHistoryLimit <integer> #历史版本限制
  7. selector <Object> -required- #选择器,必选项
  8. serviceName <string> -required- #服务名称,必选项
  9. template <Object> -required- #模板,必选项
  10. updateStrategy <Object> #更新策略
  11. volumeClaimTemplates <[]Object> #存储卷申请模板,必选项

2.5 清单定义 StatefulSet

如上所述,一个完整的 StatefulSet 控制器由一个 Headless Service、一个 StatefulSet 和一个 volumeClaimTemplate 组成。定义了一个Kubernetes StatefulSet资源和一个Headless Service(无头服务),用于部署一个有状态应用:

2.5.1 定义资源清单
  1. [root@master01 controller]# vim stateful-demo.yaml
  2. apiVersion: v1
  3. kind: Service
  4. metadata:
  5. name: myapp-svc
  6. labels:
  7. app: myapp-svc
  8. spec:
  9. ports:
  10. - port: 80
  11. name: web
  12. clusterIP: None #None表明这是一个无头服务,没有Cluster IP分配,直接返回关联Pod的IP列表
  13. selector:
  14. app: myapp-pod #用于选择带有此标签的Pods,与后续的StatefulSet关联
  15. ---
  16. apiVersion: apps/v1
  17. kind: StatefulSet
  18. metadata:
  19. name: myapp
  20. spec:
  21. serviceName: myapp-svc
  22. replicas: 3
  23. selector:
  24. matchLabels: #为Pod定义标签,与selector匹配
  25. app: myapp-pod
  26. template:
  27. metadata:
  28. labels:
  29. app: myapp-pod
  30. spec:
  31. containers:
  32. - name: myapp
  33. image: ikubernetes/myapp:v1
  34. ports:
  35. - containerPort: 80
  36. name: web
  37. volumeMounts:
  38. - name: myappdata
  39. mountPath: /usr/share/nginx/html #挂载卷myappdata到/usr/share/nginx/html
  40. volumeClaimTemplates:
  41. - metadata:
  42. name: myappdata
  43. annotations:
  44. #动态PV创建时,使用annotations在PVC里声明一个StorageClass对象的标识进行关联
  45. volume.beta.kubernetes.io/storage-class: nfs-client-storageclass
  46. spec:
  47. accessModes: ["ReadWriteOnce"] #定义访问模式
  48. resources:
  49. requests:
  50. storage: 2Gi

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

2.5.2 创建 statefulset 
  1. [root@master01 controller]# kubectl apply -f stateful-demo.yaml
  2. 查看创建的无头服务myapp-svc:
  3. [root@master01 controller]# kubectl get svc
  4. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
  5. kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 14d
  6. myapp-svc ClusterIP None <none> 80/TCP 32m
  7. 查看statefulset:
  8. [root@master01 controller]# kubectl get sts
  9. NAME READY AGE
  10. myapp 3/3 24m
  11. 查看pvc绑定:
  12. [root@master01 controller]# kubectl get pvc
  13. NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
  14. myappdata-myapp-0 Bound pvc-d9b33a5b-076e-4a17-b457-03d7b50d08b7 2Gi RWO nfs-client-storageclass 25m
  15. myappdata-myapp-1 Bound pvc-4748da6b-1c81-45c0-9b50-a20898cc5f11 2Gi RWO nfs-client-storageclass 5m51s
  16. myappdata-myapp-2 Bound pvc-a4999f31-ab02-4640-913e-c6cf19ccf7a0 2Gi RWO nfs-client-storageclass 5m46s
  17. 查看pv绑定:
  18. [root@master01 controller]# kubectl get pv
  19. NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
  20. pvc-4748da6b-1c81-45c0-9b50-a20898cc5f11 2Gi RWO Delete Bound default/myappdata-myapp-1 nfs-client-storageclass 8m14s
  21. pvc-a4999f31-ab02-4640-913e-c6cf19ccf7a0 2Gi RWO Delete Bound default/myappdata-myapp-2 nfs-client-storageclass 8m9s
  22. pvc-d9b33a5b-076e-4a17-b457-03d7b50d08b7 2Gi RWO Delete Bound default/myappdata-myapp-0 nfs-client-storageclass 8m26s
  23. 查看Pod信息:
  24. [root@master01 controller]# kubectl get pods
  25. NAME READY STATUS RESTARTS AGE
  26. myapp-0 1/1 Running 0 27m
  27. myapp-1 1/1 Running 0 8m39s
  28. myapp-2 1/1 Running 0 8m34s
2.5.3 删除 statefulset 

当删除的时候是从myapp-2开始进行删除的,关闭是逆向关闭(不过一般是同时删除);然后再次创建,观察 pod 创建详情:

  1. [root@master01 volumes]# kubectl get pod -w
  2. NAME READY STATUS RESTARTS AGE
  3. myapp-0 1/1 Running 0 32m
  4. myapp-1 1/1 Running 0 12m
  5. myapp-2 1/1 Running 0 12m
  6. nfs-client-provisioner-5f7484cd44-ft5lv 1/1 Running 0 13m
  7. myapp-1 1/1 Terminating 0 14m
  8. myapp-2 1/1 Terminating 0 14m
  9. myapp-0 1/1 Terminating 0 34m
  10. myapp-1 0/1 Terminating 0 14m
  11. myapp-2 0/1 Terminating 0 14m
  12. myapp-0 0/1 Terminating 0 34m
  13. myapp-1 0/1 Terminating 0 14m
  14. myapp-1 0/1 Terminating 0 14m
  15. myapp-2 0/1 Terminating 0 14m
  16. myapp-2 0/1 Terminating 0 14m
  17. myapp-0 0/1 Terminating 0 34m
  18. myapp-0 0/1 Terminating 0 34m
  19. myapp-0 0/1 Pending 0 0s
  20. myapp-0 0/1 Pending 0 0s
  21. myapp-0 0/1 ContainerCreating 0 0s
  22. myapp-0 1/1 Running 0 2s
  23. myapp-1 0/1 Pending 0 0s
  24. myapp-1 0/1 Pending 0 0s
  25. myapp-1 0/1 ContainerCreating 0 0s
  26. myapp-1 1/1 Running 0 2s
  27. myapp-2 0/1 Pending 0 0s
  28. myapp-2 0/1 Pending 0 0s
  29. myapp-2 0/1 ContainerCreating 0 0s
  30. myapp-2 1/1 Running 0 2s

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

  1. [root@master01 controller]# kubectl get pvc
  2. NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
  3. myappdata-myapp-0 Bound pvc-d9b33a5b-076e-4a17-b457-03d7b50d08b7 2Gi RWO nfs-client-storageclass 36m
  4. myappdata-myapp-1 Bound pvc-4748da6b-1c81-45c0-9b50-a20898cc5f11 2Gi RWO nfs-client-storageclass 17m
  5. myappdata-myapp-2 Bound pvc-a4999f31-ab02-4640-913e-c6cf19ccf7a0 2Gi RWO nfs-client-storageclass 17m

2.6 滚动更新

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

① 修改 yaml 定义

  1. [root@master01 controller]# vim stateful-demo.yaml
  2. ……
  3. image: nginx:1.18.0 # 原来是1.14
  4. ……

② 更新 svc yaml

[root@master01 controller]# kubectl apply -f stateful-demo.yaml

③ 查看滚动更新的过程

  1. [root@master01 volumes]# kubectl get pod -w
  2. NAME READY STATUS RESTARTS AGE
  3. myapp-0 1/1 Running 0 12s
  4. myapp-1 1/1 Running 0 9s
  5. myapp-2 1/1 Running 0 7s
  6. nfs-client-provisioner-5f7484cd44-ft5lv 1/1 Running 0 29m
  7. myapp-2 1/1 Terminating 0 51s
  8. myapp-2 0/1 Terminating 0 52s
  9. myapp-2 0/1 Terminating 0 53s
  10. myapp-2 0/1 Terminating 0 53s
  11. myapp-2 0/1 Pending 0 0s
  12. myapp-2 0/1 Pending 0 0s
  13. myapp-2 0/1 ContainerCreating 0 0s
  14. myapp-2 1/1 Running 0 2s
  15. myapp-1 1/1 Terminating 0 57s
  16. myapp-1 0/1 Terminating 0 58s
  17. myapp-1 0/1 Terminating 0 59s
  18. myapp-1 0/1 Terminating 0 59s
  19. myapp-1 0/1 Pending 0 0s
  20. myapp-1 0/1 Pending 0 0s
  21. myapp-1 0/1 ContainerCreating 0 0s
  22. myapp-1 1/1 Running 0 2s
  23. myapp-0 1/1 Terminating 0 64s
  24. myapp-0 0/1 Terminating 0 65s
  25. myapp-0 0/1 Terminating 0 66s
  26. myapp-0 0/1 Terminating 0 66s
  27. myapp-0 0/1 Pending 0 0s
  28. myapp-0 0/1 Pending 0 0s
  29. myapp-0 0/1 ContainerCreating 0 0s
  30. myapp-0 1/1 Running 0 2s

④ 进入 dns-test Pod中,每一个 pod 自己的名称都是可以被解析的

  1. [root@master01 controller]# kubectl exec -it dns-test sh
  2. kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
  3. / # nslookup myapp-svc
  4. Server: 10.96.0.10
  5. Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local
  6. Name: myapp-svc
  7. Address 1: 10.244.2.40 myapp-0.myapp-svc.default.svc.cluster.local
  8. Address 2: 10.244.2.39 myapp-1.myapp-svc.default.svc.cluster.local
  9. Address 3: 10.244.1.201 myapp-2.myapp-svc.default.svc.cluster.local
  10. / # nslookup myapp-0.myapp-svc.default.svc.cluster.local
  11. Server: 10.96.0.10
  12. Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local
  13. Name: myapp-0.myapp-svc.default.svc.cluster.local
  14. Address 1: 10.244.2.40 myapp-0.myapp-svc.default.svc.cluster.local
  15. / # nslookup myapp-1.myapp-svc.default.svc.cluster.local
  16. Server: 10.96.0.10
  17. Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local
  18. Name: myapp-1.myapp-svc.default.svc.cluster.local
  19. Address 1: 10.244.2.39 myapp-1.myapp-svc.default.svc.cluster.local
  20. / # nslookup myapp-2.myapp-svc.default.svc.cluster.local
  21. Server: 10.96.0.10
  22. Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local

3. 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

官方案例(监控):https://kubernetes.io/docs/concepts/workloads/controllers/daemonset/

示例:

  1. [root@master01 data]# vim ds.yaml
  2. apiVersion: apps/v1
  3. kind: DaemonSet
  4. metadata:
  5. name: nginx-daemonset
  6. labels:
  7. app: nginx
  8. spec:
  9. selector:
  10. matchLabels:
  11. app: nginx
  12. template:
  13. metadata:
  14. labels:
  15. app: nginx
  16. spec:
  17. containers:
  18. - name: nginx
  19. image: nginx:1.14
  20. ports:
  21. - containerPort: 80
  22. [root@master01 data]# kubectl apply -f ds.yaml
  23. DaemonSet会在每个node节点都创建一个Pod:
  24. [root@master01 data]# kubectl get pod -o wide
  25. nginx-daemonset-bqmtg 1/1 Running 0 15s 10.244.1.202 node01 <none> <none>
  26. nginx-daemonset-n89xc 1/1 Running 0 15s 10.244.2.42 node02 <none> <none>

三、总结

1. Pod 控制器

① deployment 部署无状态应用的管理 RS 和 pod 创建 Pod ,主要是维护 pod 副本数量与期望状态相同;创建和删除 pod 时并行执行升级时是想创建一部分,再删除一部分;

② statefulset 部署有状态的应用,每个 pod 名称唯一且不变,每个 pod 拥有自己专属的持久化的存储(PVC 和 PV)在 k8s 集群内部可以通过{pod_name}.{service_name}.{namespace).svc.cluster.local 解析出 pod 的 IP(基于 headless service 和 coreDNS)创建和删除 pod 是有顺序的(串行执行的),升级时串行执行的,会删除旧的 pod,再创建新 pod;删除和升级是逆序执行的(先从标识符最大的 n-1开始,一直到最小的0);

③ Daemonset 理论上在 k8s 集群的所有 node 节点上创建相同的 pod(无论 node 节点什么时候加入到 k8s 集群),但是会收到 node 节点上污点影响;

④ 部署一次性任务的 pod,正常完成后容器立即退出并且不重启容器(restartpolicy 不设置Always),也不会重建,异常完成后重试任务,重建次数根据 backofflimit 配置指定(默认为6次);

⑤ cronjob 周期性的部署任务的 pod,正常完成后容器会立即退出并不会重启容器(restartPolicy 不设置 Always),也不会重键 pod schedule 配置周期的性的事件表(*****分时日月周)。

  1. 无状态:
  2. 1)deployment 认为所有的pod都是一样的
  3. 2)不用考虑顺序的要求
  4. 3)不用考虑在哪个node节点上运行
  5. 4)可以随意扩容和缩容
  6. 有状态
  7. 1)实例之间有差别,每个实例都有自己的独特性,元数据不同,例如etcd,zookeeper
  8. 2)实例之间不对等的关系,以及依靠外部存储的应用。
  9. 常规service和无头服务区别
  10. service:一组Pod访问策略,提供cluster-IP群集之间通讯,还提供负载均衡和服务发现。
  11. Headless service:无头服务,不需要cluster-IP,而是直接以DNS记录的方式解析出被代理Pod的IP地址。
声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号