阿里云容器服务Kubernetes版ACK对接使用完全指南
一、ACK集群类型解析与选型决策
在开始对接使用阿里云容器服务Kubernetes版(ACK)之前,首先需要理解ACK提供的不同集群类型及其适用场景。ACK目前主要提供三种集群形态:ACK托管集群、ACK专有集群和ACK Serverless集群。
1.1 ACK托管集群
ACK托管集群的控制面(包括kube-apiserver、kube-controller-manager、kube-scheduler和etcd等核心组件)完全由阿里云托管,用户只需负责Worker节点的创建与运维。托管集群又细分为Pro版和基础版:
- Pro版:适用于企业生产与测试环境,提供99.95%的区域级SLA保障。单集群默认支持最大5000个Worker节点并可申请提高配额。Pro版收取集群管理费用,但相比自行维护Master节点的专有集群,整体TCO通常更低。
- 基础版:仅供个人学习与测试,单账号最多创建2个集群,单集群仅支持10个Worker节点且不支持提高配额。基础版不收取集群管理费用。
每一个托管集群的管控面包含至少2个kube-apiserver实例和3个etcd实例,并部署在不同的可用区以提供可用区级别的高可用性。这种设计显著降低了用户的运维负担,让团队可以更专注于业务应用的开发和部署。
1.2 ACK专有集群
ACK专有集群的控制面需要用户自行创建并运维。根据官方公告,ACK专有集群已于2024年8月21日起停止新建(云盒场景除外),官方推荐在生产环境中使用ACK托管集群Pro版。
1.3 ACK Serverless集群
ACK Serverless集群完全基于弹性容器实例(ECI)运行,用户无需管理底层ECS服务器,只需提供打包好的镜像即可运行容器。该集群类型与阿里云容器服务无缝对接,仅为容器实际运行消耗的资源付费。ACK Serverless集群适用于对资源弹性要求极高、希望免于节点运维的场景。
1.4 选型建议
对于大多数企业的生产环境,ACK托管集群Pro版是最佳选择。它具有以下优势:提供了可赔付的SLA保障;具备etcd高频冷热备机制和异地容灾能力;支持从基础版或专有集群热迁移至Pro版。对于测试或个人学习场景,可选择ACK托管集群基础版。对于对资源弹性要求极高、不想管理节点的场景,ACK Serverless集群是理想选择。
需要先登录阿里云控制台,点击:阿里云控制台
二、ACK托管集群创建与初始化配置
选定集群类型后,接下来进入集群创建阶段。ACK托管集群支持通过多种方式创建,包括控制台、API、Terraform、SDK以及CLI等。
2.1 控制台创建流程
在阿里云控制台中进入"容器服务Kubernetes版",点击"创建集群",选择"ACK托管集群"。创建过程中需要配置以下关键参数:
- 集群名称:自定义命名,创建后仍可修改。
- 集群规格:选择Pro版或基础版,生产环境务必选择Pro版。
- 地域和可用区:地域一经创建不可修改。建议选择与用户和业务资源部署地域较近的地域以降低网络延迟,同时配置至少两个不同可用区以保证高可用。
- Kubernetes版本:仅支持创建最近三个次要版本,建议使用当前最新版本以获得更好的稳定性、性能和安全性更新。
- 自动升级:开启后可在维护窗口期内自动升级集群控制面和节点池,有效降低版本维护负担。
- 专有网络(VPC)和交换机:可选择自动创建或使用已有VPC。建议选择2个及以上不同可用区的交换机以保障高可用。
2.2 Terraform创建集群
对于基础设施即代码(IaC)实践,ACK支持通过Terraform创建托管集群。以下是一个基本的Terraform配置示例:
provider "alicloud" {
region = "cn-hangzhou"
}
resource "alicloud_cs_managed_kubernetes" "default" {
name = "my-ack-cluster"
cluster_spec = "ack.pro.small"
kubernetes_version = "1.28"
vswitch_ids = ["vsw-xxx1", "vsw-xxx2"]
worker_instance_types = ["ecs.g7.large"]
worker_number = 3
password = "YourPassword123!"
pod_cidr = "172.20.0.0/16"
service_cidr = "172.21.0.0/20"
}三、网络规划与CNI插件选型
ACK集成了Kubernetes网络与阿里云网络服务,提供稳定、高性能的容器网络。集群网络插件在创建时确定,创建后无法更改。
3.1 Terway网络插件
Terway是阿里云开源的基于专有网络VPC的容器网络接口CNI插件,支持基于Kubernetes标准的网络策略来定义容器间的访问策略。Terway将ECS实例的弹性网卡(ENI)分配给Pod,使Pod直接连接到VPC,无需VXLAN等隧道封装,从而提升网络效率。
Terway提供两种模式:
- 独占ENI模式:每个Pod获得专用的ENI,提供最佳网络性能。
- 共享ENI模式:Pod共享ENI,提高单节点的Pod密度。
共享ENI模式支持DataPath V2加速,启用后Terway使用不同的转发路径实现更快的通信。两种模式均支持固定IP地址、独立安全组和虚拟交换机配置。
单节点支持的Pod数量基于ECS规格支持的ENI数量计算。以通用型实例规格族g7的ecs.g7.4xlarge为例,该规格支持8个ENI,单个ENI支持30个私有IP,单节点Pod限额为(8-1)×30=210个。
3.2 Flannel网络插件
Flannel是开源CNI插件,使用VXLAN等网络虚拟化技术为Pod构建覆盖网络。它配置简单,但由于NAT开销,网络性能弱于Terway。Flannel支持最多1000个节点的集群,适用于网络性能要求不高的场景或快速搭建集群的需求。
3.3 网络规划建议
创建集群前需根据业务场景和集群规模规划VPC网段和Kubernetes网段(Pod地址段和Service地址段),定义整个集群的IP地址范围。如果对网络安全、IPAM管理(例如固定Pod IP、NetworkPolicy等)有强诉求,建议使用Terway;如果集群规模较小(例如小于500个节点),且对网络无特殊需求,可使用Flannel。
四、集群连接与kubectl配置
集群创建完成后,需配置kubectl工具进行连接操作。
4.1 获取KubeConfig
在ACK集群列表页点击目标集群的"连接信息",获取集群访问凭证即KubeConfig文件。KubeConfig包含访问集群所需的认证信息,ACK支持为不同阿里云账号、RAM用户或角色签发KubeConfig。
根据安全需求和使用场景选择KubeConfig类型:
- 临时KubeConfig:支持配置有效期(30分钟~3天),过期后自动失效,适用于日常运维、故障排查、CI/CD流水线等无需长期连接API Server的场景。
- 长期KubeConfig:默认有效期为3年,适用于无法频繁更新KubeConfig的自动化系统或长期监控服务。
根据访问方式选择:
- 内网访问:kubectl客户端机器必须与集群位于同一VPC,延迟更低、更安全。
- 公网访问:通过公网中的任意机器作为客户端连接集群,依赖EIP连接API Server。
4.2 配置kubectl
将复制的KubeConfig内容粘贴至客户端的$HOME/.kube/config文件中。RAM用户连接集群前,除容器服务的系统权限外,还需要被授予集群操作的RBAC权限。
# 验证集群连接
kubectl cluster-info
# 查看节点状态
kubectl get nodes
# 查看所有命名空间
kubectl get namespaces五、应用部署与服务暴露
5.1 核心工作负载部署
生产环境中,Deployment是最常用的工作负载资源对象,提供副本管理、自动恢复和滚动升级能力。以下是一个标准的Deployment YAML示例:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
namespace: default
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.25
ports:
- containerPort: 80
resources:
requests:
cpu: 500m
memory: 512Mi
limits:
cpu: 1000m
memory: 1Gi
livenessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 30
periodSeconds: 10
readinessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 5
periodSeconds: 5生产环境中所有服务必须设置资源限制(requests和limits),避免CPU抢占、OOM和节点雪崩。同时必须配置健康检查(LivenessProbe和ReadinessProbe)。
5.2 Service服务发现
Pod在Kubernetes中是临时性的,其网络资源在Pod销毁或替换时会发生变化。Service为Pod组提供稳定的访问入口,内置负载均衡能力。ACK支持ClusterIP、NodePort、LoadBalancer、Headless和ExternalName等多种Service类型。
apiVersion: v1
kind: Service
metadata:
name: nginx-service
namespace: default
spec:
selector:
app: nginx
ports:
- port: 80
targetPort: 80
protocol: TCP
type: ClusterIP5.3 ALB Ingress七层负载均衡
ALB Ingress基于阿里云应用型负载均衡ALB之上提供Ingress流量管理方式,兼容Nginx Ingress,具备处理复杂业务路由和证书自动发现的能力,支持HTTP、HTTPS和QUIC协议。
ALB Ingress涉及的核心概念:
- ALB Ingress Controller:通过API Server获取Ingress资源的变化,动态生成AlbConfig,创建ALB实例、监听、路由转发规则以及后端服务器组。
- AlbConfig CRD:对应一个ALB实例。
- Ingress Class:定义Ingress Controller的类别,允许在集群中同时使用多个Ingress Controller。
以下是一个ALB Ingress配置示例:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: nginx-ingress
namespace: default
annotations:
kubernetes.io/ingress.class: alb
alb.ingress.kubernetes.io/scheme: internet
alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80}]'
spec:
rules:
- host: demo.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: nginx-service
port:
number: 80六、存储管理:CSI组件与实践
6.1 CSI组件概述
阿里云csi-plugin组件遵循标准CSI规范,提供了云盘、NAS、OSS等类型阿里云云存储服务的挂载能力。自ACK 1.16版集群开始,部署集群时会默认安装最新版本的CSI组件。csi-plugin提供了数据卷的全生命周期管理,包括数据卷的创建、挂载、卸载、删除及扩容等服务。
CSI存储组件由两部分构成:
- csi-plugin:以DaemonSet形式在每个节点上运行,负责执行存储卷的挂载、卸载以及文件系统格式化等节点侧操作。
- csi-provisioner:作为中心控制器以Deployment形式运行,负责处理存储卷的动态创建、删除、扩容、快照等操作。
新建集群默认启用csi-provisioner托管版,组件Pod由ACK托管,在kube-system命名空间下不可见,ACK负责组件维护和资源调优。
6.2 云盘动态存储卷
通过StorageClass和PersistentVolumeClaim(PVC)可以动态创建云盘存储卷:
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: alicloud-disk-ssd
provisioner: diskplugin.csi.alibabacloud.com
parameters:
type: cloud_ssd
regionId: cn-hangzhou
zoneId: cn-hangzhou-g
reclaimPolicy: Delete
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: disk-pvc
namespace: default
spec:
accessModes:
- ReadWriteOnce
storageClassName: alicloud-disk-ssd
resources:
requests:
storage: 20Gi6.3 OSS存储卷(ossfs 2.0)
对于需要共享存储的场景,ACK支持通过ossfs将OSS Bucket挂载为Pod中的文件系统。ossfs 2.0版本提供了更好的性能和稳定性。以下是一个使用OSS存储卷的示例:
apiVersion: v1
kind: PersistentVolume
metadata:
name: oss-pv
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Retain
csi:
driver: ossplugin.csi.alibabacloud.com
volumeHandle: oss-pv
volumeAttributes:
bucket: my-bucket
url: oss-cn-hangzhou.aliyuncs.com
otherOpts: -o max_stat_cache_size=0 -o allow_other
nodePublishSecretRef:
name: oss-secret
namespace: default七、安全与权限管理
7.1 RAM授权与RBAC双层模型
ACK使用RAM进行基础设施层面的权限管理,使用Kubernetes RBAC进行集群内资源访问控制。
- RAM授权:通过RAM策略授予调用ACK及依赖云服务API的权限,涵盖集群创建、查看、升级、删除,节点池管理,权限管理,集群监控、日志和事件等操作。
- RBAC授权:基于Kubernetes RBAC,在集群内资源层面授予不同用户对不同Kubernetes资源的操作权限,包括工作负载、网络、存储、命名空间、ConfigMap、Secret等。
默认情况下,仅阿里云账号和集群创建者拥有集群的完整权限。其他RAM用户或角色在获得访问集群的RAM授权后,仍需具有RBAC权限,才能对集群内的Kubernetes资源进行操作。
7.2 RRSA凭证隔离方案
为保护集群内应用访问阿里云服务的安全,ACK支持RRSA(RAM Roles for Service Accounts)功能,实现ServiceAccount级别的RAM权限配置和Pod权限隔离。通过RRSA,可以为不同的ServiceAccount授予不同的RAM角色,实现最小权限原则。
7.3 免密组件配置
使用ACR作为镜像来源时,免密组件aliyun-acr-credential-helper可自动化完成拉取镜像时的认证流程。免密组件的工作原理如下:
- 免密组件从ACR实例获取临时账号和临时密码。
- 组件将临时账号和密码保存到Secret中。
- 组件将Secret关联到配置中指定的ServiceAccount。
- 使用这些ServiceAccount的工作负载默认使用Secret中保存的临时账号和密码拉取镜像。
免密组件支持同时管理多个命名空间的ServiceAccount,并根据配置定时更新临时账号和密码,以降低泄露风险。
# 安装免密组件(托管版)
# 在ACK控制台的组件管理页面安装aliyun-acr-credential-helper
# 配置免密组件(同账号拉取)
# 在kube-system命名空间创建acr-configuration配置
apiVersion: v1
kind: ConfigMap
metadata:
name: acr-configuration
namespace: kube-system
data:
acr-registry-info: |
[
{
"instanceId": "cri-xxxxx",
"regionId": "cn-hangzhou"
}
]八、可观测性体系建设
8.1 日志采集与SLS集成
ACK与阿里云日志服务SLS深度集成,通过Logtail组件采集容器日志。集群创建时可选择开启日志服务,系统会自动创建Logtail DaemonSet采集容器标准输出和文件日志。
集群控制面日志(包括API Server、Controller Manager、Scheduler等组件日志)可通过SLS进行查询和分析。审计日志记录Kubernetes操作审计追踪。
8.2 监控告警体系
ACK兼容阿里云可观测性产品,如云监控和托管Prometheus服务,提供监控插件帮助观察集群健康状况。alicloud-monitor-controller是ACK系统组件,将集群与托管Prometheus、SLS和云监控集成,同步可观测配置(包括告警规则)并管理其全生命周期。
监控覆盖以下维度:
- 基础资源监控:CPU、内存、网络等集群基础资源。
- 应用监控:通过ARMS和ack-onepilot进行拓扑分析、API监控、调用链追踪和性能瓶颈检测。
- 集群监控:通过eBPF版应用监控无侵入采集容器性能数据。
- 事件监控:使用Node Problem Detector和SLS事件中心实时监控和告警。
- 控制面组件监控:通过Prometheus和Grafana实时监控API Server、etcd等组件。
九、节点池管理与弹性伸缩
9.1 节点池概念
节点池是ACK中一组具有相同配置的ECS节点的集合,支持统一的节点规格、操作系统、标签和污点配置。通过节点池,可以实现对不同类型工作负载的隔离和资源管理。
9.2 弹性伸缩方案
ACK提供两种弹性伸缩方案:
- 节点自动伸缩:根据Pod调度需求自动扩缩节点资源。
- 节点即时弹性:相较于节点自动伸缩,具有更快的弹性速度、更高的交付效率和更低的使用门槛。
ACK GOATScaler是ACK为节点即时弹性场景提供的下一代节点伸缩组件,重点提升扩容成功率与弹性策略可定制能力。
9.3 智能托管节点池
ACK托管集群Pro版支持智能托管节点池。启用后可根据工作负载变化自动完成节点扩缩容,无需提前规划容量,实现更优的资源成本控制。弹性响应更快,通过事件驱动的机制触发扩缩行为,结合ContainerOS能力进行弹性加速,伸缩速度约为45±10秒。
十、生产环境最佳实践
10.1 资源限制与健康检查
所有工作负载必须设置资源请求和限制:
resources:
requests:
cpu: 500m
memory: 512Mi
limits:
cpu: 1000m
memory: 1Gi必须配置存活探针(LivenessProbe)和就绪探针(ReadinessProbe),确保Pod在异常时能够自动重启,在未就绪时不会接收流量。
10.2 滚动更新策略
Deployment支持滚动更新策略,通过配置maxSurge和maxUnavailable控制更新过程中的可用性和资源消耗:
spec:
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%10.3 集群自动升级
开启集群自动升级功能,在维护窗口期内自动升级集群控制面和节点池,有效降低版本维护负担。ACK会且仅会在定义的维护窗口期内执行自动化运维任务,包括集群自动升级、OS CVE漏洞自动修复等。
10.4 成本优化建议
- 使用ACK托管集群Pro版,相比自行维护Master节点,整体TCO更低。
- 利用节点即时弹性,根据工作负载自动调整节点数量,避免资源浪费。
- 合理配置存储类型,将不常用的数据转为低频或归档存储。
- 使用同地域内网访问云服务,避免外网流量费用。
常见问题解答
问题1:ACK托管集群和专有集群有什么区别?
ACK托管集群的控制面由阿里云托管,用户只需管理Worker节点;ACK专有集群需要用户自行创建和运维控制面。官方推荐生产环境使用ACK托管集群Pro版,专有集群已于2024年8月21日起停止新建。
问题2:Terway和Flannel网络插件如何选择?
如果对网络安全、IPAM管理(如固定Pod IP、NetworkPolicy)有强诉求,建议使用Terway;如果集群规模较小(小于500个节点)且对网络无特殊需求,可使用Flannel。网络插件在集群创建后无法更改。
问题3:如何安全地管理集群访问凭证?
建议使用临时KubeConfig(有效期30分钟至3天)进行日常运维,定期轮换凭证,遵循最小权限原则。RAM用户需同时授予RAM权限和RBAC权限才能操作集群资源。
问题4:ACK如何实现存储卷的动态创建?
ACK通过CSI组件(csi-plugin和csi-provisioner)实现存储卷的动态创建。用户只需定义StorageClass和PVC,系统会自动创建对应的云盘、NAS或OSS存储卷。
问题5:如何为ACK集群配置日志和监控?
集群创建时可选择开启日志服务,系统自动部署Logtail采集容器日志。监控方面,ACK集成托管Prometheus服务,通过alicloud-monitor-controller组件同步告警规则和监控配置。
问题6:什么是RRSA?为什么要使用它?
RRSA(RAM Roles for ServiceAccounts)允许为Kubernetes的ServiceAccount关联RAM角色,实现Pod级别的云服务访问权限隔离。相比传统的Worker RAM角色,RRSA遵循最小权限原则,提升了安全性。




