Container Service for Kubernetes提供豐富的組件,用於擴充叢集功能。本文介紹如何在Terraform中配置組件,以協助您在多情境下完成業務的管理。
組件類型
Container ServiceACK管理的叢集組件類型包括系統組件和可選組件。更多組件資訊,請參見組件概述。
系統組件
系統組件是運行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提供對接CloudMonitor的系統組件。 |
|
metrics-server | 日誌與監控 | ACK基於社區開源監控組件進行改造和增強監控採集和離線組件,並提供Metrics API進行資料消費,提供HPA的能力。 |
|
ack-node-problem-detector | 日誌與監控 | ACK基於社區開源專案進行改造和增強叢集節點例外狀況事件監控組件,以及對接第三方監控平台功能的組件。 |
|
ags-metrics-collector | 日誌與監控 | 為基因計算客戶使用的監控服務元件,可以通過該組件監控基因工作流程中各個節點資源使用的詳細資料。 |
|
ack-arms-prometheus | 日誌與監控 | 使用阿里雲Prometheus實現Container Service叢集監控。 |
|
logtail-ds | 日誌與監控 | 使用Log Service採集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 | 網路組件 | 阿里雲開源的基於Virtual Private Cloud的容器網路介面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 | 其他 | Container ServiceACK成本分析功能進行資料處理的外掛程式。 |
|
ack-kubernetes-cronhpa-controller | 其他 | 使用ack-kubernetes-cronhpa-controller實現應用負載定時伸縮。 |
|
ack-virtual-node | 其他 | 基於社區開源專案Virtual Kubelet,擴充了對Aliyun Provider的支援,並做了大量最佳化,實現Kubernetes與Elastic Container Instance的無縫串連。 |
|
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 | 其他 | 由阿里雲Container Service團隊和螞蟻金服安全計算團隊針對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:Regex(代表允許傳遞的值的格式)。
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節點上安裝的CloudMonitor外掛程式和Prometheus監控服務。在Terraform中安裝ECS節點上安裝的CloudMonitor外掛程式是通過參數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 Gateway資源模型。 | |||
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選擇一個即可,根據業務需求進行合理選擇。
其他組件可以根據業務需求選擇性安裝,可以自由組合。