kubernetes--资源调度Selector/Deployment/SatatefulSet/DaemonSet
文章目录
- Label 和 Selector
- 标签与选择器的类比
- Service 与 Pod 的关联
- Deployment 管理 Pod
- Deployment
- Deployment概念
- 作用
- 工作机制
- YAML 配置
- ReplicaSet
- 作用
- 工作机制
- ReplicaSet 配置示例
- 常见操作命令
- Deployment功能
- 滚动更新
- 回滚
- 扩容缩容
- 服务高可用
- 灰度发布与回滚
- 自动扩展
- 常见操作命令
- StatefulSet
- StatefulSet 特点
- 有序性
- 工作机制
- StatefulSet 的 YAML 配置示例
- DaemonSet
- DaemonSet 详解
- 用途
- 特性
- DaemonSet 与 Deployment 的区别
- 工作原理
- DaemonSet 的示例
- 1.简单的 DaemonSet 示例
- 2.使用节点选择器的 DaemonSet
- 3.DaemonSet 滚动更新示例
- DaemonSet 常见使用场景
Label 和 Selector
在 Kubernetes 中,标签选择器(Label Selector) 是一种用于筛选、组织和管理资源(如 Pod、Service、Deployment 等)的机制。通过标签选择器,用户可以将操作精确到具有特定标签的资源对象。
标签选择器在 Kubernetes 中扮演了一个“资源过滤器”的角色,它帮助你在大量资源中找到符合条件的资源,并对它们进行管理。
形象地理解:标签(Label):像是每个资源对象上的标签或标记,定义它的属性。标签选择器(Label Selector):像是一个查询规则,决定如何找到带有特定标签的资源。
在生产环境中,标签选择器广泛应用于 Service、Deployment、Ingress、ConfigMap 等资源,确保 Kubernetes 能够对特定资源进行精准管理和调度。
标签与选择器的类比
可以将 标签(Label) 类比为每个资源对象上的 标记 或 “贴纸”,用来标记它的属性或用途。而 选择器(Selector) 就像是根据特定的规则去筛选带有这些“贴纸”的资源。
例如:'标签' 是 Pod 上的标记,比如 "app: nginx"。'选择器' 就像是在说:“我要找到所有带有 app: nginx 这个标记的 Pod”。
这就像在文件夹或笔记本上贴了标签,你可以使用标签筛选出需要的内容。
可以把 Kubernetes 的资源想象成超市里的各种商品,标签 就像商品的价格标签或类别标签,而 标签选择器 是你的购物清单。
1.商品的标签:每个商品(Pod 或 Service 等)都会有标签,比如 “类别: 水果”、“品牌: 苹果” 或 “价格: 便宜”。2.购物清单(选择器):你拿着购物清单说“我要买所有 类别: 水果 的商品”,这样超市系统就能通过选择器找到所有符合条件的商品。
Service 与 Pod 的关联
Kubernetes Service 使用标签选择器来找到它应该管理的 Pod。例如,某个 Service 需要选择属于 app=nginx 的 Pod,那么 Service 配置如下:
apiVersion: v1
kind: Service
metadata:name: nginx-service
spec:selector:app: nginxports:- protocol: TCPport: 80targetPort: 80这里的 selector: app: nginx 告诉 Service 只与标签为 app=nginx 的 Pod 进行关联和负载均衡。
Deployment 管理 Pod
Deployment 通过标签选择器选择它要管理的 Pod。比如,我们有一个 Deployment 配置,它会选择所有带有 app=nginx 标签的 Pod,并管理其副本数:
apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-deployment
spec:replicas: 3selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx:1.16此 Deployment 会确保始终有 3 个带有 app=nginx 标签的 Pod 运行,并自动修复崩溃的 Pod。
Deployment
在 Kubernetes 中,Deployment 是用于管理应用部署的控制器,它提供了 声明式的更新,帮助用户定义应用的所需状态,并自动进行管理以保持这个状态。Deployment 是更高级别的控制器,它通过管理 ReplicaSet 来控制应用的生命周期,包括自动扩展、滚动更新和回滚等功能。
Deployment概念
Deployment 是生产环境中实现高可用性、弹性扩展和持续交付的重要工具。Deployment 是 Kubernetes 中用于管理应用生命周期的核心控制器,提供了滚动更新、扩展、缩减、副本管理和回滚等功能。
通过 Deployment,用户可以实现:1.高可用性:通过副本管理确保应用的容错性。2.滚动更新:逐步替换旧版本,确保服务不中断。3.回滚:在更新出现问题时快速回滚到稳定版本。4.自动扩展:与 HPA 配合动态调整副本数,优化资源使用。
作用
Deployment 主要有以下几个作用:1.管理应用副本:通过管理 ReplicaSet 来确保应用有固定数量的 Pod 副本运行,以实现高可用性和扩展性。2.滚动更新:当更新应用时,Deployment 允许滚动更新 Pod 副本,逐步用新的 Pod 替换旧的,确保服务不中断。3.回滚:如果新版本出现问题,Deployment 可以轻松回滚到以前的版本。4.扩展和缩减:通过简单地修改副本数,Deployment 可以轻松扩展或缩减应用实例。5.自愈能力:如果某些 Pod 崩溃或意外终止,Deployment 会通过重新调度确保集群中始终有预期数量的 Pod 副本。
工作机制
Deployment 的工作机制依赖于它对 ReplicaSet 的管理。每次用户创建或更新 Deployment 时,Deployment 控制器会创建或更新对应的 ReplicaSet。ReplicaSet 通过维护指定数量的 Pod 来确保应用的可用性。部署新版本时,Deployment 会更新 ReplicaSet 中的 Pod 模板,并逐步用新的 Pod 替换旧的 Pod,从而实现滚动更新。
工作流程:1.初始创建:创建一个 Deployment 时,系统会创建一个 ReplicaSet,并根据配置的副本数量创建相应的 Pod。2.更新:更新 Deployment 时,控制器会创建一个新的 ReplicaSet,并开始逐步替换旧 ReplicaSet 中的 Pod。3.回滚:如果新版本出现问题,用户可以指示 Deployment 回滚到以前的版本,控制器会自动恢复到旧的 ReplicaSet。4.扩展与缩减:可以随时调整副本数量以增加或减少工作负载的处理能力。
YAML 配置
简单的 Deployment YAML 配置示例
apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-deploymentlabels:app: nginx
spec:replicas: 3selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx:1.14.2ports:- containerPort: 80strategy:type: RollingUpdaterollingUpdate:maxUnavailable: 1maxSurge: 1在此示例中:replicas: 3:定义 Deployment 会保持 3 个 Pod 实例运行。selector:标签选择器,用于匹配 ReplicaSet 管理的 Pod。template:定义 Pod 的模板,描述 Pod 的配置,如运行 nginx:1.14.2 镜像。strategy:定义滚动更新策略,在更新时最多 1 个 Pod 不可用,并且最多创建 1 个新的 Pod。
ReplicaSet
在 Kubernetes 中,ReplicaSet 是用于确保集群中始终有指定数量的 Pod 副本在运行的控制器。它的主要功能是 维持应用的高可用性,通过自动创建和删除 Pod 副本,使应用能够根据设定的副本数量动态调整。
作用
ReplicaSet 的核心功能是维持集群中特定数量的 Pod 副本,即使其中某些 Pod 崩溃或被删除,它也会自动补充,确保应用的可用性。ReplicaSet 监控着 Pod 的状态,并根据实际情况调度新的 Pod 或终止多余的 Pod。
ReplicaSet 的关键作用包括:1.保证高可用性:如果某些 Pod 崩溃或意外终止,ReplicaSet 会根据配置重新创建 Pod,使得集群中始终有指定数量的副本。2.自动伸缩:可以通过更新 ReplicaSet 的副本数来增加或减少 Pod 数量,从而调整工作负载处理能力。3.调度 Pod 到合适的节点:ReplicaSet 会将新建的 Pod 自动调度到可用的节点上。
虽然 ReplicaSet 可以独立使用,但通常由更高级的 Deployment 控制器来管理,因为 Deployment 提供了滚动更新和回滚等功能,简化了应用的部署和更新流程。
工作机制
ReplicaSet 通过标签选择器找到需要管理的 Pod。它会不断监控这些 Pod,并根据实际的副本数与期望的副本数进行对比。如果 Pod 数量不足,它会创建新的 Pod;如果 Pod 数量超过指定的副本数,它会终止多余的 Pod。
ReplicaSet 使用 标签选择器 来匹配 Pod。例如,ReplicaSet 可以选择带有 app=nginx 标签的 Pod 进行管理。
其工作机制可以简单概括为1.监控 Pod 状态:ReplicaSet 不断监控集群中符合标签选择器的 Pod。2.比较实际副本数和期望副本数:ReplicaSet 检查实际运行的 Pod 数量是否与期望的副本数一致。3.调整副本数:如果实际副本数少于期望值,ReplicaSet 会创建新的 Pod;如果实际副本数多于期望值,ReplicaSet 会删除多余的 Pod。
ReplicaSet 配置示例
apiVersion: apps/v1
kind: ReplicaSet
metadata:name: nginx-replicaset
spec:replicas: 3selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx:1.14.2ports:- containerPort: 80在此示例中:replicas: 3:表示 ReplicaSet 期望有 3 个副本(Pod)运行。selector:标签选择器,匹配带有 app=nginx 标签的 Pod。ReplicaSet 会根据这个选择器找到并管理对应的 Pod。template:定义 Pod 的模板,包括 Pod 的容器配置(这里运行 nginx:1.14.2 镜像)。当需要创建新的 Pod 时, ReplicaSet 会使用此模板。
常见操作命令
创建 ReplicaSet
kubectl apply -f nginx-replicaset.yaml
查看所有 ReplicaSet 的状态:
kubectl get rs
查看指定 ReplicaSet 的详细信息:
kubectl describe rs nginx-replicaset
扩展或缩减 ReplicaSet
使用命令动态扩展或缩减 Pod 副本数:
kubectl scale rs nginx-replicaset --replicas=5
删除 ReplicaSet 时,Pod 也会随之被删除:
kubectl delete rs nginx-replicaset
总结1.ReplicaSet 是 Kubernetes 中用于确保 Pod 副本数始终与期望值一致的控制器。2.它通过管理 Pod 副本的创建和删除,维持应用的高可用性和容错能力。3.虽然 ReplicaSet 可以单独使用,但通常与 Deployment 结合使用,以获得更丰富的应用更新和管理功能。4.通过 ReplicaSet,Kubernetes 可以自动检测 Pod 状态并进行调整,确保应用能够可靠运行,5.它可以根据需求进行动态扩展或缩减。
Deployment功能
滚动更新
滚动更新是 Deployment 的关键特性之一,它允许逐步更新应用,而不会中断服务。滚动更新会逐个替换旧的 Pod,直到所有 Pod 都已使用新版本。
maxUnavailable:控制滚动更新过程中最多允许多少个不可用的 Pod。可以是绝对值或百分比。
maxSurge:控制滚动更新过程中最多可以超出期望副本数的 Pod 数量。也可以是绝对值或百分比。
例如
strategy:type: RollingUpdaterollingUpdate:maxUnavailable: 1maxSurge: 1
此配置表示,在滚动更新时,最多 1 个 Pod 不可用,并且最多可以有 1 个超过期望副本数的新 Pod。
回滚
Kubernetes Deployment 具有 回滚 功能。如果新版本出现问题,用户可以快速回滚到以前的版本。
回滚命令
kubectl rollout undo deployment/nginx-deployment
Deployment 会自动记录每次更新的历史,用户可以选择回滚到指定的版本或直接回滚到上一个版本。
查看 Deployment 的历史记录:
kubectl rollout history deployment/nginx-deployment
扩容缩容
Deployment 支持动态调整应用副本的数量以满足业务需求,用户可以通过以下命令进行扩展或缩减
kubectl scale deployment/nginx-deployment --replicas=5
这个命令会将 nginx-deployment 的副本数从 3 扩展到 5。
服务高可用
在生产环境中,Deployment 用于保证服务的高可用性。通过部署多个副本(Pod),即使某个 Pod 崩溃或不可用,其他 Pod 也可以继续提供服务,从而避免单点故障。
例如,部署 5 个副本:
spec:replicas: 5
在这种配置下,即使有 1-2 个 Pod 出现故障,服务也不会中断,集群会自动重启故障的 Pod。
灰度发布与回滚
在进行应用更新时,可以使用 Deployment 的 滚动更新 机制进行灰度发布。此时,新版本的 Pod 会逐步替换旧版本 Pod,确保更新过程不影响现有用户的访问。
灰度发布:1.设置 maxUnavailable 和 maxSurge 参数来控制更新过程中可用和新建的 Pod 数量。2.如果在发布过程中发现新版本有问题,可以快速回滚到稳定版本。
灰度发布和回滚命令:
kubectl rollout undo deployment/nginx-deployment
kubectl rollout status deployment/nginx-deployment
自动扩展
在生产环境中,Deployment 通常配合 Horizontal Pod Autoscaler (HPA) 使用。HPA 根据资源使用情况(如 CPU 或内存负载)动态调整 Deployment 的副本数量,以应对流量波动。
HPA 的配置示例:
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:name: nginx-deployment
spec:scaleTargetRef:apiVersion: apps/v1kind: Deploymentname: nginx-deploymentminReplicas: 3maxReplicas: 10targetCPUUtilizationPercentage: 80
在这个示例中,HPA 会根据 CPU 使用率调整 nginx-deployment 的副本数量,确保 CPU 使用率维持在 80% 左右。
常见操作命令
使用 YAML 文件创建 Deployment:
创建Deploymentkubectl apply -f nginx-deployment.yaml #查看Deployment 状态kubectl get deployments kubectl describe deployment nginx-deployment查看滚动更新状态kubectl rollout status deployment/nginx-deployment 更新 Deployment 的镜像版本kubectl set image deployment/nginx-deployment nginx=nginx:1.16.0 删除Deploymentkubectl delete deployment nginx-deployment
StatefulSet
在 Kubernetes 中,StatefulSet 是一种用于管理有状态应用的控制器。与 Deployment 或 ReplicaSet 不同,StatefulSet 专门用于管理那些需要保持状态、稳定网络标识(例如 Pod 名称和顺序)以及持久化存储的应用。它确保 Pod 的顺序、持久化数据和网络身份在 Pod 重启、迁移或扩展时保持一致,是典型的有状态服务(如数据库、分布式存储等)部署的理想选择。
StatefulSet 特点
StatefulSet 提供了几个关键特性,适用于有状态应用的场景:1.稳定的 Pod 名称:StatefulSet 中的 Pod 名称是有序且稳定的。即使 Pod 被删除或重启,它的名称(如 web-0、web-1)仍然保持不变。2.稳定的网络标识:StatefulSet 中的每个 Pod 都有一个稳定的 DNS 名称,允许其他服务始终可以通过固定的地址访问它们。3.有序部署和删除:Pod 的启动和删除是有序的。Pod 会按顺序逐个启动,并且在扩展和缩减时也会按照相反的顺序逐步进行。4.持久存储:StatefulSet 通常与 PersistentVolume (PV) 和 PersistentVolumeClaim (PVC) 配合使用。每个 Pod 都会拥有自己的持久存储卷,即使 Pod 被删除或重建,存储卷中的数据仍然保留。
有序性
StatefulSet 的一大特点是 '有序部署' 和 '有序删除',这意味着:1.有序启动:Pod 会按照顺序从 0 开始依次启动,直到达到指定的副本数量。每个 Pod 启动前,会等待前一个 Pod 处于 Running 和 Ready 状态。2.有序终止:Pod 的终止也是有序的,按照倒序从最大的副本开始,依次停止。
工作机制
StatefulSet 的工作机制与 Deployment 和 ReplicaSet 类似,但它特别注重 有序性 和 持久化存储。
关键机制:1.Pod 名称和网络 ID 的稳定性:StatefulSet 使用有序的 Pod 名称和稳定的网络标识,确保每个 Pod 都可以在集群中通过固定的名称和地址进行访问。2.有序操作:StatefulSet 确保 Pod 是按顺序逐个启动和删除的(从 0 到 N-1),这对于某些需要依赖顺序启动的应用至关重要。3.独立持久化存储:每个 StatefulSet 的 Pod 都拥有自己独立的存储卷,这些卷不会被其他 Pod 共享或覆盖,且在 Pod 删除后仍然保留。
StatefulSet 的 YAML 配置示例
下面是一个典型的 StatefulSet 配置示例,用于部署一个有状态的 Nginx 服务:
apiVersion: apps/v1
kind: StatefulSet
metadata:name: nginx
spec:serviceName: "nginx-service"replicas: 3selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx:1.16.1ports:- containerPort: 80volumeMounts:- name: wwwmountPath: /usr/share/nginx/htmlvolumeClaimTemplates:- metadata:name: wwwspec:accessModes: [ "ReadWriteOnce" ]resources:requests:storage: 1Gi
DaemonSet
DaemonSet是 Kubernetes 中的一个重要控制器对象,适用于需要在每个节点上运行的守护进程。它确保在每个节点上部署一个 Pod,并且能够自动适应集群中节点的增加或减少。通过 DaemonSet,可以有效管理系统级别的服务,如日志收集、监控代理、网络插件等,并通过滚动更新机制保持系统的稳定性和高可用性。
DaemonSet 详解
用途
DaemonSet 的主要目的是确保特定的 Pod 能够在每个(或某些)节点上运行。
DaemonSet 的用途1.节点监控: 如Prometheus Node Exporter,用来收集每个节点的资源使用情况。2.日志收集器: 如Fluentd,用于从每个节点收集日志数据。3.网络代理: 如Calico 或 Weave 等网络插件需要在每个节点上部署网络代理。4.存储管理: 如Ceph 或 GlusterFS,这些分布式存储需要在每个节点上运行守护进程。
特性
DaemonSet的特性1.每个节点一个Pod:DaemonSet确保集群中的每个节点都运行一个 Pod。当新节点加入时,DaemonSet 会自动在该节点上启动相应的 Pod。2.自动管理:当节点被添加到集群中时,DaemonSet 会自动在新节点上启动 Pod;当节点被移除时,DaemonSet 会自动清理该节点上的 Pod。3.特定节点调度:DaemonSet 允许使用节点选择器(Node Selector)或节点亲和性(Node Affinity)来限制 Pod 的调度,从而控制哪些节点应该运行 DaemonSet Pod。4.滚动更新:DaemonSet支持通过滚动更新机制来逐个节点更新Pod实例,从而实现无停机的更新。
DaemonSet 与 Deployment 的区别
DaemonSet 与 Deployment 的区别1.调度方式不同:Deployment 根据 ReplicaSet 的副本数将 Pod 调度到集群中不同的节点上,且没有规定每个节点只能运行一个 Pod。而 DaemonSet 确保每个节点(或指定的节点)上都运行一个 Pod。2.主要用途不同:Deployment 常用于部署业务应用,而 DaemonSet 通常用于系统级服务或需要在所有节点上运行的守护进程。
工作原理
DaemonSet 通过 Kubernetes 调度器与 API Server 进行交互,确保每个符合条件的节点上都运行一个 DaemonSet Pod。
DaemonSet主要有以下工作流程:1.创建DaemonSet:当用户创建DaemonSet时,API Server接收并处理DaemonSet对象,控制器会创建相应的Pod模板。2.Pod调度:DaemonSet控制器为每个符合条件的节点创建一个 Pod,调度器将这些Pod分发到集群中的节点上。3.节点变化:当新节点加入集群时,DaemonSet控制器会检测到,并自动在该节点上创建一个新的Pod;如果某个节点宕机或离开集群,则相应的Pod会被清理。4.滚动更新:如果DaemonSet配置或镜像版本需要更新,DaemonSet支持逐步更新每个节点上的Pod。
DaemonSet 的示例
1.简单的 DaemonSet 示例
以下是一个简单的 DaemonSet YAML 文件,创建一个在每个节点上运行 nginx 守护进程的 DaemonSet:
apiVersion: apps/v1
kind: DaemonSet
metadata:name: nginx-daemonsetlabels:app: nginx
spec:selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx:latestports:- containerPort: 80解释:kind: DaemonSet:定义了这是一个 DaemonSet 对象。metadata.name:设置 DaemonSet 的名称为 nginx-daemonset。spec.template:定义了 Pod 模板,指定在每个节点上运行 nginx 容器。containerPort:容器内部监听的端口为 80。
这个 DaemonSet 将在集群中的每个节点上运行一个 nginx 容器。
2.使用节点选择器的 DaemonSet
在某些情况下,你可能只想在特定类型的节点上运行 DaemonSet Pod。可以通过节点选择器(Node Selector)来实现。
假设我们有一些节点带有标签 disk=ssd,我们只想让 DaemonSet Pod 运行在这些节点上,可以通过以下方式指定:
apiVersion: apps/v1
kind: DaemonSet
metadata:name: nginx-daemonsetlabels:app: nginx
spec:selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:nodeSelector:disk: ssdcontainers:- name: nginximage: nginx:latestports:- containerPort: 80解释:nodeSelector:指定只有带有标签 disk=ssd 的节点才能运行这个 DaemonSet 的 Pod。
3.DaemonSet 滚动更新示例
DaemonSet 支持滚动更新,允许逐步更新节点上的守护进程,以避免系统中断。要启用滚动更新,可以在 DaemonSet 中设置 updateStrategy:
apiVersion: apps/v1
kind: DaemonSet
metadata:name: nginx-daemonsetlabels:app: nginx
spec:updateStrategy:type: RollingUpdaterollingUpdate:maxUnavailable: 1selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx:1.19ports:- containerPort: 80解释:updateStrategy.type: RollingUpdate:指定更新策略为滚动更新。maxUnavailable:表示在更新过程中最多允许有 1 个节点的 Pod 处于不可用状态。
在进行滚动更新时,DaemonSet 控制器会逐个节点更新 Pod,确保在任何时刻都有大多数 Pod 保持运行状态。
DaemonSet 常见使用场景
DaemonSet 常见使用场景1.日志收集Fluentd、Filebeat等日志收集工具通常会以DaemonSet的形式部署在集群中,确保每个节点上都运行一个日志收集器,用于收集并转发本地的日志数据。2.监控代理系统监控工具如Prometheus Node Exporter、Datadog Agent通常通过DaemonSet部署,以便收集每个节点的系统指标。3.网络插件Kubernetes网络插件如Calico、Weave等需要在每个节点上运行网络代理来管理网络流量,这些代理通常使用 DaemonSet来部署。4.存储管理分布式存储系统如 Ceph、GlusterFS 等也需要在每个节点上运行守护进程,以便管理存储卷和数据访问。