跳转至

Quick Start - Ack

aliyun 容器服务多种模式使用下来还是 ack 托管集群性价比高。

ack serverless 就是一个坑货。对最小资源规格有限制,按 eni 容量计费显贵。

一、Quick

ack 托管集群使用常用技巧

1.1 动态扩缩

1.2 ingress-nginx服务暴露

# helm 配置文件中指定

controller:

  config:
    ...
    allow-snippet-annotations: "true"
    annotations-risk-level: "Critical" # 4.14.1 往后默认降级为 Warn 对注解中的 snippet 大部分不支持
    forwarded-for-header: "X-Forwarded-For" # 获取来访 IP
    real-ip-header: "X-Forwarded-For"
    set-real-ip-from: "0.0.0.0/0"

  kind: Deployment # 不用像此前 DaemonSet 模式固定节点
  replicaCount: 2

  service: # 会自动在 clb 创建负载均衡
    type: LoadBalancer
    annotations:
      service.beta.kubernetes.io/alibaba-cloud-loadbalancer-address-type: internet # intranet-对内,internet-对外

1.3 使用私有内网 dns

# 1. 移除内置 CoreDNS(组件管理 -- 搜索 CoreDNS -- 卸载)

# 2. 安装普通 CoreDNS(组件管理 -- 搜索 CoreDNS -- 安装)

# 3. 编辑配置 configmap/coredns
# worker 节点不允许变更 /etc/resolv.conf,其实变更也无法 dns 拦截

kubectl -n kube-system edit cm coredns
        ...
        forward . 10.0.0.2 { # 替换配置为私有dns
          prefer_udp
        }

二、资源隔离

在 Kubernetes 中,按 Namespace 限制资源使用,通常有 3 种方式,分别解决不同问题:

  1. 限制单个 Pod/Container 最大最小资源LimitRange
  2. 限制整个 Namespace 总资源配额ResourceQuota
  3. 限制对象数量(Pod、PVC、Service 数量等)ResourceQuota

一般生产环境会 LimitRange + ResourceQuota 配合使用


1. 使用 ResourceQuota 限制 Namespace 总资源

例如限制 dev namespace:

  • CPU 总量最多:8 核
  • 内存总量最多:16Gi
  • Pod 数量最多:50
  • PVC 总量:20

YAML 示例

apiVersion: v1
kind: ResourceQuota
metadata:
  name: dev-resource-quota
  namespace: dev
spec:
  hard:
    requests.cpu: "4"
    requests.memory: 8Gi

    limits.cpu: "8"
    limits.memory: 16Gi

    pods: "50"
    persistentvolumeclaims: "20"

创建:

kubectl apply -f quota.yaml

查看:

kubectl describe resourcequota -n dev

示例输出:

Name:            dev-resource-quota
Namespace:       dev
Resource         Used    Hard
--------         ----    ----
limits.cpu       2       8
limits.memory    4Gi     16Gi
pods             12      50

资源说明

配额项 说明
requests.cpu namespace 所有 Pod request CPU 总和
requests.memory request memory 总和
limits.cpu limit CPU 总和
limits.memory limit memory 总和
pods pod 数量
services Service 数量
persistentvolumeclaims PVC 数量
requests.storage 存储申请总量

2. 使用 LimitRange 限制 Pod 默认资源与上下限

仅靠 ResourceQuota 有个问题:

用户不写 resources,Pod 可能无法创建或无限制。

所以建议同时加 LimitRange

例如:

  • 默认 CPU request:100m
  • 默认 memory request:128Mi
  • 单容器最大 CPU:2核
  • 单容器最大内存:4Gi

YAML 示例

apiVersion: v1
kind: LimitRange
metadata:
  name: dev-limit-range
  namespace: dev
spec:
  limits:
  - type: Container

    defaultRequest:
      cpu: 100m
      memory: 128Mi

    default:
      cpu: "500m"
      memory: 512Mi

    min:
      cpu: 50m
      memory: 64Mi

    max:
      cpu: "2"
      memory: 4Gi

应用:

kubectl apply -f limitrange.yaml

查看:

kubectl describe limitrange -n dev

效果:

如果用户 Deployment 不写资源:

resources: {}

K8s 自动补充:

resources:
  requests:
    cpu: 100m
    memory: 128Mi
  limits:
    cpu: 500m
    memory: 512Mi

如果超限:

例如申请:

resources:
  limits:
    cpu: 4

会被拒绝:

maximum cpu usage per Container is 2, but limit is 4

3. 限制 GPU / StorageClass 等资源

例如 GPU:

apiVersion: v1
kind: ResourceQuota
metadata:
  name: gpu-quota
  namespace: ai
spec:
  hard:
    requests.nvidia.com/gpu: "2"

限制某类存储:

spec:
  hard:
    gold.storageclass.storage.k8s.io/requests.storage: 100Gi

4. 企业常用最佳实践

建议按环境设置:

dev namespace(开发)

限制宽松:

requests.cpu: 4
limits.cpu: 8
requests.memory: 8Gi
limits.memory: 16Gi
pods: 100

test namespace(测试)

中等:

requests.cpu: 8
limits.cpu: 16
memory: 32Gi

prod namespace(生产)

严格:

  • 强制 request/limit
  • 禁止 BestEffort Pod
  • 配合 HPA/VPA
  • 限制对象数量

比如:

pods: 200
services: 20
configmaps: 100
secrets: 100
persistentvolumeclaims: 50

5. 一键模板(推荐)

给 namespace 同时加:

apiVersion: v1
kind: LimitRange
metadata:
  name: default-limit-range
  namespace: dev
spec:
  limits:
  - type: Container
    defaultRequest:
      cpu: 100m
      memory: 128Mi
    default:
      cpu: 500m
      memory: 512Mi
    max:
      cpu: "2"
      memory: 4Gi

---
apiVersion: v1
kind: ResourceQuota
metadata:
  name: default-resource-quota
  namespace: dev
spec:
  hard:
    requests.cpu: "4"
    requests.memory: 8Gi
    limits.cpu: "8"
    limits.memory: 16Gi
    pods: "50"
    persistentvolumeclaims: "20"

直接:

kubectl apply -f namespace-limit.yaml

这样就实现:

  • 单 Pod 不可无限吃资源
  • namespace 总资源有上限
  • 默认资源自动注入
  • 避免资源抢占(Noisy Neighbor)

如果你是多租户(比如 ArgoCD 多项目、多个业务 namespace),建议再配合:

  • NetworkPolicy(网络隔离)
  • RBAC(权限隔离)
  • PriorityClass(资源抢占优先级)
  • LimitRange + ResourceQuota(资源隔离)