一、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服务器,只需提供打包好的镜像即可运行容器。该集群类型适用于对资源弹性要求极高、希望免于节点运维的场景。
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支持两种网络插件:Terway和Flannel。
- Terway:是阿里云自研的网络插件,基于阿里云VPC实现容器网络。Pod直接获取VPC中的IP地址,实现与云上其他服务(如RDS、Redis)的高性能、低延迟互通。Terway在网络性能和功能上更优,推荐在生产环境中使用。
- Flannel:是社区标准的Overlay网络方案,配置简单但性能相对Terway略低。适用于对网络性能要求不高的场景。
网络配置定义了集群的底层通信架构,部分选项在创建后无法修改,请谨慎规划。
2.3 使用Terraform创建集群
对于基础设施即代码(IaC)实践,ACK支持使用Terraform创建托管集群。以下是一个创建ACK托管集群的Terraform配置示例:
# main.tf 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.g6.large"] worker_number = 3 worker_system_disk_size = 40 pod_cidr = "172.20.0.0/16" service_cidr = "172.21.0.0/20" enable_ssh = false addons { name = "terway" } addons { name = "csi-plugin" } addons { name = "logtail-ds" } }
ACK控制台还可以从集群设置生成Terraform配置片段,无需从头编写配置。
三、节点池管理与配置
节点池是具有相同属性(例如实例规格、操作系统、标签和污点等)的一组节点的逻辑集合。一个集群中可以创建多个不同配置和类型的节点池。
3.1 节点池的核心概念
通过节点池,可实现节点的批量创建、扩容、缩容和升级,简化集群运维。核心应用场景包括:
- 按业务类型分组:如将运行Web应用的节点归为"Web节点池",运行数据服务的节点归为"数据节点池"。
- 按资源规格分组:如高性能节点池(用于计算密集型业务)、通用节点池(用于普通业务)。
- 版本管理:统一升级节点的Kubernetes版本或操作系统版本,避免节点配置不一致。
3.2 节点池配置项
节点池的配置包含节点的属性,例如节点实例规格、计费类型、可用性区域(vSwitch)、操作系统镜像、CPU架构、标签和污点等。创建节点池时需关注以下要点:
- 实例规格:根据业务负载选择合适的ECS实例规格。对于通用型工作负载,推荐使用ecs.g6或ecs.g7系列。
- 计费类型:可选择按量付费或包年包月。对于弹性需求较大的场景,推荐使用按量付费+弹性伸缩组合。
- 操作系统:ACK支持Alibaba Cloud Linux、CentOS、Windows等多种操作系统镜像。
- 节点标签与污点:通过标签实现Pod调度到指定节点池,通过污点实现节点专用(如GPU节点只调度GPU工作负载)。
3.3 节点池弹性伸缩配置
ACK节点池底层依赖ESS(弹性伸缩服务)弹出节点。配置节点池弹性伸缩的步骤如下:
- 在集群维度开启节点自动伸缩功能。
- 将指定节点池的扩缩容模式配置为自动模式。
- 配置伸缩的上下限、扩容策略等参数。
ACK还提供了ack-autoscaling-placeholder组件,通过少量的资源冗余方式实现容器秒级伸缩。
四、Kubernetes核心工作负载部署
在ACK集群中部署应用,主要通过Kubernetes原生工作负载对象来定义和管理容器化应用。
4.1 Deployment:无状态工作负载
Deployment是最常用的资源对象,适用于无状态应用(如Web服务、API服务)。它提供副本管理、自动恢复和滚动升级能力。以下是一个部署Nginx应用的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: 100m memory: 128Mi limits: cpu: 500m memory: 512Mi livenessProbe: httpGet: path: /healthz port: 80 initialDelaySeconds: 30 periodSeconds: 10 readinessProbe: httpGet: path: /ready port: 80 initialDelaySeconds: 5 periodSeconds: 5 restartPolicy: Always
4.2 StatefulSet:有状态工作负载
StatefulSet适用于有状态应用(如数据库、分布式缓存),每个Pod有唯一标识(名称、网络标识),支持稳定的存储挂载和有序部署/更新。以下是一个部署MySQL的StatefulSet示例:
apiVersion: apps/v1 kind: StatefulSet metadata: name: mysql namespace: default spec: serviceName: mysql-service replicas: 1 selector: matchLabels: app: mysql template: metadata: labels: app: mysql spec: containers: - name: mysql image: mysql:8.0 env: - name: MYSQL_ROOT_PASSWORD valueFrom: secretKeyRef: name: mysql-secret key: password ports: - containerPort: 3306 volumeMounts: - name: mysql-data mountPath: /var/lib/mysql volumeClaimTemplates: - metadata: name: mysql-data spec: accessModes: ["ReadWriteOnce"] storageClassName: alicloud-disk-ssd resources: requests: storage: 20Gi
4.3 配置管理:ConfigMap与Secret
将应用配置从镜像中解耦是云原生最佳实践。使用ConfigMap存储通用配置,使用Secret存储敏感信息。
ConfigMap示例:
apiVersion: v1 kind: ConfigMap metadata: name: app-config namespace: default data: app.properties: | server.port=8080 log.level=INFO database.host: "mysql-service.default.svc.cluster.local"
Secret示例(敏感信息需Base64编码或使用stringData):
apiVersion: v1 kind: Secret metadata: name: mysql-secret namespace: default type: Opaque data: password: Um9vdDEyMzQ1Ng== # Base64编码的"Root123456"
五、服务暴露与负载均衡
5.1 Service:服务发现与内部负载均衡
Service为一组Pod提供稳定的网络标识和内部负载均衡。通过ClusterIP类型服务实现服务发现。以下是一个Service示例:
apiVersion: v1 kind: Service metadata: name: nginx-service namespace: default spec: selector: app: nginx ports: - protocol: TCP port: 80 targetPort: 80 type: ClusterIP
5.2 Ingress:七层负载均衡与流量管理
Ingress作为服务对外暴露的访问入口,提供七层负载均衡能力。ACK支持多种Ingress实现,包括Nginx Ingress和ALB Ingress。
ALB Ingress基于阿里云应用型负载均衡ALB之上提供更为强大的Ingress流量管理方式,兼容Nginx Ingress,具备处理复杂业务路由和认证自动探索的能力。以下是一个ALB Ingress配置示例:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: nginx-ingress namespace: default annotations: alb.ingress.kubernetes.io/scheme: internet alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80}]' spec: ingressClassName: alb rules: - host: www.example.com http: paths: - path: / pathType: Prefix backend: service: name: nginx-service port: number: 80
六、存储管理
ACK基于CSI(Container Storage Interface)插件提供多种存储方案。
6.1 云盘动态存储卷
基于动态存储卷机制,可为每个应用副本自动创建并挂载一个独立的云盘,适用于数据库、中间件等对I/O和延迟要求较高的场景。以下是通过StorageClass动态创建云盘存储卷的示例:
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 volumeBindingMode: Immediate
创建PVC(PersistentVolumeClaim)自动绑定PV:
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: disk-pvc namespace: default spec: accessModes: - ReadWriteOnce storageClassName: alicloud-disk-ssd resources: requests: storage: 20Gi
6.2 ossfs 2.0动态存储卷
对于需要在多Pod间共享数据的应用,可通过动态PV将OSS Bucket挂载为ossfs 2.0存储卷。该方式通过StorageClass作为模板自动创建并绑定PV。挂载时支持访问密钥(AccessKey)和RRSA两种鉴权方式。
七、可观测性体系建设
Kubernetes可观测性体系包含监控和日志两部分。阿里云ACK提供了一站式可观测性产品。
7.1 日志采集:Logtail与SLS集成
ACK集群支持将集群控制面组件日志和容器日志收集到SLS Project中。Logtail作为日志采集组件,可采集容器标准输出和文件日志,并投递到SLS进行检索与分析。
在集群创建时或之后,可以一键安装日志服务SLS组件。配置日志采集的典型步骤如下:
- 在ACK控制台进入集群详情页。
- 点击"日志与监控"页签。
- 配置日志采集规则,指定采集的容器或日志文件路径。
- 选择目标SLS Project和Logstore。
7.2 监控告警:托管Prometheus
ACK集成了阿里云Prometheus监控服务,提供容器监控指标的采集、存储和展示。通过托管Prometheus,您可以:
- 查看集群、节点、Pod的多维度监控大盘。
- 设置告警规则,实现异常自动通知。
- 对接ARMS实现应用性能链路追踪。
在集群创建时或之后,可以一键安装ack-arms-prometheus组件。
八、安全管理最佳实践
ACK使用两层授权模型:RAM授权和RBAC授权。
8.1 RAM授权
RAM(资源访问管理)控制对ACK API和云资源的访问权限。建议遵循最小权限原则,为不同角色授予不同的系统策略。
- 集群管理员:授予AliyunCSFullAccess策略。
- 集群只读用户:授予AliyunCSReadOnlyAccess策略。
- 应用运维人员:授予特定集群的操作权限,配合RBAC精细化控制。
8.2 RBAC授权
RBAC(基于角色的访问控制)对ACK集群内的Kubernetes资源进行权限控制。可通过创建Role和ClusterRole,并通过RoleBinding和ClusterRoleBinding绑定到用户或ServiceAccount。
以下是一个创建只读权限Role的示例:
apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: namespace: default name: pod-reader rules: - apiGroups: [""] resources: ["pods"] verbs: ["get", "watch", "list"]
8.3 Worker RAM角色安全
ACK托管集群会自动创建一个所有节点共享的默认Worker RAM角色。当通过默认的Worker RAM角色授权时,权限会共享给集群内所有的节点,可能存在非预期的权限扩散风险。建议在创建节点池时为其指定一个自定义的Worker RAM角色,实现节点池级别的精细化权限控制。
九、弹性伸缩与成本优化
9.1 集群节点弹性伸缩
ACK支持集群自动伸缩(Cluster Autoscaler),根据Pod调度情况自动调整节点数量。配置要点:
- 在集群层面开启节点自动伸缩功能。
- 为节点池配置自动扩缩容策略,设置最小和最大节点数。
- 使用ack-autoscaling-placeholder组件实现容器秒级伸缩。
9.2 Pod水平自动伸缩(HPA)
HPA(Horizontal Pod Autoscaler)根据CPU利用率或自定义指标自动调整Pod副本数。以下是一个HPA配置示例:
apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: nginx-hpa namespace: default spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: nginx-deployment minReplicas: 2 maxReplicas: 10 metrics: - type: Resource resource: name: cpu target: type: Utilization averageUtilization: 50
9.3 成本优化建议
- 合理设置资源请求与限制:为每个容器设置requests和limits,避免资源浪费和节点雪崩。
- 使用抢占式实例:对非关键工作负载使用抢占式实例,大幅降低成本。
- 混合计费模式:核心业务使用包年包月实例,弹性业务使用按量付费+伸缩组。
- 存储分层:热数据使用SSD云盘,冷数据使用OSS低频存储。
- 镜像优化:使用多阶段构建减小镜像体积,加快拉取速度。
十、生产环境最佳实践总结
10.1 健康检查配置
必须为每个容器配置健康检查探针:
- livenessProbe:判断容器是否存活,不存活则重启。
- readinessProbe:判断容器是否就绪,不就绪则不接收流量。
10.2 滚动更新策略
在Deployment中配置滚动更新策略,实现零宕机发布:
spec: strategy: type: RollingUpdate rollingUpdate: maxUnavailable: 25% maxSurge: 25%
10.3 多可用区部署
将节点池分布到至少两个可用区,实现应用级高可用。结合Pod反亲和性(anti-affinity)确保Pod分散部署在不同可用区的节点上。
10.4 镜像拉取加速
使用阿里云容器镜像服务ACR的企业版,开启镜像加速功能,大幅缩短Pod启动时间。同时配置免密拉取组件,避免在集群中存储镜像仓库凭证。
常见问题解答
问1:ACK托管集群和自建Kubernetes集群有什么区别?
答:ACK托管集群的控制面(API Server、Scheduler、Controller Manager、etcd等)由阿里云全托管,用户无需关心Master节点的高可用、升级和安全补丁。自建集群需要自行运维所有控制面组件,工作量大且不产生业务价值。ACK托管集群Pro版还提供99.95%的SLA保障。
问2:创建ACK集群时,Terway和Flannel网络插件如何选择?
答:Terway是阿里云自研网络插件,Pod直接获取VPC IP,与云上RDS、Redis等服务互通性能更好。Flannel是社区标准Overlay方案,配置简单但性能略低。生产环境推荐使用Terway。
问3:如何将ACK集群中的应用暴露到公网?
答:有两种主要方式:一是创建类型为LoadBalancer的Service,自动创建SLB实例暴露服务;二是创建Ingress资源(Nginx Ingress或ALB Ingress),通过七层负载均衡和域名路由暴露多个服务。生产环境推荐使用ALB Ingress,功能更强大。
问4:ACK中如何实现Pod的自动扩缩容?
答:Pod层面使用HPA(Horizontal Pod Autoscaler)根据CPU利用率或自定义指标自动调整副本数。节点层面使用Cluster Autoscaler根据Pending Pod自动扩缩节点。两者配合使用可实现完整的弹性伸缩能力。
问5:ACK集群如何保障安全性?
答:ACK采用两层安全模型——RAM授权控制云资源访问权限,RBAC授权控制集群内Kubernetes资源访问权限。建议遵循最小权限原则,为不同角色授予最小必要权限。同时为节点池配置自定义Worker RAM角色,避免权限扩散风险。
问6:ACK集群的存储方案有哪些推荐?
答:对于需要高IOPS和低延迟的有状态应用(如数据库),推荐使用云盘动态存储卷(StorageClass + PVC)。对于需要在多Pod间共享数据的场景(如静态文件、日志),推荐使用ossfs 2.0挂载OSS Bucket。对于大容量共享文件存储,可使用NAS存储卷。