阿里云容器服务ACK从零到一:K8s集群配置与生产级应用部署完全指南
一、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与Flannel
ACK提供两种CNI网络插件——Terway和Flannel。网络插件在集群创建后不可更改,因此选型至关重要。
Terway
Terway是阿里云自研的CNI插件,基于阿里云的弹性网卡(ENI)构建网络,可以充分利用云上资源。它将ECS实例的弹性网卡分配给Pod,使Pod直接连接到VPC,无需VXLAN等隧道封装,从而提升网络效率。Terway适合对网络性能和大规模集群有较高要求的场景。Terway支持两种模式:
- 独占ENI模式:每个Pod获得一个专属ENI,提供最优网络性能。
- 共享ENI模式:多个Pod共享ENI,提高单节点的Pod密度。该模式支持DataPath V2加速,当启用时Terway使用不同的转发路径实现更快的通信。
Terway支持基于Kubernetes标准的网络策略来定义容器间的访问策略。使用Terway时,单节点支持的Pod数量基于ECS规格支持的ENI数量计算。以通用型实例规格族g7的ecs.g7.4xlarge为例,该规格支持8个ENI,单个ENI支持30个私有IP,单节点Pod限额为(8-1)×30=210个Pod。
Flannel
Flannel是开源CNI插件,使用VXLAN等网络虚拟化技术构建Pod的Overlay网络。它配置简单,但由于NAT开销,网络性能弱于Terway,访问控制能力也较弱。Flannel支持最多1000个节点的集群,适用于对网络性能要求不高或需要快速搭建集群的场景。
2.3 公网访问配置
集群创建时需配置公网访问选项——集群节点是否需要访问公网(拉取公共镜像时需开通公网)。如果集群需要从公共镜像仓库拉取镜像,或需要访问外部API服务,则应开通公网访问。
三、节点池管理与弹性扩缩容
节点池是集群中一个或一组节点的逻辑集合,具有相同属性(例如实例规格、操作系统、标签和污点等)。一个集群中可以创建多个不同配置和类型的节点池。通过节点池,可实现节点的批量创建、扩容、缩容和升级,简化集群运维。
3.1 节点池的核心应用场景
- 按业务类型分组:如将运行Web应用的节点归为"Web节点池",运行数据库的节点归为"数据节点池"。
- 按资源规格分组:如高性能节点池(用于计算密集型业务)、通用节点池(用于普通业务)。
- 版本管理:统一升级节点的Kubernetes版本或操作系统版本,避免节点配置不一致。
3.2 创建节点池
登录容器服务管理控制台,在左侧导航栏选择集群列表。在集群列表页面,单击目标集群名称,在左侧导航栏选择节点池。在节点池页面右上角,单击创建节点池,配置相关参数,然后单击确认配置。节点池创建完成以后,支持在编辑节点池页面修改配置项。
节点池的扩缩容模式支持手动扩容和自动扩容两种方式。手动扩容:ACK会根据配置的期望节点数调整节点池中的节点数。自动扩容:根据业务需求和策略自动调整计算资源,节省集群成本。
四、工作负载部署
工作负载是Kubernetes中对运行容器化应用的抽象,用于定义应用的运行方式和管理策略。
4.1 无状态工作负载(Deployment)
Deployment适用于无状态应用(如Web服务、API服务),Pod副本完全一致,可随意替换,支持滚动更新和回滚。以下是一个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: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6
ports:
- containerPort: 80
resources:
requests:
cpu: 500m
memory: 512Mi
limits:
cpu: 1000m
memory: 1Gi4.2 有状态工作负载(StatefulSet)
StatefulSet适用于有状态应用(如数据库、分布式缓存),每个Pod有唯一标识(名称、网络标识),支持稳定的存储挂载和有序部署与更新。
4.3 守护进程工作负载(DaemonSet)
DaemonSet适用于需要在集群所有节点(或指定节点)上运行的应用(如日志采集器、监控代理),确保每个节点仅运行一个Pod副本。
4.4 任务型工作负载(Job/CronJob)
Job适用于一次性任务,CronJob适用于定时任务,任务完成后Pod自动终止。
4.5 使用kubectl部署应用
将上述YAML保存为my-nginx.yaml文件后,通过以下命令部署:
kubectl apply -f my-nginx.yaml查看Deployment状态:
kubectl get deployment my-nginx -n my-nginx-namespace五、服务暴露与负载均衡
5.1 Service概念
在Kubernetes中,Pod是临时性的,其网络资源在Pod被销毁或替换时会发生变化。Service为Pod组提供稳定的访问入口,内置负载均衡能力。ACK支持ClusterIP、NodePort、LoadBalancer、Headless和ExternalName等多种Service类型。
5.2 创建Service
以下是一个ClusterIP类型的Service示例:
apiVersion: v1
kind: Service
metadata:
labels:
app: nginx
name: my-nginx-svc
namespace: my-nginx-namespace
spec:
ports:
- port: 80
protocol: TCP
targetPort: 80
selector:
app: nginx
type: ClusterIP部署Service:
kubectl apply -f my-nginx.yaml5.3 ALB Ingress七层负载均衡
与Service提供的四层负载均衡不同,Ingress管理七层的外部访问。ALB Ingress基于阿里云应用型负载均衡ALB之上提供更强大的Ingress流量管理方式,兼容Nginx Ingress,具备处理复杂业务路由和认证自动探索的能力,支持HTTP、HTTPS和QUIC协议。
ALB Ingress涉及以下核心概念:
- ALB Ingress Controller:负责管理Ingress资源的组件,通过API Server获取Ingress资源的变化,动态生成AlbConfig,然后创建ALB实例、监听、路由转发规则以及后端服务器组。
- AlbConfig CRD:自定义资源定义,一个AlbConfig对应一个ALB实例。
- Ingress Class:定义Ingress Controller的类别,允许在集群中同时使用多个Ingress Controller。
- Ingress:定义外部流量路由规则和访问规则。
配置ALB Ingress实现相同域名不同URL路径的流量转发:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: demo-ingress
namespace: my-nginx-namespace
spec:
ingressClassName: alb
rules:
- host: demo.example.com
http:
paths:
- path: /coffee
pathType: Prefix
backend:
service:
name: coffee-svc
port:
number: 80
- path: /tea
pathType: Prefix
backend:
service:
name: tea-svc
port:
number: 80六、存储管理
6.1 云盘动态存储卷
云盘是阿里云为云服务器ECS提供的数据块级别的块存储产品,具有低时延、高性能、持久性、高可靠等特点。云盘适用于对磁盘I/O要求高的应用,且没有共享数据的需求,如MySQL、Redis等数据存储服务。
ACK支持使用CSI插件创建云盘动态存储卷。通过在PVC中关联StorageClass,系统会自动根据配置创建并绑定PV。这种方式无需预先手动创建和配置存储资源。
创建StorageClass的YAML示例:
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: alicloud-disk-essd
provisioner: diskplugin.csi.alibabacloud.com
parameters:
type: cloud_essd
reclaimPolicy: Delete
volumeBindingMode: Immediate支持的云盘类型包括:cloud_essd(ESSD云盘)、cloud_ssd(SSD云盘)、cloud_efficiency(高效云盘)等。可以组合多个类型,如type: cloud_ssd,cloud_essd,系统将按照配置顺序依次尝试创建。
6.2 OSS存储卷
对于需要持久化存储或在多Pod间共享数据的应用,可通过动态PV将OSS Bucket挂载为ossfs 2.0存储卷。该方式通过StorageClass作为模板自动创建并绑定PV,让应用能像访问本地文件一样,通过标准的POSIX接口读写OSS数据。
相较于ossfs 1.0,ossfs 2.0在顺序读写性能上表现优异,可以更好地利用OSS的高带宽优势。使用ossfs 2.0的集群要求为1.26及以上,CSI组件版本为v1.33.1及以上。
主要流程如下:
- 确定鉴权方式:支持AccessKey和RRSA两种方式。在1.26及以上版本的集群中,建议使用RRSA鉴权方式,避免因AccessKey轮转导致的ossfs重挂载和业务重启。
- 创建StorageClass:定义存储模板,包含OSS Bucket信息、挂载参数和鉴权配置。
- 创建PVC:申请使用OSS存储资源,PVC会根据指定的StorageClass自动触发PV的创建和绑定。
- 在应用中挂载:将PVC作为存储卷挂载到容器的指定目录。
七、安全体系:RAM与RBAC双重授权
操作ACK集群需遵循RAM和Kubernetes RBAC的双重授权。默认情况下,仅阿里云账号和集群创建者拥有集群的完整权限。其他RAM用户或角色在获得访问集群的RAM授权后,仍需具有RBAC权限,才能对集群内的Kubernetes资源进行操作。
7.1 授权体系架构
ACK的授权体系包括两个层级:
- RAM:决定了谁能"进入"集群的大门。负责在云资源层面进行授权,控制用户对ACK集群及其依赖云产品的OpenAPI操作权限。
- RBAC:决定了用户"进入"大门后能做什么。负责在集群内部进行精细化授权,定义用户能对哪些Kubernetes资源执行何种操作。
7.2 Kubernetes RBAC机制
- ClusterRole:定义一个在整个集群范围生效的权限集合,通过ClusterRoleBinding绑定至授权主体。
- Role:定义一个仅在单个命名空间内有效的权限集合,通过RoleBinding绑定至授权主体。
7.3 ack-ram-authenticator Webhook认证
ack-ram-authenticator组件是面向ACK托管集群的认证插件,基于Kubernetes原生Webhook Token认证方式,实现通过RAM完成集群API Server的请求认证。该组件通过CRD形式提供RAM身份和RBAC权限的映射关系。
自Kubernetes 1.33版本起,新创建的ACK托管集群将默认安装最新版本的ack-ram-authenticator组件。使用该认证方式具有以下优势:
- 适配企业通过云SSO场景,提供灵活可控的数据面RBAC授权。
- 在角色SSO对接场景下,API Server审计日志中包含企业IDP中的身份信息。
- 当企业员工离职时被删除所持有的RAM用户或RAM角色后,其在集群中的RBAC权限将自动失效。
八、弹性伸缩
ACK的弹性伸缩提供两种维度的方案:
- 工作负载伸缩:调度层弹性方案,作用于Pod,通过增减Pod副本数量或调整Pod资源配置来适应负载变化。
- 节点伸缩:资源层弹性方案,通过增减节点数量来适应集群整体资源需求。
8.1 HPA(Horizontal Pod Autoscaler)
HPA根据CPU利用率、内存利用率或自定义指标自动调整Deployment或StatefulSet的副本数量。配置HPA需要先安装metrics-server组件:
登录容器服务管理控制台,在集群列表页面单击目标集群名称,在左侧导航栏单击组件管理。单击日志与监控页签,找到metrics-server并安装。
HPA配置示例:
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: nginx-hpa
namespace: my-nginx-namespace
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: my-nginx
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 508.2 AHPA弹性预测
针对传统弹性方式存在的问题,ACK支持AHPA弹性预测功能。AHPA根据历史数据自动规划未来24小时每一分钟的应用实例数,相当于进行1440个点的CronHPA定时配置。
九、可观测性:日志、监控与告警
9.1 日志采集
ACK集群与阿里云日志服务SLS深入集成,通过部署日志采集组件,将各类日志数据安全传输至SLS进行存储和分析。创建采集配置支持通过控制台、CRD配置或环境变量配置采集日志。
9.2 监控告警
ACK提供托管Prometheus监控服务,可配置集群、节点、Pod等多维度的监控指标和告警规则。通过ARMS APM应用监控服务,可以实现基于应用接口QPS的HPA弹性策略。
十、灰度发布与蓝绿发布
灰度发布和蓝绿发布是为新版本创建一个与老版本完全一致的生产环境,在不影响老版本的前提下,按照一定的规则把部分流量切换到新版本。当新版本试运行一段时间没有问题后,将用户的全量流量从老版本迁移至新版本。
ACK支持通过Nginx Ingress Controller实现应用服务的灰度发布。具体方式包括:
- canary-*注解方式:使用canary-* Annotation配置蓝绿发布与灰度发布,这是社区官方实现的灰度发布方式。
- 控制台灰度发布功能:ACK控制台提供了灰度发布的图形化操作界面。
十一、生产环境最佳实践与避坑指南
11.1 必须设置资源限制
所有服务必须设置资源请求(requests)和限制(limits)。不设置资源限制会导致CPU抢占、OOM(内存溢出)和节点雪崩。推荐配置示例:
resources:
requests:
cpu: 500m
memory: 512Mi
limits:
cpu: 1000m
memory: 1Gi11.2 必须配置健康检查
LivenessProbe:判断程序是否存活,不存活则重启Pod。ReadinessProbe:判断程序是否准备好接收流量,未就绪则从Service的负载均衡中摘除。
11.3 避免数据库容器化
生产环境不建议将数据库等有状态服务容器化部署在Kubernetes中,建议使用阿里云RDS等托管的数据库服务。
11.4 合理规划网络CIDR
集群创建前需对VPC、交换机、Pod CIDR和Service CIDR进行合理规划,避免IP地址冲突。集群创建后网络配置不可更改。
11.5 定期审计权限
集群的安全管理运维人员应定期审核RAM配置和RAM用户RBAC权限,查看指定RAM用户是否被分配了合适的权限。
十二、总结
阿里云容器服务ACK为企业提供了从基础设施到应用交付的全链路Kubernetes解决方案。通过合理选择集群类型、科学规划网络、精细化管理节点池、规范部署工作负载、配置服务暴露与存储、构建完善的安全与可观测体系,企业可以在ACK上快速构建稳定、高效、低成本的云原生平台。本文涵盖的实践指南和避坑建议,旨在帮助读者从零开始顺利完成ACK集群的配置与应用部署,并在生产环境中持续优化运维。
常见问题解答
问:ACK托管集群Pro版和基础版的主要区别是什么?
答:Pro版提供99.95%的SLA保障,单集群默认支持最多5000个Worker节点,适用于企业生产环境,但收取集群管理费用。基础版仅供个人学习测试,单账号最多创建2个集群,单集群仅支持10个Worker节点,不收取集群管理费用。
问:Terway和Flannel网络插件应该如何选择?
答:Terway是阿里云自研CNI插件,基于ENI实现Pod直接连VPC,网络性能优异,适合大规模、高性能场景。Flannel是开源Overlay网络方案,配置简单但性能较弱,适合小规模或测试场景。网络插件在集群创建后不可更改。
问:如何通过ALB Ingress暴露ACK集群中的服务?
答:首先在集群中部署ALB Ingress Controller组件,然后创建Ingress资源并指定ingressClassName为alb,配置域名和路径转发规则。ALB Ingress支持HTTP、HTTPS和QUIC协议,可实现复杂的七层流量管理。
问:ACK中如何实现Pod的弹性伸缩?
答:ACK支持HPA(Horizontal Pod Autoscaler)基于CPU利用率、内存利用率或自定义指标自动调整Pod副本数量。此外还支持AHPA弹性预测功能,根据历史数据自动规划未来24小时的实例数。使用HPA前需要安装metrics-server组件。
问:ACK的授权体系是如何工作的?
答:ACK采用RAM和Kubernetes RBAC双重授权机制。RAM控制用户能否访问ACK集群("进门"),RBAC控制用户在集群内能做什么操作。自Kubernetes 1.33版本起,ACK托管集群默认安装ack-ram-authenticator组件,提供基于RAM的Webhook认证。
问:生产环境中ACK集群有哪些必须注意的配置?
答:生产环境必须为所有容器设置资源请求和限制,避免资源争抢和OOM;必须配置LivenessProbe和ReadinessProbe健康检查;建议将数据库等有状态服务使用阿里云RDS等托管服务;集群创建前应合理规划网络CIDR;定期审计RAM和RBAC权限配置。



