隨著組織接受 Kubernetes 作為雲原生應用的一部分,有效管理基礎設施變得困難。傳統的基礎設施即代碼(IaC)工具如 Terraform、Pulumi 等提供聲明性配置,但缺乏與 Kubernetes 原生工作流的無縫集成。
Crossplane 在這種情況下有效地橋接了 Kubernetes 和雲基礎設施之間的差距。在本博客中,我們將探討 Crossplane 如何實現 Kubernetes 及更多領域的 IaC。
什麼是 Crossplane?
Crossplane 是一個開源的 Kubernetes 附加組件,它使您能夠使用 Kubernetes 的 自定義資源定義(CRDs)和 Kubernetes API 來配置和管理雲基礎設施。與需要外部執行的傳統 IaC 工具不同,例如需要在外部運行 Terraform 腳本,Crossplane 將基礎設施管理嵌入到了 Kubernetes 中。這使其真正具有聲明性並且適合 GitOps。
用例:Terraform vs. Crossplane
何時使用 Terraform?
- 最適合管理 Kubernetes 以外的基礎設施
- 適用於傳統的多雲部署和虛擬機
- 具有豐富的模塊和提供商生態系統
- 與 Ansible、Packer 和 Vault 等自動化工具配合良好
何時使用 Crossplane?
- 最適合 Kubernetes 中心環境
- 適用於 GitOps 工作流程(ArgoCD、Flux)
- 通過 Kubernetes CRD 實現自助服務項目
- 適用於多雲 Kubernetes 控制(通過 K8s API 管理雲服務)
開始使用 Crossplane
在此示例中,我們將使用 minikube。但同樣的步驟也適用於任何 Kubernetes。
步驟 1:在 Kubernetes 中部署 MySQL
1. 使用 Crossplane 將 MySQL 部署為 Deployment,並使用服務進行配置。您也可以使用從其他位置部署的 MySQL。
2. 定義一個 mysql-deployment.yaml
,其中包括創建運行 MySQL 所需的秘密、部署和服務。
apiVersion v1
kind Secret
metadata
name mysql-root-password
type Opaque
data
password cGFzc3dvcmQ= # Base64 encoded "password"
---
apiVersion v1
kind Service
metadata
name mysql-service
spec
selector
app mysql
ports
protocol TCP
port3306
targetPort3306
---
apiVersion apps/v1
kind Deployment
metadata
name mysql
spec
selector
matchLabels
app mysql
strategy
type Recreate
template
metadata
labels
app mysql
spec
containers
image mysql8.0
name mysql
env
name MYSQL_ROOT_PASSWORD
valueFrom
secretKeyRef
name mysql-root-password
key password
ports
containerPort3306
name mysql
3. 使用命令 kubectl apply -f mysql-deployment.yaml
應用該 YAML 文件。
4. 使用命令 kubectl get pods
驗證 Pod 是否運行。
5. 通過啟動臨時 SQL Pod 來驗證 MySQL 連接。使用命令 kubectl run mysql-client --image=mysql:8.0 -it --rm -- bash
創建客戶端。
6. 使用命令 mysql -h mysql-service.default.svc.cluster.local -uroot -ppassword
在 Pod 內部連接到 MySQL。
步驟 2: 在 Kubernetes 上安裝 Crossplane
1. 使用 Helm 安裝 Crossplane:
kubectl create namespace crossplane-system
helm repo add crossplane-stable https://charts.crossplane.io/stable
helm repo update
helm install crossplane crossplane-stable/crossplane --namespace crossplane-system
注意: Crossplane 需要幾分鐘才能啟動。
2. 使用命令 kubectl get pods -n crossplane-system
驗證 Crossplane 的安裝。
步驟 3: 安裝 Crossplane SQL 提供者
1. 使用以下 YAML 內容定義一個 MySQL 提供者。
apiVersion pkg.crossplane.io/v1
kind Provider
metadata
name provider-sql
spec
package xpkg.upbound.io/crossplane-contrib/provider-sql v0.9.0
2. 使用命令 kubectl apply -f provider.yaml
創建提供者。
3. 使用以下命令驗證提供者: kubectl get pods -n crossplane-system
和 kubectl get providers
。
注意: SQL 提供者需要幾分鐘才能啟動。
步驟 4: 配置 Crossplane MySQL 提供者
提供者配置告訴 Crossplane 如何與 MySQL 進行身份驗證。根據下面的 YAML 更新要為提供者使用創建的密鑰。使用 kubectl apply -f mysql-secret.yaml
應用 YAML。
apiVersion v1
kind Secret
metadata
name mysql-conn-secret
namespace default
type Opaque
stringData
credentials"root:password@tcp(mysql-service.default.svc.cluster.local:3306)"
username"root"
password"password"
endpoint"mysql-service.default.svc.cluster.local"
port"3306"
應用以下提供者配置給 Crossplane,該配置使用上面的密鑰。使用命令 kubectl apply -f providerconfig.yaml
應用它。
apiVersion mysql.sql.crossplane.io/v1alpha1
kind ProviderConfig
metadata
name mysql-provider
spec
credentials
source MySQLConnectionSecret
connectionSecretRef
name mysql-conn-secret
namespace default
使用命令驗證提供者配置的創建 — kubectl get providerconfigs.mysql.sql.crossplane.io
和 kubectl get crds | grep providerconfig
。
步驟 5. 使用 Crossplane 創建 MySQL 數據庫
現在,使用Crossplane來配置一個新的數據庫。使用以下YAML文件,並應用kubectl apply -f mysqlinstance.yaml
命令。
apiVersion mysql.sql.crossplane.io/v1alpha1
kind Database
metadata
name my-database
spec
providerConfigRef
name mysql-provider
forProvider
binlog true
writeConnectionSecretToRef
name db-conn
namespace default
第6步: 驗證數據庫創建
使用命令kubectl get database.mysql.sql.crossplane.io/my-database
來驗證數據庫的創建。
使用步驟1中提到的相同驗證步驟來連接到MySQL,以驗證數據庫的創建。
通過上述步驟,您已安裝了Crossplane,配置了MySQL提供程序,並使用Crossplane配置了數據庫。
Terraform和Crossplane能夠一起工作嗎?
Terraform和Crossplane可以在許多情況下一起使用。
情況1
在完整的IaC情境中,Terraform可用於引導Kubernetes集群,然後Crossplane可用於從Kubernetes內部管理雲資源。Terraform也可以部署Crossplane本身。這種混合工作流範例可以
- Terraform在任何雲端提供商中配置Kubernetes集群。
- Crossplane通過Kubernetes CRD管理雲服務(數據庫、存儲和網絡)。
情況2
Crossplane 也支持 Terraform 提供者,可以用來在 Crossplane 的 IaC 模型中運行 Terraform 腳本。 在幾種情況下,運行 Terraform 提供者對於 Crossplane 來說可能非常有用,因為 Crossplane 的本地提供者尚未支持某些雲資源或功能。 以下是運行 Terraform 提供者為 Crossplane 的原因:
- Terraform 擁有龐大的提供者生態系統,支持許多 Crossplane 尚未具備本地提供者的雲服務。
- 當組織已經使用 Terraform 進行基礎架構管理時,沒有必要將所有內容重寫為 Crossplane CRD。
- Crossplane 支持多雲管理,但其本地提供者可能無法涵蓋每個本地或 SaaS 整合。
- 對於希望逐漸從 Terraform 過渡到 Crossplane 的組織,使用 Crossplane 內的 Terraform 提供者可以作為完全遷移之前的混合解決方案。
- 在 Crossplane 內運行 Terraform 將 Terraform 納入 Kubernetes 的聲明式 GitOps 模型。
使用 Crossplane 創建 IBM Cloud Cloudant DB 的步驟
步驟 1. 定義 Terraform 提供者。
apiVersion pkg.crossplane.io/v1
kind Provider
metadata
name provider-terraform
spec
package xpkg.upbound.io/upbound/provider-terraform v0.19.0
步驟 2. 配置提供者。
apiVersion tf.upbound.io/v1beta1
kind ProviderConfig
metadata
name terraform-provider-ibm
spec
步驟 3. 通過使用 Terraform 腳本的方式在 Crossplane 中為 IBM Cloud 預留 Cloudant DB。
apiVersion tf.upbound.io/v1beta1
kind Workspace
metadata
name ibm-cloudant-db
spec
providerConfigRef
name terraform-provider-ibm
writeConnectionSecretToRef
name ibmcloud-terraform-secret
namespace crossplane-system
forProvider
source Inline
module
terraform {
required_providers {
ibm = {
source = "IBM-Cloud/ibm"
}
}
backend "kubernetes" {
secret_suffix = "ibmcloud-terraform-secret"
namespace = "crossplane-system"
}
}
provider "ibm" {
ibmcloud_api_key = var.ibmcloud_api_key
}
resource "ibm_cloudant" "cloudant_instance" {
name = "crossplanecloudant"
location = "us-south"
plan = "lite"
}
variable "ibmcloud_api_key" {
type = string
}
vars
key ibmcloud_api_key
value"<Your IBM Cloud API Key>"
這將在 IBM Cloud 中預留一個名為 crossplanecloudant 的 Cloudant DB。
Crossplane 如何融入平台工程
平台工程侧重于构建和维护简化基础设施管理和应用部署的内部开发者平台(IDPs)。Crossplane 在此方面发挥着重要作用,通过实现基于 Kubernetes 的方法。
Crossplane 确保了云资源的声明式、自助式和基于策略的供应。Crossplane 的特性,如使用 K8s API 进行声明式基础设施、针对基础设施和应用的自定义抽象、安全和合规性防护、版本控制和自动化部署,以及持续漂移修正,有助于平台工程。
结论
Crossplane 通过将 IaC 引入 Kubernetes 生态系统改变了我们管理云基础设施的方式。Kubernetes API 实现了对云资源进行真正声明式和 GitOps 驱动的方法。如果您已经在使用 Kubernetes 并希望现代化您的 IaC 策略,那么值得探索 Crossplane。
Source:
https://dzone.com/articles/codify-cloud-kubernetes-crossplane-iac