k8s pod调度基础

发布于:2025-07-03 ⋅ 阅读:(27) ⋅ 点赞:(0)

目录

一:replication controller和replicaset

1:replication controller

replication controller的使用示例。

2:标签与标签选择器

(1)标签

(2)标签选择器

(3)标签与标签选择器举例

3:replicaset

replicaset的使用示例。

二:无状态应用管理Deployment

1:什么是无状态

2:无状态服务特点

3:无状态服务的应用场景

4:Deployment的使用示例。

(1)创建Deployment

(2)更新Deployment

(3)回滚Deployment

(4)扩容Deployment

(5)删除Deployment

三:有状态应用管理statefulset

1:什么是有状态

2:有状态服务特点

3:有状态服务的应用场景

4:statefulset的使用示例。

(1)创建statefulset

(2)扩容statefulset

(3)缩容statefulset

(4)非级联删除statefulset

(5)级联删除statefulset

四:守护进程集DaemonSet

1:什么是DaemonSet

2:DaemonSet的使用示例。

五:CronJob

1:CronJob的使用示例。


一:replication controller和replicaset

1:replication controller

RC(replication controller,复制控制器)
数量维持在指定数值上

RC用来确保Pod副本数达到期望值,这样可以确保一个或多个同类Pod总是可用的。

replication controller的使用示例。

#编写RC文件
vim replicationcontroller-nginx.yaml
apiVersion: v1
kind: ReplicationController
metadata:
  name: nginx
spec:
  replicas: 3
  selector:
    app: nginx
  template:
    metadata:
      name: nginx
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.9
        ports:
        - containerPort: 80
#创建RC
kubectl apply -f replicationcontroller-nginx.yaml
#查看节点运行状态
kubectl get pod
kubectl get rc
#删除一个pod并立即查看pod状态
kubectl delete -f replicationcontroller-nginx.yaml

2:标签与标签选择器

(1)标签

在 Kubernetes 中,标签(Labels)是附加到资源(如 Pod、Node、Service 等)上的键值对,用于组织、标识和选择资源。标签不提供唯一性,同一标签可以被添加到多个资源上。

示例标签:

app: web-server
env: production
tier: frontend

(2)标签选择器

标签选择器(Label Selectors)是 Kubernetes 中用于过滤和选择资源的表达式。通过标签选择器,可以基于标签的键值对来筛选符合条件的资源。

标签选择器类型:

  • 等式 - based 选择器:使用===(相等)或!=(不相等)。

    app=web-server
    env!=development
    

  • 集合 - based 选择器:使用innotinexists

    tier in (frontend, backend)
    env notin (test, staging)

(3)标签与标签选择器举例

  • 基于等式的标签选择器

    selector:
      app: nginx

  • 基于集合的标签选择器

    matchExpressions:
      - {key: tier, operator: In, values: [frontend]}
 

3:replicaset

ReplicaSet(复制集,RS)是支持基于集合的标签选择器的下一代Replication Controller,它主要用于Deployment协调创建、删除和更新Pod,和Replication Controller唯一的区别是,ReplicaSet支持基于集合的标签选择器。

replicaset的使用示例。

#编写RS文件
vim replicaset-example.yaml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: frontend
  labels:
    app: guestbook
    tier: frontend
spec:
  # modify replicas according to your case
  replicas: 3
  selector:
    matchLabels:
      tier: frontend
    matchExpressions:
      - {key: tier, operator: In, values: [frontend]}
  template:
    metadata:
      labels:
        app: guestbook
        tier: frontend
    spec:
      containers:
      - name: php-redis
        image: nginx:1.7.9
        resources:
          requests:
            cpu: 100m
            memory: 100Mi
        env:
        - name: GET_HOSTS_FROM
          value: dns
          # If your cluster config does not include a dns service, then to
          # instead access environment variables to find service host
          # info, comment out the 'value: dns' line above, and uncomment the
          # line below.
          # value: env
        ports:
        - containerPort: 80

#创建RS
kubectl apply -f replicaset-example.yaml
#查看节点运行状态
kubectl get pod
#删除一个pod并立即查看pod状态
kubectl delete -f replicaset-example.yaml

二:无状态应用管理Deployment

1:什么是无状态

在云计算和微服务架构中,"无状态" 指应用不保存客户端会话数据或请求间的上下文信息。每次请求都被视为独立事件,服务器不会记录之前的交互状态。无状态应用的实例可以独立运行,无需共享状态信息。

2:无状态服务特点

  • 独立性:每个请求都能被任意实例处理,无需依赖其他实例
  • 可扩展性:易于水平扩展,通过增加实例数量提升处理能力
  • 高可用性:单个实例故障不影响整体服务,可快速替换
  • 简化部署:无需考虑状态同步,部署和管理更简单

3:无状态服务的应用场景

  • Web 前端服务:如静态网站、API 网关
  • 批处理作业:数据处理任务,无需保存中间状态
  • 微服务架构:多数微服务设计为无状态,便于独立扩展
  • 负载均衡场景:请求可随机分发到任意实例

4:Deployment的使用示例。

(1)创建Deployment

下面是一个部署 Nginx 的示例:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80

执行命令创建:

kubectl apply -f nginx-deployment.yaml

(2)更新Deployment

将 Nginx 版本更新到 1.16.1:

kubectl set image deployment/nginx-deployment nginx=nginx:1.16.1

或直接编辑配置文件后重新应用:

kubectl edit deployment/nginx-deployment

(3)回滚Deployment

#查看更新历史:
kubectl rollout history deployment/nginx-deployment
#回滚到上一个版本:
kubectl rollout undo deployment/nginx-deployment
#回滚到指定版本:
kubectl rollout undo deployment/nginx-deployment --to-revision=2

(4)扩容Deployment

#将副本数增加到 5:
kubectl scale deployment/nginx-deployment --replicas=5
#通过编辑配置文件:
spec:
  replicas: 5

(5)删除Deployment

kubectl delete deployment nginx-deployment

三:有状态应用管理statefulset

1:什么是有状态

在容器编排领域,"有状态" 指应用需要维护特定的状态信息,这些状态信息与其生命周期密切相关,例如:

  • 唯一的网络标识(如固定的主机名或 IP 地址)
  • 持久化存储(如数据库文件、配置数据)
  • 有序的启动 / 停止顺序
  • 与其他组件的特定关联关系

与无状态应用(如 Web 服务器集群)不同,有状态应用的每个实例都是不可互换的,需要单独管理其状态。

2:有状态服务特点

  • 稳定的网络标识:每个 Pod 都有固定的标识符(如 web-0web-1),不受重启或迁移影响。
  • 持久化存储:通过 PersistentVolumeClaim (PVC) 绑定持久卷,确保数据不随 Pod 销毁而丢失。
  • 有序部署与扩展:Pod 按顺序创建(从 0 开始递增),且前一个 Pod 就绪后才创建下一个。
  • 有序收缩与删除:Pod 按逆序终止(从最大序号开始),确保数据一致性。
  • 滚动更新:支持按序更新 Pod,可配置更新策略(如并行或顺序)。

3:有状态服务的应用场景

  • 数据库集群:如 MySQL、MongoDB、Elasticsearch,需要固定网络标识和持久化存储。
  • 消息队列:如 Kafka、RabbitMQ,依赖有序节点和数据持久化。
  • 分布式系统:如 ZooKeeper、etcd,需要稳定的成员关系和状态存储。
  • 文件系统:如 NFS、Ceph,需要固定的存储提供者。
  • 任何需要保持会话状态的应用:如用户会话管理、购物车系统等。

4:statefulset的使用示例。

(1)创建statefulset

以下是一个简单的 Nginx StatefulSet 示例,包含固定域名和持久化存储:

apiVersion: v1
kind: Service
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  ports:
  - port: 80
    name: web
  clusterIP: None  # Headless Service,用于稳定的网络标识
  selector:
    app: nginx
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: web
spec:
  serviceName: "nginx"  # 指定关联的 Headless Service
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80
          name: web
        volumeMounts:
        - name: www
          mountPath: /usr/share/nginx/html
  volumeClaimTemplates:  # 持久化存储声明模板
  - metadata:
      name: www
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 1Gi

创建命令:

kubectl apply -f statefulset.yaml

(2)扩容statefulset

#将 replicas 从 3 增加到 5:
kubectl scale statefulset web --replicas=5
#直接编辑 StatefulSet:
kubectl edit statefulset web

(3)缩容statefulset

#将 replicas 从 5 减少到 2:
kubectl scale statefulset web --replicas=2

(4)非级联删除statefulset

#仅删除 StatefulSet 控制器,保留 Pod 和 PVC:
kubectl delete statefulset web --cascade=orphan

#此时:

Pods 不会被删除,继续运行
PVC 和 PV 保持不变,数据不会丢失
重新创建同名 StatefulSet 时,会接管现有 Pod

(5)级联删除statefulset

#删除 StatefulSet 及其管理的 Pods,但保留 PVC:
kubectl delete statefulset web
#彻底删除 StatefulSet、Pods 和 PVC:
kubectl delete statefulset web --cascade=foreground
kubectl delete pvc -l app=nginx  # 删除关联的 PVC

四:守护进程集DaemonSet

1:什么是DaemonSet

DaemonSet 是 Kubernetes 中的一种控制器,其核心功能是确保集群中每个(或指定)节点上都运行一个 Pod 副本。当节点加入集群时,DaemonSet 会自动在该节点上部署 Pod;当节点从集群中移除时,Pod 也会被相应删除。这种特性使其适用于需要在每个节点上运行系统级服务的场景,例如:

  • 节点监控代理(如 Prometheus Node Exporter)
  • 日志收集代理(如 Fluentd)
  • 网络插件(如 Calico Node)
  • 存储驱动程序(如 Ceph 客户端)

DaemonSet 的典型特点包括:

  • 节点一致性:确保 Pod 在节点上均匀分布,无需手动管理每个节点的部署。
  • 自动适配节点变化:动态响应集群节点的添加或删除。
  • 无副本数量控制:副本数由节点数量决定,而非手动指定。

2:DaemonSet的使用示例。

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: node-exporter
  namespace: monitoring
spec:
  selector:
    matchLabels:
      app: node-exporter
  template:
    metadata:
      labels:
        app: node-exporter
    spec:
      containers:
      - name: node-exporter
        image: prom/node-exporter:v1.6.1
        ports:
        - containerPort: 9100
        securityContext:
          privileged: true  # 允许访问节点硬件信息
        volumeMounts:
        - name: proc
          mountPath: /host/proc
        - name: sys
          mountPath: /host/sys
      volumes:
      - name: proc
        hostPath:
          path: /proc
      - name: sys
        hostPath:
          path: /sys
      tolerations:
      - key: node-role.kubernetes.io/master
        operator: Exists
        effect: NoSchedule
      nodeSelector:
        kubernetes.io/os: linux  # 仅在Linux节点部署

关键配置说明

  • selector:定义 Pod 的标签选择器,用于匹配模板中的标签。
  • volumes/volumeMounts:通过hostPath挂载节点的/proc/sys目录,使 Pod 能访问节点硬件信息。
  • tolerations:设置容忍度以允许在 Master 节点部署(默认情况下 DaemonSet 不会在 Master 节点运行)。
  • nodeSelector:指定仅在 Linux 节点上部署 Pod。

五:CronJob

CronJob 是 Kubernetes 中用于管理周期性任务的控制器,类似 Linux 系统中的 crontab,支持按时间计划创建 Job(一次性任务)。典型应用场景包括:

  • 定时备份数据库
  • 周期性数据统计与报表生成
  • 定时清理临时文件
  • 批量任务调度(如每日凌晨同步数据)

1:CronJob的使用示例。

apiVersion: batch/v1
kind: CronJob
metadata:
  name: mysql-backup
  namespace: default
spec:
  schedule: "0 2 * * *"  # 每天凌晨2点执行
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: mysql-backup
            image: mysql:8.0
            env:
            - name: MYSQL_HOST
              value: "mysql-service"
            - name: MYSQL_USER
              value: "backup-user"
            - name: MYSQL_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: mysql-secrets
                  key: password
            - name: BACKUP_DIR
              value: "/backups"
            command: ["/bin/sh", "-c"]
            args:
            - |
              mkdir -p $(BACKUP_DIR)
              mysqldump -h $(MYSQL_HOST) -u $(MYSQL_USER) -p$(MYSQL_PASSWORD) mydatabase > $(BACKUP_DIR)/db_backup_$(date +\%Y\%m\%d).sql
              tar -czf $(BACKUP_DIR)/backup_$(date +\%Y\%m\%d).tar.gz $(BACKUP_DIR)/db_backup_$(date +\%Y\%m\%d).sql
              # 此处可添加上传备份到云存储的命令
          volumes:
          - name: backup-volume
            persistentVolumeClaim:
              claimName: backup-pvc
          restartPolicy: OnFailure
  successfulJobsHistoryLimit: 3  # 保留最近3次成功任务记录
  failedJobsHistoryLimit: 1     # 保留最近1次失败任务记录

关键配置说明

  • schedule:使用 crontab 格式定义执行时间,"0 2 * * *"表示每天凌晨 2 点。
  • env:通过环境变量传递数据库连接信息,密码从 Secret 中获取以保证安全。
  • command/args:定义备份脚本,使用mysqldump导出数据库并打包压缩。
  • volumes:通过 PersistentVolumeClaim 持久化存储备份文件,避免 Pod 重启后数据丢失。
  • restartPolicy:设置为OnFailure,仅在任务失败时重启容器。
  • historyLimit:控制历史任务记录数量,避免占用过多资源。

网站公告

今日签到

点亮在社区的每一天
去签到