Kubernetes 进阶实战:CRD、Gateway API 与优先级调度

本文将深入探讨 Kubernetes 的三个高级特性:自定义资源定义(CRD)、新一代 Gateway API 和优先级调度(PriorityClass)。这些功能代表了 Kubernetes 的可扩展性和高级调度能力,是构建生产级云原生平台的关键技术。

一、CRD:扩展 Kubernetes API

自定义资源定义(CRD)允许用户扩展 Kubernetes API,定义自己的资源类型,从而将自定义应用逻辑集成到 Kubernetes 生态中。

1. 创建简单的 CRD

复制代码
# cronjob-crd.yaml
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
  name: cronjobs.stable.example.com
spec:
  group: stable.example.com
  versions:
    - name: v1
      served: true
      storage: true
      schema:
        openAPIV3Schema:
          type: object
          properties:
            spec:
              type: object
              properties:
                cronSpec:
                  type: string
                image:
                  type: string
                replicas:
                  type: integer
  scope: Namespaced
  names:
    plural: cronjobs
    singular: cronjob
    kind: CronJob
    shortNames:
    - cj

应用 CRD:

复制代码
kubectl apply -f cronjob-crd.yaml

2. 创建自定义资源实例

复制代码
# my-cronjob.yaml
apiVersion: "stable.example.com/v1"
kind: CronJob
metadata:
  name: my-custom-cronjob
spec:
  cronSpec: "* * * * *"
  image: my-app:latest
  replicas: 3

扩展内容:CRD 与 Operator 模式

  1. 控制器集成:CRD 通常与自定义控制器配合使用,实现完整的 Operator 模式

  2. 验证规则:可以通过 OpenAPI v3 schema 定义资源验证规则

  3. 版本管理:支持多版本共存和版本转换

  4. 生态集成:成熟的 Operator 框架如 Kubebuilder、Operator SDK

二、Gateway API:新一代服务网络标准

Gateway API 是 Kubernetes 官方推出的新一代服务网络 API,旨在替代传统的 Ingress,提供更丰富、更面向角色的网络功能。

1. 创建 GatewayClass

复制代码
# gateway-class.yaml
apiVersion: gateway.networking.k8s.io/v1
kind: GatewayClass
metadata:
  name: company-gateway-class
spec:
  controllerName: example.com/gateway-controller
  parametersRef:
    name: company-gateway-parameters
    group: example.com
    kind: GatewayParameters

2. 创建 Gateway 和 HTTPRoute

复制代码
# gateway-and-route.yaml
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
  name: company-gateway
spec:
  gatewayClassName: company-gateway-class
  listeners:
  - name: web
    port: 80
    protocol: HTTP
    allowedRoutes:
      namespaces:
        from: Same
---
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  name: http-app-route
spec:
  parentRefs:
  - name: company-gateway
  rules:
  - matches:
    - path:
        type: PathPrefix
        value: /app
    backendRefs:
    - name: app-service
      port: 8080
  - matches:
    - path:
        type: PathPrefix
        value: /api
    backendRefs:
    - name: api-service
      port: 3000

扩展内容:Gateway API 优势

  1. 面向角色设计:清晰分离基础设施管理员、应用开发者的职责

  2. 跨命名空间路由:支持跨命名空间的流量管理

  3. 丰富的路由能力:支持基于 Header、查询参数等复杂路由规则

  4. 服务网格集成:为服务网格提供标准化的流量管理接口

三、PriorityClass:精细化 Pod 调度优先级

PriorityClass 允许为 Pod 设置优先级,影响调度器在资源紧张时的决策,确保关键业务优先获得资源。

1. 创建 PriorityClass

复制代码
# priorityclasses.yaml
apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
  name: high-priority
value: 1000000
globalDefault: false
description: "用于关键业务 Pod"
---
apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
  name: medium-priority
value: 500000
globalDefault: true
description: "默认优先级"
---
apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
  name: low-priority
value: 100000
globalDefault: false
description: "用于批处理任务"

2. 在 Pod 中使用 PriorityClass

复制代码
# high-priority-pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: critical-app
spec:
  containers:
  - name: app
    image: critical-app:latest
    resources:
      requests:
        memory: "256Mi"
        cpu: "500m"
      limits:
        memory: "512Mi"
        cpu: "1000m"
  priorityClassName: high-priority

扩展内容:优先级调度实战策略

  1. 系统优先级保留:Kubernetes 系统组件使用 2000000000 及以上优先级

  2. 抢占机制:高优先级 Pod 可以抢占低优先级 Pod 的资源

  3. 资源配额关联:结合 ResourceQuota 确保优先级策略有效执行

  4. 多租户场景:为不同业务部门分配不同优先级类别

实战案例:构建完整应用栈

完整部署示例

复制代码
# complete-stack.yaml
apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
  name: production-priority
value: 1000000

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: web-app
  template:
    metadata:
      labels:
        app: web-app
    spec:
      priorityClassName: production-priority
      containers:
      - name: web
        image: nginx:latest
        ports:
        - containerPort: 80

---
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  name: web-app-route
spec:
  parentRefs:
  - name: company-gateway
  rules:
  - matches:
    - path:
        type: PathPrefix
        value: /
    backendRefs:
    - name: web-app
      port: 80

总结

这三个高级特性代表了 Kubernetes 平台的不同维度的扩展能力:

  1. CRD:提供了 API 层面的扩展能力,让 Kubernetes 能够管理任意类型的资源

  2. Gateway API:重新定义了服务网络的标准,提供更强大、更规范的流量管理能力

  3. PriorityClass:实现了调度层面的精细化控制,确保关键业务的服务质量

掌握这些特性,意味着您不仅能够使用 Kubernetes,更能够根据业务需求定制和优化 Kubernetes 平台。这些技能对于构建企业级云原生平台、实现真正的 GitOps 和自动化运维至关重要。

在实际应用中,建议将这些特性与 CI/CD 流程、监控告警、安全策略等结合,构建完整的云原生技术体系。

相关推荐
七夜zippoe3 小时前
Java 生态监控体系实战:Prometheus+Grafana+SkyWalking 整合全指南(二)
java·grafana·prometheus
没事学AI3 小时前
Caffeine三种缓存过期策略总结:原理、实战与调优
java·缓存·caffeine·缓存穿透防护·caffeine缓存
Micro麦可乐3 小时前
为什么两个看似相等的 Integer 却不相等?一次诡异的缓存折扣商品 BUG 排查
java·缓存·bug·包装类判断·integer判断
杨杨杨大侠3 小时前
手把手教你写 httpclient 框架(七)- 异步处理与性能优化
java·http·github
ajassi20003 小时前
开源 java android app 开发(十四)自定义绘图控件--波形图
android·java·开源
一叶飘零_sweeeet4 小时前
从 0 到 1 精通 SkyWalking:分布式系统的 “透视镜“ 技术全解析
java·skywalking
七夜zippoe4 小时前
Java 生态监控体系实战:Prometheus+Grafana+SkyWalking 整合全指南(三)
java·grafana·prometheus
陈遇巧4 小时前
Spring Framework
java·笔记·spring
我是华为OD~HR~栗栗呀4 小时前
20届-高级开发(华为oD)-Java面经
java·c++·后端·python·华为od·华为