K8s 集群性能优化核心是从资源配置、调度策略、组件性能、基础设施四个维度针对性调优,以提升资源利用率和集群稳定性。

1. 资源配置优化

  • 精准设置资源请求与限制:根据应用实际需求配置 requests(保证资源)和 limits(资源上限),避免过度分配或资源不足。例如,CPU 请求设为应用常态使用率的 80%,内存请求考虑应用峰值的 90%。

案例:

apiVersion: v1
kind: Pod
metadata:
  name: app-demo
spec:
  containers:
  - name: app-container
    image: nginx:alpine
    resources:
      requests:  # 保证分配的资源(调度依据)
        cpu: "200m"  # 200毫核(0.2核),根据应用常态CPU使用率80%设定
        memory: "256Mi"  # 保证256MB内存,按峰值90%估算
      limits:  # 资源上限(超限时可能被限流/驱逐)
        cpu: "500m"  # 最多使用0.5核
        memory: "512Mi"  # 最多使用512MB内存

  • 启用资源 QoS 分级:通过 QoS(Quality of Service)为 Pod 划分优先级,确保关键业务(如 Guaranteed 类 Pod)在资源紧张时优先获得资源,非关键业务(如 BestEffort 类 Pod)可被驱逐。

Guaranteed 级(关键业务,资源完全保障):requests 与 limits 完全相等

resources:
  requests:
    cpu: "1"
    memory: "1Gi"
  limits:
    cpu: "1"
    memory: "1Gi"

Burstable 级(普通业务,资源可弹性):requests < limits

resources:
  requests:
    cpu: "500m"
  limits:
    cpu: "1"

BestEffort 级(非关键业务,无资源保障):不设置 requests 和 limits

resources: {}  # 空配置

  • 压缩容器镜像:使用多阶段构建、精简基础镜像(如 Alpine),减少镜像体积,提升拉取速度和启动效率。
# 构建阶段(使用完整编译环境)
FROM golang:1.21 AS builder
WORKDIR /app
COPY . .
RUN go build -o app main.go

# 运行阶段(使用最小基础镜像)
FROM alpine:3.18
WORKDIR /app
COPY --from=builder /app/app .  # 仅复制编译好的二进制文件
EXPOSE 8080
CMD ["./app"]

2. 调度策略优化

  • 节点亲和性与 Pod 亲和性 / 反亲和性:合理设置亲和性规则,将关联紧密的 Pod 调度到同一节点(如前端与后端),避免反亲和的 Pod 共处同一节点(如数据库主从),减少网络开销。
(1)节点亲和性与 Pod 亲和性 / 反亲和性
apiVersion: v1
kind: Pod
metadata:
  name: frontend-pod
spec:
  containers:
  - name: frontend
    image: nginx:alpine
  affinity:
    # 节点亲和性:优先调度到"role=app"标签的节点
    nodeAffinity:
      preferredDuringSchedulingIgnoredDuringExecution:
      - weight: 100
        preference:
          matchExpressions:
          - key: role
            operator: In
            values: ["app"]
    # Pod亲和性:与"app=backend"的Pod调度到同一节点(减少网络开销)
    podAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
      - labelSelector:
          matchExpressions:
          - key: app
            operator: In
            values: ["backend"]
        topologyKey: kubernetes.io/hostname
    # Pod反亲和性:不与"app=database"的Pod共处同一节点(避免资源竞争)
    podAntiAffinity:
      preferredDuringSchedulingIgnoredDuringExecution:
      - weight: 100
        podSelector:
          matchExpressions:
          - key: app
            operator: In
            values: ["database"]
        topologyKey: kubernetes.io/hostname

更多内容可关注下方公众号查看

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐