組織がクラウドネイティブアプリケーション向けにKubernetesを採用するにつれて、インフラストラクチャを効率的に管理することが難しくなります。Terraform、Pulumiなどの従来のインフラストラクチャコード(IaC)ツールは宣言型の構成を提供しますが、Kubernetesネイティブのワークフローにシームレスに統合されていません。
Crossplaneは、このような状況でKubernetesとクラウドインフラストラクチャとの間のギャップを効果的に埋めるものです。このブログでは、CrossplaneがKubernetesおよびそれ以上のためにIaCをどのように可能にするかを探求します。
Crossplaneとは何か?
Crossplaneは、Kubernetesのオープンソースアドオンであり、KubernetesのCustom Resource Definitions(CRD)およびKubernetes APIを使用してクラウドインフラストラクチャをプロビジョニングおよび管理できるようにします。Terraformスクリプトが外部で実行されるように従来のIaCツールとは異なり、Crossplaneはインフラストラクチャ管理をKubernetesに埋め込んでいます。これにより、真に宣言型でGitOpsに対応しています。
ユースケース:Terraform vs. Crossplane
いつTerraformを使用するか?
- Kubernetesの外でインフラストラクチャを管理するのに最適
- 従来のマルチクラウド展開やVMに最適
- 幅広いモジュールやプロバイダを備えた強力なエコシステム
- Ansible、Packer、Vaultなどのツールとの組み合わせに適しています
Crossplaneの使用タイミング
- Kubernetes中心の環境に最適
- GitOpsワークフローに最適(ArgoCD、Flux)
- Kubernetes CRDを介したセルフサービスプロビジョニングを可能にする
- クラウドサービスをK8s API経由で管理するマルチクラウドKubernetes制御に適しています
Crossplaneを使用開始する方法
このサンプルでは、minikubeを使用します。ただし、同じ手順は任意のKubernetesに適用できます。
ステップ1:KubernetesでMySQLを展開する
1. Crossplaneを使用して構成するためのサービス付きのDeploymentとしてMySQLを展開します。別の場所から展開されたMySQLを使用することもできます。
2. MySQLデプロイメントを実行するには、シークレット、デプロイメント、およびサービスを作成するmysql-deployment.yaml
を定義します。
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. YAMLファイルを適用するには、kubectl apply -f mysql-deployment.yaml
コマンドを使用します。
4. ポッドが稼働していることを確認するには、kubectl get pods
コマンドを使用します。
5. MySQLデプロイメントを確認するために一時的なSQLポッドを起動して、MySQL接続を確認します。クライアントを作成するには、kubectl run mysql-client --image=mysql:8.0 -it --rm -- bash
コマンドを使用します。
6. ポッド内でMySQLに接続するには、mysql -h mysql-service.default.svc.cluster.local -uroot -ppassword
コマンドを使用します。
ステップ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. 次のコマンドを使用して、Crossplaneのインストールを確認します:kubectl get pods -n crossplane-system
。
ステップ3: SQL用のCrossplaneプロバイダをインストールする
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内のstringData
を適切に更新します。次のコマンドを使用してYAMLを適用します:kubectl apply -f mysql-secret.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
を使用してデータベースの作成を確認してください。
データベースの作成を確認するためにMySQLに接続するためのステップ1で述べられた同じ確認手順を使用してください。
上記の手順で、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スクリプトを実行するために使用できます。 Crossplaneのネイティブプロバイダーがまだ特定のクラウドリソースや機能をサポートしていないシナリオでは、CrossplaneのためにTerraformプロバイダーを実行することが役立ちます。 CrossplaneのTerraformプロバイダーを実行する理由は以下の通りです:
- 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. Crossplaneの一部としてTerraformスクリプトを使用して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がプラットフォームエンジニアリングにどのように適合するか
プラットフォームエンジニアリングは、インフラストラクチャ管理やアプリケーション展開を簡素化する内部開発者プラットフォーム(IDP)の構築と維持に焦点を当てています。Crossplaneは、Kubernetesネイティブアプローチを可能にすることで、これに大きな役割を果たしています。
Crossplaneは、クラウドリソースの宣言的、セルフサービス、ポリシードリブンなプロビジョニングを保証します。K8s APIを使用した宣言的インフラストラクチャ、インフラとアプリケーションのためのカスタム抽象化、セキュリティおよびコンプライアンスの保護、バージョン管理された自動デプロイメント、および継続的なドリフト修正などのCrossplaneの機能がプラットフォームエンジニアリングを支援します。
結論
Crossplaneは、IaCをKubernetesエコシステムに取り込むことで、クラウドインフラストラクチャの管理方法を変革します。Kubernetes APIは、クラウドリソースのプロビジョニングと管理に対して真に宣言的でGitOps駆動のアプローチを可能にします。既にKubernetesを使用しており、IaC戦略を現代化したい場合は、Crossplaneを是非探ってみる価倀があります。
Source:
https://dzone.com/articles/codify-cloud-kubernetes-crossplane-iac