容器服务 Kubernetes 版提供丰富的组件,用于扩展集群功能。本文介绍如何在Terraform中配置组件,以帮助您在多场景下完成业务的管理。
组件类型
容器服务ACK管理的集群组件类型包括系统组件和可选组件。更多组件信息,请参见组件概述。
系统组件
系统组件是运行ACK集群所依赖的基础组件,创建集群时会默认安装。例如:
kube-apiserver
kube-controller-manager
cloud-controller-manager
kube-proxy
CoreDNS
可选组件
可选组件是ACK提供的非必需部署的组件,您可选择性的安装组件,用于扩展集群功能。可选组件在类型上可划分为应用管理组件、日志与监控管理组件、存储组件、网络组件及安全组件等。
组件管理实践
通过Terraform,您可以在创建集群时指定需要安装的组件,并在集群创建结束后对组件进行全生命周期管理,下面将介绍如何管理集群中的组件生命周期,以及一些场景下的最佳实践。
在创建集群时指定需要安装的组件
您可以在创建集群时,指定集群需要安装的组件,创建集群涉及的Resource如下:
Kubernetes托管版集群:alicloud_cs_managed_kubernetes
Kubernetes专有版集群:alicloud_cs_kubernetes
ACK Edge集群:alicloud_cs_edge_kubernetes
ACK Serverless集群:alicloud_cs_serverless_kubernetes
以上Resource均可以通过addons
属性定义创建集群时需要安装的组件,addons
属性定义如下:
# 以托管版集群为例。
resource "alicloud_cs_managed_kubernetes" "default" {
# 其它参数。
# ...
# addons为list结构,通过在Resource中定义addons属性,表明创建集群时安装该组件。
addons {
# 组件的名称,您可以通过Data Source中的alicloud_cs_kubernetes_addons查询。
# 当前集群已经安装的,以及可以安装的组件和其对应版本信息。
name = "XXX"
# 组件的自定义参数,某些集群组件开启了自定义参数配置的能力,您可以使用该字段来为组件指定其自定义参数,具体指定方法,请参见下文“修改集群组件的自定义配置参数”一节。
config = jsonencode(
{
....
}
)
# 该参数默认值为false(布尔值类型),ACK会默认安装部分组件,方便用户管理集群。若您在创建集群时不需安装这些组件,可设置disabled=true。
disabled = XXX
}
}
通过在集群相关Resource中指定Addons的方式安装组件,仅支持在创建集群时指定安装,集群创建完成后,不支持通过修改Addons代码块中的属性来管理组件的组件生命周期,比如组件升级、组件卸载、组件配置更新等操作。若您需要在创建集群后管理组件生命周期,请参见下文在创建集群后管理组件生命周期。
ACK中组件配置方式如下表所示。
组件名称 | 组件类型 | 组件描述 | Terraform中配置组件 |
appcenter | 应用管理 | 提供统一管理多集群应用部署和应用生命周期的应用中心组件。 |
|
progressive-delivery-tool | 应用管理 | 提供应用渐进式灰度发布的组件。 |
|
alicloud-monitor-controller | 日志与监控 | ACK提供对接云监控的系统组件。 |
|
metrics-server | 日志与监控 | ACK基于社区开源监控组件进行改造和增强的监控采集和离线组件,并提供Metrics API进行数据消费,提供HPA的能力。 |
|
ack-node-problem-detector | 日志与监控 | ACK基于社区开源项目进行改造和增强的集群节点异常事件监控组件,以及对接第三方监控平台功能的组件。 |
|
ags-metrics-collector | 日志与监控 | 为基因计算客户使用的监控服务组件,可以通过该组件监控基因工作流中各个节点资源使用的详细信息。 |
|
ack-arms-prometheus | 日志与监控 | 使用阿里云Prometheus实现容器服务集群监控。 |
|
logtail-ds | 日志与监控 | 使用日志服务采集Kubernetes容器日志。 | |
csi-plugin | 存储组件 | 支持数据卷的挂载、卸载功能。创建集群时,如果选择CSI插件实现阿里云存储的接入能力的话,默认安装该组件。 |
|
csi-provisioner | 存储组件 | 支持数据卷的自动创建能力。创建集群时,如果选择CSI插件实现阿里云存储的接入能力的话,默认安装该组件。 |
|
storage-operator | 存储组件 | 用于管理存储组件的生命周期。 |
|
alicloud-disk-controller | 存储组件 | 支持自动创建云盘卷。 |
|
flexvolume | 存储组件 | Kubernetes社区较早实现的存储卷扩展机制。Flexvolume支持数据卷的挂载、卸载功能。创建集群时,如果选择Flexvolume插件实现阿里云存储的接入能力的话,默认安装该组件。 |
|
nginx-ingress-controller | 网络组件 | Nginx Ingress Controller解析Ingress的转发规则。Ingress Controller收到请求,匹配Ingress转发规则转发到后端Service。 | |
terway-eniip | 网络组件 | 阿里云开源的基于专有网络VPC的容器网络接口CNI(Container Network Interface)插件,支持基于Kubernetes标准的网络策略来定义容器间的访问策略。您可以通过使用Terway网络组件实现Kubernetes集群内部的网络互通。创建集群时,如果选择Terway网络插件实现集群内部网络互通的话,默认安装该组件。 |
|
ack-node-local-dns | 网络组件 | 基于社区开源项目NodeLocal DNSCache的一套DNS本地缓存解决方案。 | |
aliyun-acr-credential-helper | 安全组件 | 可以在ACK集群中免密拉取ACR默认版或企业版私有镜像的组件。 |
|
gatekeeper | 安全组件 | 帮助管理和应用集群内的Open Policy Agent(OPA)策略,实现命名空间标签管理等功能。 |
|
kritis-validation-hook | 安全组件 | 部署可信容器环节中进行容器镜像签名验证的关键组件。 |
|
security-inspector | 安全组件 | 实现安全巡检功能的关键组件。 |
|
ack-kubernetes-webhook-injector | 安全组件 | 一款可以从多种阿里云产品白名单中动态加入或移出Pod IP的K8s组件,免去手动配置Pod IP到云产品白名单的操作。 |
|
ack-arena | 其他 | 对开源Arena的安装做进一步简化,能够实现在控制台一键安装Arena的目标。 |
|
ack-cost-exporter | 其他 | 容器服务ACK成本分析功能进行数据处理的插件。 |
|
ack-kubernetes-cronhpa-controller | 其他 | 使用ack-kubernetes-cronhpa-controller实现应用负载定时伸缩。 |
|
ack-virtual-node | 其他 | 基于社区开源项目Virtual Kubelet,扩展了对Aliyun Provider的支持,并做了大量优化,实现Kubernetes与弹性容器实例ECI的无缝连接。 |
|
aesm | 其他 | Intel® SGX Architectural Enclave Service Manager (Intel® SGX AESM) 是Intel® SGX的系统组件,主要提供了SGX Enclave启动支持,密钥配置、远程认证等服务。 |
|
aliyun-acr-acceleration-suite | 其他 | 提供镜像按需加载加速能力的客户端插件,以DaemonSet形式部署在Worker节点上。 |
|
migrate-controller | 其他 | 基于开源项目Velero开发的一个Kubernetes应用迁移的组件。 |
|
resource-controller | 其他 | 实现动态控制Pod资源的关键组件,使用ACK Pro集群的CPU拓扑感知调度需要安装此组件。 |
|
sandboxed-container-controller | 其他 | 安全沙箱运行时提供的专用控制器组件,旨在增强和扩展安全沙箱的基本功能。 |
|
sandboxed-container-helper | 其他 | 为安全沙箱提供诊断和运维的组件。 |
|
sgx-device-plugin | 其他 | 由阿里云容器服务团队和蚂蚁金服安全计算团队针对Intel SGX联合开发的Kubernetes Device Plugin,可以让您更容易的在容器中使用SGX。 |
|
在创建集群后管理组件生命周期
管理组件的生命周期前提是您已经创建了一个Kubernetes集群,如果您还没有创建Kubernetes集群,请先创建集群。
对于集群中的组件,您可以通过Resource中的alicloud_cs_kubernetes_addon
来管理组件的生命周期,包括组件的安装、升级、卸载、自定义配置的修改。alicloud_cs_kubernetes_addon
的属性和定义如下:
resource "alicloud_cs_kubernetes_addon" "addon-example" {
# 集群ID。
cluster_id = "XXXX"
# 组件的名称,可以通过Data Source中的alicloud_cs_kubernetes_addons,查询当前集群所有已安装的以及可以安装的组件和其对应版本信息。
name = "XXXX"
# 组件的版本信息。
version = "XXXX"
# 组件的自定义参数,为JSON格式的字符串,可以使用Terraform自带的jsonencode方法进行配置,也可以直接使用JSON字符串进行配置(需要注意转义),某些集群组件开启了自定义参数配置的能力,您可以使用该字段来为组件指定其自定义参数,具体指定方法,请参见下文“修改集群组件的自定义配置参数”一节 。
config = jsonencode(
{
....
}
)
}
您可以通过直接写入JSON字符串的方式配置组件自定义参数,但是需要注意转义。例如对于nginx-ingress-controller组件,有以下两种配置方法:
通过
jsonencode
配置参数:config = jsonencode( { IngressSlbNetworkType="internet" IngressSlbSpec="slb.s2.small" } )
通过直接使用字符串的方式配置参数:
config = "{\"IngressSlbNetworkType\":\"internet\",\"IngressSlbSpec\":\"slb.s2.small\"}"
将集群已安装的组件导入Terraform管理
对于集群已经安装的组件,您可以通过terraform import
的方式,将组件导入Terraform进行管理。下面以nginx-ingress-controller组件为例说明如何将集群已安装的组件导入Terraform管理。
新建一个后缀名为.tf的文件或使用您已创建的.tf文件,并定义一个Resource。
Resource中的
alicloud_cs_kubernetes_addon
用于管理集群的Addon,其中不需要填写任何内容。resource "alicloud_cs_kubernetes_addon" "nginx-ingress-controller" { }
执行以下命令,导入集群已安装的nginx-ingress-controller组件。
Terraform会拉取集群内的nginx-ingress-controller组件配置,并写入到后缀名为.state的文件中。
terraform import alicloud_cs_kubernetes_addon.nginx-ingress-controller <cluster_id>:nginx-ingress-controller
执行命令
terraform plan
,根据其得到的结果,您可以看到集群内nginx-ingress-controller组件配置和定义的Resource之间的差异。根据差异的结果,以及.state后缀的文件内容,补充您在步骤1中写入的Resource信息。直到执行指令
terraform plan
,显示本地的配置与集群中的组件配置没有任何差异后,即完成了组件的导入。resource "alicloud_cs_kubernetes_addon" "nginx-ingress-controller" { cluster_id = "XXXXX" name = "nginx-ingress-controller" version = "v1.2.1-aliyun.1" config = jsonencode( { IngressSlbNetworkType = "internet" IngressSlbSpec = "slb.s2.small" } ) }
安装集群组件
您可以通过Resource中的alicloud_cs_kubernetes_addon
在已有集群中安装组件,下面以gatekeeper组件为例说明。
在.tf文件中定义待安装组件的信息,需要指定以下信息。
集群ID。
组件名称和组件版本:
集群可安装的组件名称和组件版本可以通过Data Source中的
alicloud_cs_kubernetes_addons
查询,查询结果仅返回每个组件最新的可安装版本。如果您需要安装组件的历史版本,请查看对应组件的Release日志,并指定对应的组件版本号。(可选)组件的自定义配置:
修改
config
字段进行组件自定义配置,可以使用Terraform内置的jsonencode
方法来构建您需要的配置。组件的可配置参数可以通过Data Source中的alicloud_cs_kubernetes_addon_metadata
进行查询,具体操作,请参见修改集群组件的自定义配置参数。
执行以下命令,在集群中安装组件。
terraform apply
预期输出:
Plan: 1 to add, 0 to change, 0 to destroy. Do you want to perform these actions? Terraform will perform the actions described above. Only 'yes' will be accepted to approve. Enter a value: yes alicloud_cs_kubernetes_addon.gatekeeper: Creating... alicloud_cs_kubernetes_addon.gatekeeper: Still creating... [10s elapsed] alicloud_cs_kubernetes_addon.gatekeeper: Creation complete after 16s [id=XXXXX:gatekeeper] Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
直到显示
Apply complete!
,说明组件安装完成。
升级集群组件
您可以通过Data Source中的alicloud_cs_kubernetes_addons
来查询组件可升级的版本,如果发现有新版本的组件可升级,可以通过直接修改版本号的方式进行升级,下面以gatekeeper组件为例说明。
执行命令terraform apply
,进行组件升级,显示成功即完成了组件的升级。
修改集群组件的自定义配置参数
ACK的某些组件开启了用户自定义参数的配置能力,您可以通过Resource中的alicloud_cs_kubernetes_addons
修改更新您的组件配置,以gatekeeper组件为例,您可以通过修改config
字段来修改组件配置。
如果您需要查看组件支持的全部可配置参数,可以通过Data Source中的alicloud_cs_kubernetes_addon_metadata
进行查询,查询结果的返回值为JSON Schema格式,以gatekeeper组件为例,您可以将以下内容添加到.tf文件中。
# 定义Data Source获取gatekeeper组件的可配置参数Schema。
data "alicloud_cs_kubernetes_addon_metadata" "default" {
cluster_id = "ce36b7c61e126430b8b245730ca6d****"
name = "gatekeeper"
version = "v3.8.1.113-geb7947ef-aliyun"
}
# 通过Output进行输出。
output "addon_config_schema" {
value = data.alicloud_cs_kubernetes_addons.default.config_schema
}
执行命令terraform apply
,返回的结果为JSON Schema格式,其中properties
属性定义了所有支持配置的参数。根据返回的Schema,您可以任意指定Schema中支持的配置参数。可配置的参数说明如下:
default:默认值。
description:参数的描述。
pattern:正则表达式(代表允许传递的值的格式)。
type:字段类型。
配置网络组件
在ACK中,您可以通过Terway网络模式实现上述容器网络的能力。更多信息,请参见网络概述。
下面展示如何通过Terraform配置网络组件。
配置存储组件
ACK提供的存储组件,支持Flexvolume和CSI两种。Flexvolume已经停止维护,ACK主要维护CSI存储组件。如果通过Terraform创建集群时,不指定任何存储组件,默认会安装CSI。在Terraform中通过以下方式进行存储组件定义。
配置日志组件
ACK提供的日志组件是logtail-ds,日志组件将采集到的日志存储在SLS中。ACK提供的日志组件支持以下两种日志存储方式:
支持指定已有SLS Project作为日志存储。
支持创建集群时自动创建新的SLS Project作为日志存储。
两种不同场景下的配置也有区别,下面通过一个Terraform示例说明:
配置监控组件
ACK提供的监控组件包括ECS节点上安装的云监控插件和Prometheus监控服务。在Terraform中安装ECS节点上安装的云监控插件是通过参数install_cloud_monitor来控制的。
配置Ingess路由组件
ACK提供的流量接入方案,包括Nginx Ingress和ALB Ingress。
Nginx Ingress组件:基于社区版的ingress-nginx进行了优化,为您的Kubernetes集群提供灵活可靠的路由服务。更多信息,请参见Nginx Ingress概述。
ALB Ingress组件:是全托管并且高可靠的ALB Ingress组件,为您的Kubernetes集群提供灵活可靠的路由服务。更多信息,请参见通过ALB Ingress访问服务。
通过Terraform配置路由组件的示例如下:
禁用默认安装的组件
ACK会默认安装部分组件,方便您管理集群,如果您在创建集群的时候,不需要安装这些组件,可以通过设置字段为disabled = true
来禁用这些组件。下面以禁用nginx-ingress-controller
为例说明:
# 禁止安装nginx-ingress-controller组件。
resource "alicloud_cs_managed_kubernetes" "default" {
# 其它参数。
# ...
addons {
name = "nginx-ingress-controller",
disabled = true
}
}
未指定Addons的情况下默认安装的组件
如果集群创建时,没有指定任何Addons,会默认安装以下组件。
集群类型 | 组件类型 | 默认安装组件名称 | 组件描述 | |
ACK集群 | 系统组件 | kube-scheduler | 使用Kube Scheduler进行集群资源调度。 | |
cloud-controller-manager | 使用Cloud Controller Manager为K8s应用创建负载均衡,管理节点路由条目。 | |||
kube-apiserver | APIServer是K8s集群的总线和入口网关。 | |||
kube-controller-manager | KCM是K8s集群内部资源的管理器。 | |||
日志与监控 | alicloud-monitor-controller | 监控应用容器的生命周期和状态变化。 | ||
metrics-server | Metrics Server为集群的自动伸缩机制提供应用容器的资源监控指标。 | |||
存储 | csi-plugin | 使用csi-plugin插件实现存储卷生命周期管理(推荐)。 | ||
csi-provisioner | 使用csi-provisioner插件实现存储卷创建和删除(推荐)。 | |||
storage-operator | 使用storage-operator插件实现存储运维管理(推荐)。 | |||
网络 | CoreDNS | Kubernetes集群域名解析服务器。 | ||
Gateway API | Gateway API网关资源模型。 | |||
terway-eniip | Terway网络插件。 | |||
nginx-ingress-controller(Pro版默认安装) | 基于Nginx流量转发的Ingress控制器。 | |||
ACK Serverless集群 | 系统组件 | kube-scheduler | 使用Kube Scheduler进行集群资源调度。 | |
ack-virtual-node | 使用虚拟节点和ECI极致弹性能力。 | |||
cloud-controller-manager | 使用Cloud Controller Manager为K8s应用创建负载均衡,管理节点路由条目。 | |||
kube-apiserver | APIServer是K8s集群的总线和入口网关。 | |||
kube-controller-manager | KCM是K8s集群内部资源的管理器。 | |||
网络 | CoreDNS | K8s集群域名解析服务器。 | ||
ACK Edge集群 | 系统组件 | kube-scheduler | 使用Kube Scheduler进行集群资源调度 | |
cloud-controller-manager | 使用Cloud Controller Manager为K8s应用创建负载均衡,管理节点路由条目。 | |||
kube-apiserver | APIServer是K8s集群的总线和入口网关。 | |||
kube-controller-manager | KCM是K8s集群内部资源的管理器。 | |||
日志与监控 | alicloud-monitor-controller | 监控应用容器的生命周期和状态变化。 | ||
metrics-server | Metrics Server为集群的自动伸缩机制提供应用容器的资源监控指标 | |||
网络 | CoreDNS | Kubernetes集群域名解析服务器。 | ||
terway-eniip | Terway网络插件。 | |||
其他 | edge-controller-manager | - | ||
edge-tunnel-agent | Edge-tunnel采用C/S架构,构建云边反向运维通道。 | |||
edge-tunnel-server | Edge-tunnel采用C/S架构,构建云边反向运维通道。 | |||
yurt-app-manager | 使用yurt-app-manager为ACK@Edge提供节点池和单元化部署的功能。 |
常用配置示例
以下列出了部分通用示例,供参考使用。
网络组件选择Terway。
存储组件CSI和Flexvolume选择一个即可,由于Flexvolume已停止维护,建议使用CSI作为存储组件。
路由组件Nginx-Ingress和ALB Ingress选择一个即可,根据业务需求进行合理选择。
其他组件可以根据业务需求选择性安装,可以自由组合。