深色模式
阿里云 ACK 实战:托管集群、Terway 网络、存储与 RRSA 权限
摘要:本文面向在阿里云上建设生产级 Kubernetes 的 SRE / 平台工程师,覆盖 ACK 集群形态、控制面托管方式、Terway/Flannel 网络模型、云盘/NAS/OSS 存储、RAM 角色(RRSA)与节点 RAM 角色的差异、排障与成本权衡。覆盖版本:ACK 基于 Kubernetes v1.30.x-aliyun(示例中具体补丁号
[版本相关],以目标区域可创建版本为准)。
适用版本与前提
- 容器服务 ACK:托管版 Pro 版(生产推荐),Kubernetes 版本仅支持阿里云维护的近三个次要版本
[版本相关]。 - 工具:
aliyunCLI、Terraform/OpenTofu(可选)、kubectl、kubectl-circ。 - 前提:已完成账号级服务角色授权(ACK 默认角色),开通 VPC、SLB、NAT 网关、OSS 等强依赖云产品。
背景与问题
阿里云容器服务 Kubernetes 版(ACK)把控制面(API Server、etcd、调度器、控制器管理器)托管给阿里云,用户只需关心节点池(Node Pool)与工作负载。这带来两个核心工程问题:
- 节点与 Pod 如何获得云资源权限——早期只能给 ECS 节点绑定一个 RAM 角色(Worker RAM Role),导致该节点上所有 Pod 共享同一身份,违背最小权限。
- Pod 网络与 VPC 的关系——ACK 默认提供 Terway(VPC 直通)与 Flannel(VXLAN Overlay)两种数据面,二者在 IP 来源、性能、网络策略上差异巨大
[厂商特定]。
心智模型
把 ACK 理解为「阿里云帮你养着一套高可用的 K8s 控制面,你只管往里塞节点池和 Pod」。平台差异集中在三处:节点身份(RRSA vs 节点 RAM 角色)、网络数据面(Terway vs Flannel)、存储拓扑(云盘是可用区限定资源)。
集群形态:托管版 / 专有版 / Serverless
| 形态 | 控制面 | 适用 | 说明 |
|---|---|---|---|
| ACK 托管版 Pro 版 | 阿里云托管,SLA 赔付 | 生产首选 | 高可用、安全加固、可赔付 SLA |
| ACK 托管版 标准版 | 阿里云托管 | 测试/中小型 | 无赔付 SLA,成本低 |
| ACK 专有集群 | 用户自购 ECS 自建 | —— | 已于 2024-08-21 停止新建,仅存量维护 [版本相关] |
| ACK Serverless(ASK/ACS) | 全托管 + 虚拟节点 | 弹性/离线任务 | 无需管理节点,按 Pod 计费 |
| ACK 注册集群 | 纳管 IDC/他云 K8s | 混合云 | 统一管控面 |
注意
专有集群已停止新建,新建生产集群一律选 ACK 托管版 Pro 版(来源:阿里云 ACK 专有集群创建页,更新于 2026-04-10)。不要因历史文档而尝试创建专有集群 [未实测]。
架构与网络模型
Terway vs Flannel(VPC 网络模型)[厂商特定]
- Terway(推荐生产):将 VPC 的弹性网卡(ENI)或辅助 IP 直接分配给 Pod,Pod IP 就是 VPC 内可路由地址,网络无 Overlay 封装、延迟低,并原生支持 NetworkPolicy(基于 EBPF/策略路由)。Pod 与节点同处一个网络平面
[厂商特定]。 - Flannel:基于 VPC 的 VXLAN 隧道做 Overlay,Pod CIDR 独立于 VPC,跨节点流量需封装,性能略差,网络策略需额外组件
[厂商特定]。
选型建议
对延迟敏感、需要 Pod 直接被 VPC 内其他服务(如 RDS 白名单、SLB 后端)访问的场景,选 Terway;仅做简单测试或遗留集群迁移可保留 Flannel。Terway 的 ENI 多 IP 模式对节点规格(支持 ENI 数量)有要求 [版本相关]。
生产实践:以代码创建集群
控制台适合首次摸索,生产应以 Terraform/OpenTofu 固化。以下为 alicloud Provider 关键片段(与官方 OpenTofu 示例一致):
hcl
# 托管 Pro 版集群,开启 RRSA
resource "alicloud_cs_managed_kubernetes" "prod" {
name = "production-pro"
cluster_spec = "ack.pro.small" # Pro 版,SLA 赔付
version = "1.30.1-aliyun.1" # 具体补丁号随区域变化 [版本相关]
pod_cidr = "172.20.0.0/16"
service_cidr = "172.21.0.0/20"
new_nat_gateway = true
vswitch_ids = [alicloud_vswitch.private_a.id, aliyun_vswitch.private_b.id]
enable_rrsa = true # 开启 RRSA OIDC [厂商特定]
}
# 节点池
resource "alicloud_cs_kubernetes_node_pool" "workers" {
cluster_id = alicloud_cs_managed_kubernetes.prod.id
name = "worker-pool"
vswitch_ids = [alicloud_vswitch.private_a.id]
instance_types = ["ecs.c6.xlarge"]
system_disk_category = "cloud_essd"
system_disk_size = 100
desired_size = 3
# scaling_config { min_size=2 max_size=10 } # 弹性伸缩
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
获取 kubeconfig:
bash
aliyun cs DescribeClusterUserKubeconfig \
--ClusterId <cluster-id> --output json | jq -r '.config' > kubeconfig.yaml
export KUBECONFIG=./kubeconfig.yaml
kubectl get nodes1
2
3
4
2
3
4
生产危险
以上会创建按量计费的 ECS、SLB、NAT 等云资源,并可能产生集群管理费用。执行前确认账号余额、配额与区域,并在 Terraform 中启用 plan 评审与状态锁定;销毁用 destroy 而非手动删控制台资源,避免状态漂移。
持久化存储:云盘/NAS/OSS 与可用区陷阱
ACK 通过 CSI 插件提供存储:diskplugin.csi.alibabacloud.com(云盘 ESSD)、nasplugin.csi.alibabacloud.com(文件存储 NAS)、ossplugin.csi.alibabacloud.com(对象存储 OSS)。云盘是可用区(Zone)限定资源——zone A 的云盘只能挂到 zone A 的节点,StatefulSet 跨区重调度会陷入 Pending。
缓解手段:使用 WaitForFirstConsumer 的 StorageClass,让磁盘在调度器实际放置 Pod 后再于对应可用区创建:
yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: essd-wffc
provisioner: diskplugin.csi.alibabacloud.com
parameters:
type: cloud_essd # ESSD 云盘 [厂商特定]
volumeBindingMode: WaitForFirstConsumer
allowVolumeExpansion: true
reclaimPolicy: Retain1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
注意
OSS 通过 ossplugin 挂载是对象存储,重命名是拷贝、随机小文件写慢,不要当作 POSIX 磁盘使用(适合模型权重、只读数据集)。NAS 支持跨区共享,适合多 Pod 读写的文件类场景 [未实测,需验证]。
权限:RRSA vs 节点 RAM 角色
节点 RAM 角色(不推荐给多租户)
每个节点池绑定一个 RAM 角色,节点上所有 Pod 都继承该角色权限。早期做法,存在权限横向扩散风险。
RRSA(RAM Roles for Service Accounts)[厂商特定]
RRSA 是 ACK 对 "Workload Identity" 的实现,等价于 AWS 的 IRSA、腾讯云的 Pod 绑定 CAM 角色。原理:开启 RRSA 后集群获得专属 OIDC Issuer,kubelet 向 Pod 注入短期 ServiceAccount Token,SDK 用 AssumeRoleWithOIDC 向 STS 换取 RAM 角色临时凭证,信任策略精确绑定到「某命名空间某 ServiceAccount」。
安装 ack-pod-identity-webhook 后,只需标注命名空间与 ServiceAccount:
yaml
apiVersion: v1
kind: Namespace
metadata:
name: rrsa-demo
labels:
pod-identity.alibabacloud.com/injection: 'on' # 开启自动注入
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: demo-sa
namespace: rrsa-demo
annotations:
pod-identity.alibabacloud.com/role-name: demo-role-for-rrsa1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
RAM 角色信任策略(OIDC 主体)示例:
json
{
"Statement": [{
"Action": "sts:AssumeRole",
"Effect": "Allow",
"Principal": { "Federated": "acs:ram::<account-id>:oidc-provider/ack-rrsa-<cluster-id>" },
"Condition": { "StringEquals": {
"oidc:aud": "sts.aliyuncs.com",
"oidc:iss": "https://oidc.<region>.aliyuncs.com/ack-rrsa-<cluster-id>",
"oidc:sub": "system:serviceaccount:rrsa-demo:demo-sa"
}}
}],
"Version": "1"
}1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
Pod 内会注入三个环境变量:ALIBABA_CLOUD_ROLE_ARN、ALIBABA_CLOUD_OIDC_PROVIDER_ARN、ALIBABA_CLOUD_OIDC_TOKEN_FILE(Token 文件位于 /var/run/secrets/ack.alibabacloud.com/rrsa-tokens/token)。
最小权限
RAM 角色只挂载访问目标资源的精确策略(如单个 OSS Bucket 前缀的读写),绝不绑定 Aliyun*FullAccess。同时收敛节点 RAM 角色权限,避免 Pod 回退到节点角色 [厂商特定]。
验证与排障
bash
# 1. 节点与核心组件就绪
kubectl get nodes
kubectl -n kube-system get pods | grep -E 'terway|csi|rrsa|webhook'
# 2. RRSA 注入是否生效
kubectl -n rrsa-demo get pod demo -o yaml | grep -A3 ALIBABA_CLOUD_ROLE_ARN
# 3. Pod 内访问云资源鉴权
kubectl -n rrsa-demo exec demo -- env | grep ALIBABA_CLOUD1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
常见故障:
- Pod 一直
ContainerCreating:多半是 Terway/CSI DaemonSet 未 Ready 或节点 ENI 配额耗尽;先看kubectl describe pod事件与kubectl -n kube-system get ds。 - RRSA 访问被拒(AccessDenied):第一检查 Token 文件是否存在;第二检查 RAM 角色信任策略的
oidc:sub是否与system:serviceaccount:<ns>:<sa>完全匹配;第三确认 SDK 版本支持从 OIDC 环境变量读取凭证[版本相关]。 - 云盘 StatefulSet
Pending:检查 StorageClass 是否WaitForFirstConsumer,以及目标可用区是否有可用节点池。
安全与合规
- 控制面:Pro 版由阿里云维护并提供 SLA;开启 Secret 落盘加密(KMS)需
AliyunKMSReadOnlyAccess等前置授权[厂商特定]。 - 网络:Terway 下建议启用 NetworkPolicy 做默认拒绝;Pod 与 VPC 直通,注意 RDS/Redis 白名单已能按 Pod IP 收敛。
- 权限:优先 RRSA,收敛节点 RAM 角色;RAM 授权后还需在集群内做 Kubernetes RBAC 授权才能真正操作集群资源(RAM 管「云资源 OpenAPI」,RBAC 管「集群内资源」)
[厂商特定]。
性能、容量与成本
- 控制面费用:Pro 版按集群收取管理费(与节点数无关),标准版较低或免费
[版本相关],需以官网计费页为准。 - 节点:ACK 节点即 ECS,建议多可用区节点池实现高可用;ESSD 云盘 PL1/PL2 影响 IOPS 与单价。
- 网络:Terway 无 Overlay 开销,Flannel VXLAN 有约 50 字节封装开销,需同步调整 MTU(通常 1500→1450)
[未实测]。 - 成本权衡:托管版省去自运维 etcd 的人力与风险,但 Pro 版有管理费;Serverless(ACS)按 Pod 计费适合弹性波峰,长稳态负载仍用节点池更划算。
替代方案与权衡
- 自建 K8s on ECS:完全掌控但需自运维 etcd/控制面,成本高,除非有强合规隔离需求。
- ACK 注册集群:已有 IDC K8s 想统一管控时选用。
- 跨云:RRSA 仅解决阿里云内身份,跨云多集群建议引入外部身份联邦(如 OIDC 对接企业 IdP)。
FAQ
Q:RRSA 和节点 RAM 角色能混用吗? A:可以共存,但应尽量避免——节点角色权限会被该节点所有 Pod 共享。最佳实践是把节点角色收敛到仅 kubelet/CNI 所需,业务权限一律走 RRSA。
Q:Terway 能否无损切到 Flannel? A:不能在线无损切换,需新建集群或维护窗口重建节点网络 [未实测]。
参考资料
- 阿里云 ACK 快速创建托管集群,访问日期:2026-10-08。
- 阿里云 ACK RAM 授权(自定义策略),访问日期:2026-10-08。
- 通过 RRSA 配置 ServiceAccount 的 RAM 权限实现 Pod 权限隔离,访问日期:2026-10-08。
- ACK 专有集群创建(已停止新建说明),访问日期:2026-10-08。
- Create Alibaba Cloud ACK Clusters with OpenTofu(Terraform 参考),访问日期:2026-10-08。