阿里云容器服务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 网络插件选型:Terway vs Flannel
ACK提供两种CNI插件——Terway和Flannel。创建集群时需选定网络插件,且创建后无法更改。
Terway是阿里云自研的CNI插件,它将ECS实例的弹性网卡(ENI)分配给集群中的Pod,使Pod直接连接到专有网络VPC,无需经过VXLAN等隧道封装,从而提升网络效率。Terway适用于对网络性能和安全隔离要求较高的大规模集群。创建ACK集群时,Terway支持两种模式:
- 独占ENI模式:每个Pod拥有独立的ENI,网络性能最优。
- 共享ENI模式:多个Pod共享ENI,提升单节点的Pod密度。共享ENI模式支持DataPath V2网络加速。
Terway还支持为Pod配置固定IP、独立安全组和交换机,独占ENI模式额外支持Kubernetes网络策略。
Flannel是开源CNI插件,使用VXLAN等网络虚拟化技术为Pod构建覆盖网络。Flannel配置简单,但存在NAT开销导致网络性能较弱,且访问控制能力不如Terway。Flannel支持最多1000个节点的集群,适用于对网络性能要求不高的场景或快速搭建测试环境。
2.3 使用Terraform创建集群
对于基础设施即代码(IaC)实践,ACK支持通过Terraform进行集群的声明式创建和管理。以下是一个使用Terraform创建ACK托管集群的配置示例:
resource "alicloud_cs_managed_kubernetes" "default" {
name = "my-ack-cluster"
cluster_spec = "ack.pro.small"
kubernetes_version = "1.28"
vswitch_ids = ["vsw-abc123", "vsw-def456"]
new_nat_gateway = true
service_cidr = "172.16.0.0/20"
pod_cidr = "10.0.0.0/18"
worker_nodes {
instance_type = "ecs.g6.large"
count = 3
system_disk_category = "cloud_efficiency"
system_disk_size = 40
data_disks {
category = "cloud_efficiency"
size = 100
}
}
}2.4 配置kubectl访问集群
集群创建完成后,需配置kubectl工具访问集群。在ACK集群列表页,点击目标集群的"连接信息",获取集群访问凭证(kubeconfig文件)。将kubeconfig保存到本地 `~/.kube/config` 路径后,即可通过kubectl命令操作集群:
kubectl get nodes
kubectl get pods --all-namespaces三、节点池管理与弹性伸缩
节点池是对集群中节点的逻辑分组,用于统一管理具有相同配置(如ECS规格、操作系统、容器运行时)的节点。通过节点池,可实现节点的批量创建、扩容、缩容和升级。
3.1 节点池的核心应用场景
- 按业务类型分组:如将运行Web应用的节点归为"Web节点池",运行数据库的节点归为"数据节点池"。
- 按资源规格分组:如高性能节点池(用于计算密集型业务)、通用节点池(用于普通业务)。
- 版本管理:统一升级节点的Kubernetes版本或操作系统版本。
3.2 启用节点弹性伸缩
ACK节点池的弹性伸缩底层依赖ESS(弹性伸缩服务)。为节点池开启弹性伸缩的步骤如下:
- 在节点池页面,点击"节点伸缩"后方的"去配置"。
- 首次使用节点自动伸缩功能时,需按照页面提示开通ESS服务。
- 在节点伸缩配置页面,选择节点伸缩方案为"自动伸缩",配置伸缩的配置项,然后点击确定。
启用节点自动伸缩功能后,ACK会根据工作负载的资源需求自动调整节点数量。对于需要秒级弹性响应的场景,ACK提供了ack-autoscaling-placeholder组件,通过少量资源冗余实现容器秒级伸缩。
四、应用部署:工作负载编排实践
ACK完全兼容原生Kubernetes API,支持使用标准的YAML文件定义和部署工作负载。
4.1 核心工作负载类型
- Deployment(无状态工作负载):适用于无状态应用(如Web服务、API服务),Pod副本完全一致,可随意替换,支持滚动更新和回滚。
- StatefulSet(有状态工作负载):适用于有状态应用(如数据库、分布式缓存),每个Pod有唯一标识,支持稳定的存储挂载和有序部署。
- DaemonSet(守护进程工作负载):适用于需要在集群所有节点上运行的应用(如日志采集器、监控代理),确保每个节点仅运行一个Pod副本。
- Job/CronJob(任务型工作负载):适用于一次性任务或定时任务。
4.2 Deployment部署示例
以下是一个部署Nginx应用的Deployment YAML示例:
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-nginx
namespace: my-nginx-namespace
labels:
app: nginx
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.1
ports:
- containerPort: 80
resources:
requests:
cpu: "250m"
memory: "256Mi"
limits:
cpu: "500m"
memory: "512Mi"部署命令:
kubectl apply -f my-nginx.yaml为每个容器的requests和limits设置合理的CPU和内存值是保障集群稳定性和公平调度的关键。requests决定了调度时的资源预留,limits则限制了容器可使用的最大资源量。
4.3 配置管理与敏感信息
将应用配置从镜像中解耦是云原生实践的重要原则:
- ConfigMap:存储通用配置(如数据库连接串、环境变量)。
- Secret:以加密形式存储敏感信息(如密码、Token)。
ConfigMap示例:
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
database_url: "mysql://user:password@host:3306/db"
log_level: "info"Secret示例(注意:Secret的值需要base64编码):
apiVersion: v1
kind: Secret
metadata:
name: app-secret
type: Opaque
data:
db_password: cGFzc3dvcmQxMjM=五、服务发现与流量管理
5.1 Service:为Pod提供稳定访问入口
Kubernetes中的Pod是临时性的,其IP地址会随着Pod的重建而变化。Service为一组具有相同逻辑功能的Pod提供稳定的虚拟IP地址和端口。ACK支持ClusterIP、NodePort、LoadBalancer、Headless和ExternalName等多种Service类型。
Service示例:
apiVersion: v1
kind: Service
metadata:
name: my-nginx-svc
namespace: my-nginx-namespace
spec:
ports:
- port: 80
protocol: TCP
targetPort: 80
selector:
app: nginx
type: ClusterIPService通过Label Selector匹配后端Pod,当后端Pod发生变化时,Service会自动更新转发规则。
5.2 ALB Ingress:七层负载均衡
与Service提供的四层负载均衡不同,Ingress管理七层(HTTP/HTTPS)的外部访问。ALB Ingress基于阿里云应用型负载均衡ALB之上提供更强的Ingress流量管理能力,兼容Nginx Ingress,支持HTTP、HTTPS和QUIC协议。
ALB Ingress涉及的核心概念:
- ALB Ingress Controller:负责管理Ingress资源的组件,通过API Server获取Ingress资源变化,动态创建ALB实例、监听、路由转发规则和后端服务器组。
- AlbConfig CRD:每个AlbConfig对应一个ALB实例。
- Ingress Class:定义Ingress Controller的类别,允许集群中同时使用多个Ingress Controller。
ALB Ingress配置示例:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: demo-ingress
namespace: my-nginx-namespace
annotations:
kubernetes.io/ingress.class: "alb"
spec:
rules:
- host: demo.domain.ingress.top
http:
paths:
- path: /coffee
pathType: Prefix
backend:
service:
name: coffee-service
port:
number: 80
- path: /tea
pathType: Prefix
backend:
service:
name: tea-service
port:
number: 80使用ALB Ingress时需注意:如果使用Flannel网络插件,后端Service仅支持NodePort和LoadBalancer类型。
六、存储管理:基于CSI的持久化存储
Kubernetes应用通常需要持久化存储来保存数据。ACK通过标准的容器存储接口CSI,集成了多种阿里云存储服务(如云盘、OSS、NAS、CPFS等),并兼容Kubernetes原生存储机制。
6.1 存储基础概念
- PV(PersistentVolume):集群中的存储资源抽象,由管理员预先创建或通过StorageClass动态生成。
- PVC(PersistentVolumeClaim):用户对存储资源的申请,系统会将PVC与符合条件的PV自动绑定。
- StorageClass:定义存储的"模板",允许PVC按需动态创建PV。
6.2 静态存储卷 vs 动态存储卷
- 静态存储卷:需预先创建PV来代表已有的存储资源(如已有的NAS文件系统或云盘)。应用通过创建PVC来"匹配"并申请使用此PV。常用于纳管存量存储资源,但其绑定的PVC默认不支持在线扩容。
- 动态存储卷:无需预先创建PV。应用创建PVC时,系统会根据PVC指定的StorageClass,按需自动创建一个全新的存储卷及与之对应的PV。此模式更灵活,且支持存储卷扩容。
6.3 使用NAS静态存储卷
NAS存储卷提供数据持久化(Pod重建后数据不丢失)和数据共享(多Pod同时读写)能力。在ACK集群中挂载NAS静态存储卷的主要流程如下:
- 创建PV:在集群中"注册"已有的NAS文件系统,声明其挂载地址、容量、访问模式等。
- 创建PVC:应用通过PVC来"申请"使用已注册的存储资源。
- 在应用中挂载:将已绑定的PVC挂载到应用Pod中。
PV配置示例(NAS静态存储卷):
apiVersion: v1
kind: PersistentVolume
metadata:
name: nas-pv
spec:
capacity:
storage: 100Gi
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Retain
csi:
driver: nasplugin.csi.alibabacloud.com
volumeHandle: nas-pv
volumeAttributes:
server: "xxxxxxxx.nas.aliyuncs.com"
path: "/k8s/data"
vers: "3"
options: "noresvport,nolock"使用NAS时需注意:NAS文件系统需与集群VPC保持一致,不支持跨VPC挂载。存储卷使用期间,请勿在NAS控制台删除其对应的挂载点,以免导致节点I/O异常。
6.4 云盘存储卷
云盘(云服务器ECS的块存储)适用于需要高IOPS和低延迟的数据库等有状态应用。ACK支持使用CSI驱动以PV、PVC方式挂载云盘静态存储卷和动态存储卷。云盘存储卷的访问模式为RWO(ReadWriteOnce),即单个节点可读写。
七、可观测性:日志与监控
7.1 日志采集:SLS集成
ACK与阿里云日志服务SLS深度集成,可自动采集容器日志而无需修改应用代码。日志采集通过在集群中部署alibaba-log-controller组件(以DaemonSet形式运行在每个节点上),将节点上所有容器的日志转发到SLS进行查询和分析。
通过SLS CRD配置日志采集的YAML示例:
apiVersion: log.alibabacloud.com/v1alpha1
kind: AliyunLogConfig
metadata:
name: simple-stdout-example
spec:
project: k8s-my-project
logstore: k8s-stdout
logstoreMode: standard
shardCount: 2
lifeCycle: 90
logtailConfig:
inputType: plugin
configName: simple-stdout-example
inputDetail:
plugin:
- type: "stdout"重要提示:通过CRD方式创建的日志配置,在SLS控制台上对其修改不会同步到CRD中。后续如需更新配置,应直接修改CRD资源。
7.2 监控告警:托管Prometheus
ACK集成托管Prometheus监控服务,提供集群、节点、Pod和应用的多层次监控指标。通过配置告警规则,可实现对集群异常状态的实时感知。对于ACK Edge集群,同样可以接入阿里云Prometheus监控,使数据中心和边缘节点的GPU资源拥有与云上一致的可观测能力。
八、安全体系:RAM与RBAC权限管理
8.1 RAM授权
ACK的权限体系分为两个层面:RAM权限(控制台级别)和RBAC权限(集群内级别)。RAM用户或RAM角色必须被授予相应的RAM权限策略,才能操作ACK资源。阿里云账号默认拥有所有权限,无需额外授权。
ACK提供默认的系统权限策略,用于指定全局资源的读写访问控制。推荐遵循最小权限原则,仅为用户授予其工作所需的最小权限集合。
8.2 RBAC权限管理
RBAC(基于角色的访问控制)是Kubernetes原生的集群内权限管理机制。通过ack-ram-authenticator组件,ACK托管集群基于阿里云RAM,通过Webhook机制为API Server的访问请求提供更安全的身份验证。
ack-ram-authenticator的核心能力:
- 基于Kubernetes原生Webhook Token认证方式,实现通过RAM完成集群API Server的请求认证。
- 通过CRD形式提供RAM身份和RBAC权限的映射关系,灵活配置RBAC鉴权。
- 在SSO角色对接场景下,API Server审计日志中包含企业IDP中的身份信息,支持对扮演同一角色的不同用户的行为审计。
安装ack-ram-authenticator组件:
- 登录容器服务管理控制台,在左侧导航栏选择集群列表。
- 在集群列表页面,单击目标集群名称,然后在左侧导航栏点击组件管理。
- 在组件管理页面,单击安全页签,找到ack-ram-authenticator,点击安装。
使用ack-ram-authenticator的优势:
- 适配企业通过云SSO场景,提供灵活可控的数据面RBAC授权。
- 当企业员工离职被删除RAM用户或RAM角色后,其在集群中的RBAC权限将自动失效。
8.3 安全加固最佳实践
ACK基于Alibaba Cloud Linux提供了等保2.0三级版,可为节点池启用等保加固并配置基线检查策略,使其满足操作系统的等级保护要求。此外,建议开启工作负载身份(RAM角色)以安全管理云资源访问权限。
九、生产级运维实践
9.1 集群自动升级
启用ACK托管集群的自动升级功能后,集群可保持周期性的自动升级,降低版本运维压力。配置自动升级策略后,系统会提前生成集群升级计划,在维护窗口期内触发前置检查并升级集群的控制面。集群维护窗口是一个为ACK集群预先设定的特定时间段,在此期间ACK将执行集群自动化运维操作。
升级节点池时需注意:升级集群至1.18版本后,ACK会默认配置节点资源预留策略。如果集群未配置资源预留且节点水位较高,升级后存在Pod驱逐后无法被快速调度的风险,推荐CPU使用率不超过50%,内存使用率不超过70%。
9.2 CI/CD流水线集成
ACK支持与多种CI/CD工具集成,实现从代码提交到应用部署的全流程自动化。典型的CI/CD方案包括:
- 云效 + ACR + ACK:通过云效流水线实现镜像构建和部署的自动化。
- Jenkins + Harbor + ACK:通过Jenkins将代码打包成镜像并推送到Harbor仓库,然后触发ACK拉取镜像并部署应用。
- GitHub Actions + ACK:使用GitHub Actions实现Java Web应用的自动化部署。
流水线核心步骤通常包括:代码拉取 → 镜像构建 → 镜像推送(至ACR)→ 部署至ACK集群。
9.3 成本优化
ACK集群的成本管理围绕FinOps理念展开:
- 使用ACK成本洞察:更准确地计算业务成本分摊,在享受云原生灵活性的同时有效管理和控制成本。
- 合理配置资源请求和限制:为每个容器设置合理的requests和limits,避免资源浪费。
- 利用弹性伸缩:根据业务负载动态调整节点数量,避免闲时资源空转。
- 选择合适的节点规格:根据业务负载选择合适规格的ECS实例,避免规格过高造成浪费。
十、总结
阿里云容器服务Kubernetes版(ACK)为企业提供了从集群管理、应用部署到可观测性、安全管控的一站式容器化解决方案。通过合理选型ACK集群类型(托管Pro版为生产环境首选)、科学规划网络(Terway为推荐CNI插件)、规范应用编排(Deployment/StatefulSet + Service/Ingress)、完善存储方案(CSI + 云盘/NAS)、构建可观测体系(SLS + Prometheus)以及落实安全管控(RAM + RBAC),用户可以快速构建高可用、高弹性、安全可靠的生产级Kubernetes平台。结合CI/CD流水线、自动升级和成本优化等运维实践,ACK能够帮助企业聚焦业务创新,充分释放云原生技术红利。
常见问题解答
问1:ACK托管集群Pro版和基础版的主要区别是什么?
答:Pro版提供99.95%的区域级SLA保障,单集群默认支持最大5000个Worker节点并可申请提高配额,适用于企业生产环境,收取集群管理费用。基础版仅供个人学习与测试,单账号最多创建2个集群,单集群仅支持10个Worker节点且不支持提高配额,不收取集群管理费用。
问2:ACK集群创建后能否更换网络插件?
答:不能。集群创建时选定的CNI插件(Terway或Flannel)在创建后无法更改。因此,创建集群前需根据业务场景慎重选择网络插件。
问3:如何为ACK集群配置外部访问?
答:可以通过两种方式实现外部访问:一是创建LoadBalancer类型的Service,系统会自动创建SLB实例暴露服务;二是创建ALB Ingress,通过应用型负载均衡ALB实现七层(HTTP/HTTPS)流量的路由和负载均衡。
问4:ACK中静态存储卷和动态存储卷有什么区别?
答:静态存储卷需要管理员预先创建PV来代表已有的存储资源,应用通过PVC申请使用,适合纳管存量存储,但PVC默认不支持在线扩容。动态存储卷无需预先创建PV,应用创建PVC时系统根据StorageClass按需自动创建存储卷和PV,更灵活且支持存储卷扩容。
问5:如何实现ACK集群节点的弹性伸缩?
答:ACK节点池的弹性伸缩底层依赖ESS服务。在节点池页面开启自动伸缩功能并配置伸缩策略后,ACK会根据工作负载的资源需求自动调整节点数量。对于需要秒级弹性响应的场景,可使用ack-autoscaling-placeholder组件实现容器秒级伸缩。
问6:ACK如何与CI/CD工具集成?
答:ACK支持与多种CI/CD工具集成,常见方案包括:云效+ACR+ACK、Jenkins+Harbor+ACK、GitHub Actions+ACK等。流水线核心步骤为:代码拉取→镜像构建→镜像推送(至ACR)→部署至ACK集群。



