企业级ACK搭建自动化
当企业开通ACK容器服务并创建集群时,需要同时创建如VPC,交换机,NAT网关等一系列资源实例。同时,创建ACK容器集群需要选择诸多参数并安装基础组件,增加了手动创建的复杂性。 本方案介绍了一种通过Terraform,自动在当前账号内快速创建ACK集群的方法。
方案概述
当企业开通ACK容器服务并创建集群时,需要同时创建如VPC,交换机,NAT网关等一系列资源实例。同时,创建ACK容器集群需要选择诸多参数并安装基础组件,增加了手动创建的复杂性。
本文档介绍了一种通过Terraform,自动在当前账号内快速创建ACK集群的方法。
方案优势
基础设施代码化
基于IaC思想,将ACK集群创建和配置过程使用Terraform规范化,保证创建的集群统一并且包含基础的企业级配置(包括多可用区、节点日志收集和监控等),简化了手动创建集群操作。
客户场景
云上创建ACK集群
场景描述
企业因业务发展,需要在云上创建ACK集群。
适用客户
- 需要在云上自动化创建ACK集群,对集群有一定高可用性、可观测性要求的企业客户。
方案架构
本方案使用Terraform自动化执行,创建一个VPC并在其中部署一个ACK Pro版集群。为保证高可用,该集群使用Terway的网络架构,并将节点部署在不同的可用区(至少两个)。该方案会在VPC下创建NAT网关并配置SNAT规则作为网络出口,同时会为集群安装ALB Ingress Controller用于处理Internet请求。集群上的节点、控制平面和ingress日志均会存储在SLS服务中,并安装Prometheus监控组件实现监控。
ACK集群默认配置
除了在实施时配置的参数外,本方案创建的ACK托管版集群的其他配置如下所示。
配置类别 |
配置名称 |
配置值 |
集群配置 |
集群名称 |
enterprise-ack |
集群类型 |
||
集群付费方式 |
按量付费 |
|
容器运行时 |
containerd 1.5.13 |
|
网络插件 |
||
kube-proxy代理模式 |
IPVS |
|
Secret落盘加密 |
否 |
|
集群本地域名 |
cluster.local |
|
集群删除保护 |
是 |
|
节点池名称 |
enterprise-ack-node-pool |
|
操作系统 |
Alibaba Cloud Linux |
|
安全加固 |
否 |
|
存储插件 |
||
使用Prometheus监控服务 |
是 |
|
日志插件 |
logtail-ds,日志存储在名为k8s-log-{ClusterID}的Project下。 |
|
创建Ingress Dashboard |
是 |
|
控制平面组件日志 |
是,采集[apiserver, kcm, scheduler]的日志,保存30天。 |
|
安装node-problem-detector并创建事件中心 |
是 |
|
安全巡检插件 |
security-inspector |
|
定时巡检 |
未设置 |
|
安全组 |
企业级安全组 |
|
Ingress |
ALB Ingress,详细见文档 |
|
网络配置 |
VPC名称 |
enterprise-ack-vpc |
交换机名称 |
enterprise-ack-node/pod-vswitches |
|
NAT实例名称 |
enterprise-ack-nat-gateway |
|
NAT实例类型 |
Enhanced |
|
NAT付费模式 |
按量付费 |
|
EIP名称 |
enterprise-ack-eip |
|
EIP付费模式 |
按量付费 |
|
EIP流量付费 |
按使用流量计费 |
|
EIP线路类型 |
BGP(多线) |
产品费用及名词
产品费用
产品名称 |
产品说明 |
产品费用 |
容器服务ACK |
阿里云容器服务ACK(Alibaba Cloud Container Service for Kubernetes)提供高性能的容器应用管理服务,支持企业级Kubernetes容器化应用的生命周期管理,让您轻松高效地在云端运行Kubernetes容器化应用。 |
收费,详情参见产品定价。 |
云服务器ECS |
云服务器ECS(Elastic Compute Service)是一种简单高效、处理能力可弹性伸缩的计算服务。帮助您构建更稳定、安全的应用,提升运维效率,降低IT成本,使您更专注于核心业务创新。 |
收费,详情参见产品计费。 |
负载均衡SLB |
负载均衡SLB(Server Load Balancer)是一种对流量进行按需分发的服务,通过将流量分发到不同的后端服务来扩展应用系统的服务吞吐能力,并且可以消除系统中的单点故障,提升应用系统的可用性。 |
|
公网NAT网关 |
公网NAT网关(NAT Gateway)是一款针对公网访问的企业级安全网关产品,具有高性能、自动弹性、灵活计费、精细化运维等特性,可以帮助您更好地管理公网访问流量。 |
收费,详情参见产品计费 |
弹性公网IP |
弹性公网IP(Elastic IP Address,简称EIP)是可以独立购买和持有的公网IP地址资源。当EIP和云资源绑定后,云资源可以通过EIP与公网通信。 |
收费,详情参见产品计费 |
Prometheus监控 |
阿里云Prometheus监控全面对接开源Prometheus生态,支持类型丰富的组件监控,提供多种开箱即用的预置监控大盘,且提供全面托管的Prometheus服务。 |
收费,详情参见产品计费 |
日志服务SLS |
日志服务SLS是云原生观测与分析平台,为Log、Metric、Trace等数据提供大规模、低成本、实时的平台化服务。 |
收费,详情参见产品计费 |
专用网络VPC |
专有网络VPC(Virtual Private Cloud)是用户基于阿里云创建的自定义私有网络, 不同的专有网络之间二层逻辑隔离,用户可以在自己创建的专有网络内创建和管理云产品实例 |
免费 |
名词解释
名称 |
说明 |
节点池是集群中具有相同配置的一组节点,节点池可以包含一个或多个节点。创建集群时指定的节点数和配置将成为默认节点池,您可以向集群添加其他不同大小和类型的节点池。您可以创建和升级节点池而不会影响整个集群。 |
|
Terway是阿里云开源的基于专有网络VPC的容器网络接口CNI(Container Network Interface)插件,支持基于Kubernetes标准的网络策略来定义容器间的访问策略。您可以通过使用Terway网络组件实现Kubernetes集群内部的网络互通。 |
更多容器服务与原生Kubernetes名词对照,可以参考官方链接。
安全性
容器服务ACK服务角色
首次使用容器服务ACK时,需要为服务账号授予系统默认角色。当且仅当该角色被正确授予后,容器服务才能正常地调用相关服务(ECS,OSS、NAS、SLB等),创建集群以及保存日志等。关于容器服务默认角色的名称和对应的功能权限,请参见容器服务默认角色说明。
节点池Worker Ram角色
ACK集群在创建Worker时会自动生成一个名为KubernetesWorkerRole-xxxx
的RAM角色,并将该角色绑定到节点池中的ECS实例上,更多信息请参见实例RAM角色。
VPC安全性
专有网络VPC具有安全可靠、灵活可控、灵活可用以及较强的可扩展性,详情参见产品优势及访问控制。
注意事项
容器服务ACK产品限制
使用阿里云容器服务ACK产品前,需要注意相关产品使用限制。详细可以查看官方帮助。
弹性公网IP使用限制
使用弹性公网IP(Elastic IP Address,简称EIP)前,请先了解EIP的使用限制。
NAT网关使用限制
NAT网关在产品功能和服务性能上的限制,以及如何申请更高配额,详情参见使用限制。
ALB使用限制
应用型负载均衡ALB在使用时存在限制,包括地域和可用区,详细参见使用限制。
实施步骤
实施准备
- 确保已安装并配置好Terraform环境,所需的Terraform版本需要大于等于0.13。
- 确保在「当前账号」ECS控制台下,存在一个「密钥对」。在后续的步骤中,我们将使用该密钥对。
- 确保在「当前账号」RAM控制台下,存在一个「子用户」并持有其AccessKey和SecretKey,且该子用户拥有以下权限。在后续的步骤中,我们将使用该子用户的AK和SK。
权限名称 |
权限描述 |
AliyunVPCFullAccess |
用于创建供ACK集群使用的VPC和交换机 |
AliyunNATGatewayFullAccess |
用于创建NAT网关并配置Snat规则 |
AliyunEIPFullAccess |
用于创建NAT所使用的EIP |
AliyunECSFullAccess |
用于创建密钥对以及查询指定标签下的资源 |
AliyunCSFullAccess |
用于创建ACK集群和相应节点池 |
AliyunLogFullAccess |
用于存储ACK集群日志 |
- 确保在「当前账号」下,已经开通容器服务ACK Pro版、日志服务SLS以及Promethus监控服务,并已授权创建相关服务角色。
注意: 若创建ACK集群时提示AliyunOOSLifecycleHook4CSRole
角色未找到,可参考「管理节点池」文档中的「调整期望节点数」模块中的第4步-「授予CS获取云资源的权限」完成授权。
实施时长
在实施准备工作完成的情况下,本方案实施预计时长:15分钟。
操作步骤
配置参数
本步骤配置创建ACK集群所需参数,若已配置参数可跳过该步骤。
- 下载源代码中的代码包,解压到某个目录。目录结构可以参考附件中的解释。
- 使用编辑器打开
terraform.tfvars
文件,修改文件内的配置信息。
分组名 |
中文名称 |
配置项名称 |
参考示例 |
配置项描述 |
AccessKey ID |
alicloud_access_key |
LTAI**************** |
在实施准备中具有对应权限的「子用户」AK和SK |
|
AccessKey Secret |
alicloud_secret_key |
yourAccessKeySecret |
||
集群配置 |
地域 |
region |
cn-hangzhou |
ACK集群所在的地域 |
时区 |
timezone |
Asia/Shanghai |
ACK集群所使用的时区 |
|
VPC CIDR |
vpc_cidr |
192.168.0.0/16 |
ACK集群所在的VPC网段 |
|
Node VSW |
node_vswitches |
[ { cidr = "192.168.0.0/19" zone_id = "cn-hangzhou-h" }, { cidr = "192.168.64.0/19" zone_id = "cn-hangzhou-g" } ] |
集群Node所使用的交换机,所填项包括交换机的网段和可用区。 注意:为保证集群的高可用,强烈建议为Node创建两个及以上且处在不同可用区的交换机。 |
|
Pod VSW |
pod_vswitches |
[ { cidr = "192.168.32.0/19" zone_id = "cn-hangzhou-h" }, { cidr = "192.168.96.0/19" zone_id = "cn-hangzhou-g" } ] |
集群Pod所使用的的交换机。 注意:Pod Vswitches和Node Vswitches需要处于相同的可用区。 |
|
EIP带宽 |
eip_bandwidth |
10 |
EIP的最大带宽 |
|
Service CIDR |
service_cidr |
172.21.0.0/20 |
ACK集群Service所用的网段,注意不可与VPC网段重合。 |
|
Kubernetes版本 |
ack_version |
1.24.6-aliyun.1 |
ACK集群的版本,仅允许最新的两个版本 |
|
API Server访问 |
load_balancer_spec |
slb.s1.small |
为API Server创建的SLB实例规格 |
|
节点池配置 |
系统盘类型 |
system_disk_category |
cloud_essd |
节点系统盘类型,可选值 |
数据盘类型 |
data_disk_category |
cloud_essd |
节点数据盘类型,可选值 |
|
系统盘大小 |
system_disk_size |
40 |
节点数据盘大小,可选值 |
|
数据盘大小 |
data_disk_size |
40 |
节点数据盘大小,可选 |
|
期望节点数量 |
desired_size |
3 |
节点池期望节点数量,后续可在容器控制台上调整。 |
|
实例规格 |
worker_instance_types |
[ "ecs.c5.xlarge" ] |
节点池允许创建的实例规格,在创建节点时,将从第一个规格开始尝试,直到创建成功。最多可选10种实例规格。 |
|
密钥对 |
key_pair_name |
test-key-pair |
在实施准备中创建的「密钥对」名称 |
运行Terraform代码
- 参数配置完成后,通过命令
terraform init
下载aliyun Provider并初始化Terraform环境。 - 使用命令
terraform plan
查看部署计划,并使用terraform apply
命令完成部署。 - 部署成功后,将打印ACK集群id,也可登录到容器控制台,查看对应的ACK实例。
执行结果
- 在Terraform代码执行完成后除了容器控制台的集群实例,我们也可以登录到sls控制台对应的Log Project中查看相关的日志数据。
- 在日志服务「智能运维」- 「K8s事件中心」中可以看到对应集群的事件中心。
- 在Prometheus监控实例中,也可以查看到创建的ACK集群信息。
故障排除
执行Terraform代码时提示xxx角色未找到?
ACK容器服务在创建集群和节点池时,依赖账号中许多RAM服务角色,其中大部分角色在进入容器控制台时已经创建。AliyunOOSLifecycleHook4CSRole
角色并未创建,需要在创建节点池时手动进行授权。可在文档中「调整期望节点数」板块,第四步「授权CS获取云资源的权限」中,点击对应的链接进行授权。
Prometheus监控中为什么显示“未找到相关监控大盘”?
出现原因:节点池中node内存过小,可在事件中心中查看。
解决方案:
- 修改节点池规格信息,通过扩缩容/修改节点池中节点实例规格,变更节点配置。
- 在完成后,等待2min左右即可查看到监控大盘。
方案卸载
因为相关实例开启了删除保护,无法直接使用terraform destroy
命令进行回滚,在删除前需要在控制台上关闭对应资源实例的删除保护设置。同时,删除集群并不会删除相关日志和监控实例,需要到相关控制台上手动删除。
- 前往「容器服务控制台」,在对应容器右侧的「操作」栏目下,点击「更多」-「修改集群删除保护状态」,关闭集群删除保护。
- 使用
terraform destroy
命令删除创建的资源。 - 前往「日志服务控制台」删除对应的Project,并进入K8s事件中心,删除对应的事件中心。
- 前往「Prometheus监控控制台」卸载对应的Prometheus监控实例。