当前位置: 首页 > news >正文

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 等也需要在每个节点上运行守护进程,以便管理存储卷和数据访问。

http://www.mrgr.cn/news/50565.html

相关文章:

  • 【java】— 类和对象(这一篇就够了)
  • Podman 的一些常用指令
  • 【Next.js 项目实战系列】01-创建项目
  • 匿名管道和命名管道
  • 想高薪!普通人转行做AI,试试这5步!
  • 胤娲科技:Pika 1.5燃爆登场——AI视频特效,让万物“笑”果全开
  • 初级网络工程师之从入门到入狱(四)
  • 每月洞察:App Store 和 Google Play 的主要更新
  • 什么台灯护眼效果好?五款专业护眼灯款式分享
  • RHCSA复习题
  • WebServer构建响应 发送响应
  • 如何解决数字化转型的老大难,突破部门流程墙
  • 歌曲怎么去掉原唱只留伴奏?创作无界,轻松获取伴奏音轨
  • 第1章:Flux学习前言(必读)
  • 游游的you(贪心+思路+代码)
  • AWS账号与邮箱的关系解析
  • 鲸鸿动能广告助力App流量高效变现,促进商业增长
  • goDoH:一款使用了DNS-over-HTTPS作为传输端口的C2框架
  • 《Linux运维》之解决“Failed to start LSB: Bring up/down networking.“问题的方法
  • 克隆容量不同的硬盘