カーペンターGCPプロバイダーがプレビュー版で利用可能になり、Google Cloud Platform(GCP)上のKubernetesワークロードのインテリジェントなオートスケーリングが可能になりました。CloudPilot AIチームとコミュニティの協力により開発されたこのリリースは、カーペンターのマルチクラウド機能を拡張します。
⚠️ これはプレビューリリースであり、本番環境での使用はまだ推奨されていませんが、テストや実験には完全に機能します。
このチュートリアルでは、Helmチャートを使用してGCPプロバイダーをデプロイし、環境を構成し、ワークロードに基づいてGCPインスタンスを動的に起動するようにカーペンターをセットアップする方法を学びます。
前提条件
始める前に、以下が設定されていることを確認してください:
- カーペンターコントローラーがすでにインストールされている稼働中のGKEクラスター(カーペンターインストールガイドを参照)。
- GKEクラスターにアクセスするように構成されたkubectl。
- helm(v3+)がインストールされていること。
- カーペンターCRDがすでにクラスターにインストールされていること。
- GCP権限:カーペンターコントローラーとGCPプロバイダーは、インスタンス、サブネット、ディスクを作成するためのアクセス権が必要です。
GCP認証情報の準備
必要なAPIの有効化
カーペンターがコンピュートとKubernetesリソースを管理するために必要なGoogle Cloud APIを有効にします:
gcloud services enable compute.googleapis.com
gcloud services enable container.googleapis.com
サービスアカウントの作成と鍵のダウンロード
以下の役割を持つGCPサービスアカウントを作成します:
- Compute Admin
- Kubernetes Engine Admin
- Monitoring Admin
- Service Account User
これらの権限により、KarpenterはGCEインスタンスの管理、GKEメタデータへのアクセス、モニタリングメトリクスの報告が可能になります。
サービスアカウントを作成した後、JSONキーファイルを生成し、安全な場所に保存してください。このキーはKarpenterをGCP APIで認証するために使用されます。
クラスターシークレットの作成
GCPサービスアカウント認証情報を保存するためのKubernetesシークレットを作成します:
apiVersion: v1
kind: Secret
metadata:
name: karpenter-gcp-credentials
namespace: karpenter-system
type: Opaque
stringData:
key.json: |
{
"type": "service_account",
"project_id": "<your-project-id>",
"private_key_id": "<your-private-key-id>",
"private_key": "<your-private-key>",
"client_email": "<your-client-email>",
"client_id": "<your-client-id>",
"auth_uri": "https://accounts.google.com/o/oauth2/auth",
"token_uri": "https://oauth2.googleapis.com/token",
"auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
"client_x509_cert_url": "<your-client-x509-cert-url>",
"universe_domain": "googleapis.com"
}
上記をkarpenter-gcp-credentials.yaml
として保存し、クラスターに適用します:
kubectl create ns karpenter-system
kubectl apply -f karpenter-gcp-credentials.yaml
チャートのインストール
チャートをインストールする前に必要な環境変数を設定します:
export PROJECT_ID=<your-google-project-id>
export CLUSTER_NAME=<gke-cluster-name>
export REGION=<gke-region-name>
# Optional: Set the GCP service account email if you want to use a custom service account for the default node pool templates
export DEFAULT_NODEPOOL_SERVICE_ACCOUNT=<your-custom-service-account-email>
次に、このリポジトリをクローンし、以下のコマンドでチャートをインストールします:
helm upgrade karpenter charts/karpenter --install \
--namespace karpenter-system --create-namespace \
--set "controller.settings.projectID=${PROJECT_ID}" \
--set "controller.settings.region=${REGION}" \
--set "controller.settings.clusterName=${CLUSTER_NAME}" \
--wait
ノード作成のテスト
1. NodeClassとNodePoolの作成
以下のマニフェストを適用して、KarpenterがGCP上でノードをプロビジョニングする方法を定義します。前のステップで作成したサービスアカウントのメールアドレスで<service_account_email_created_before>
を置き換えてください。
cat > nodeclass.yaml <<EOF
apiVersion: karpenter.k8s.gcp/v1alpha1
kind: GCENodeClass
metadata:
name: default-example
spec:
serviceAccount: "<service_account_email_created_before>"
imageSelectorTerms:
- alias: ContainerOptimizedOS@latest
tags:
env: dev
EOF
kubectl apply -f nodeclass.yaml
cat > nodepool.yaml <<EOF
apiVersion: karpenter.sh/v1
kind: NodePool
metadata:
name: default-nodepool
spec:
weight: 10
template:
spec:
nodeClassRef:
name: default-example
kind: GCENodeClass
group: karpenter.k8s.gcp
requirements:
- key: "karpenter.sh/capacity-type"
operator: In
values: ["on-demand", "spot"]
- key: "karpenter.k8s.gcp/instance-family"
operator: In
values: ["n4-standard", "n2-standard", "e2"]
- key: "kubernetes.io/arch"
operator: In
values: ["amd64"]
- key: "topology.kubernetes.io/zone"
operator: In
values: ["us-central1-c", "us-central1-a", "us-central1-f", "us-central1-b"]
EOF
kubectl apply -f nodepool.yaml
2. ワークロードの作成
Karpenterが新しいノードをプロビジョニングするようトリガーするための簡単なワークロードをデプロイします:
cat > deployment.yaml <<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
name: inflate
spec:
replicas: 1
selector:
matchLabels:
app: inflate
template:
metadata:
labels:
app: inflate
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: karpenter.sh/capacity-type
operator: Exists
securityContext:
runAsUser: 1000
runAsGroup: 3000
fsGroup: 2000
containers:
- image: public.ecr.aws/eks-distro/kubernetes/pause:3.2
name: inflate
resources:
requests:
cpu: 250m
memory: 250Mi
securityContext:
allowPrivilegeEscalation: false
EOF
kubectl apply -f deployment.yaml
ワークロードが作成されたら、Karpenterがノードを正常にプロビジョニングしたかどうかを確認します:
$ kubectl get node
NAME STATUS ROLES AGE VERSION
gke-cluster-1-test-default-1c921401-kzbh Ready <none> 17d v1.32.4-gke.1415000
gke-cluster-1-test-default-84243800-v30f Ready <none> 17d v1.32.4-gke.1415000
gke-cluster-1-test-default-b4608681-5zq5 Ready <none> 17d v1.32.4-gke.1415000
karpenter-default-nodepool-sp86k Ready <none> 18s v1.32.4-gke.1415000
$ kubectl get nodeclaim
NAME TYPE CAPACITY ZONE NODE READY AGE
default-nodepool-sp86k e2-small spot us-central1-a karpenter-default-nodepool-sp86k True 46s
Karpenterによって作成されたノードには通常、karpenter.sh/provisioner-name
ラベルがあり、NodeClass
とNodePool
で定義されたテイントやラベルが含まれる場合があります。
コミュニティに参加する
質問、フィードバック、または開発の進捗を追いたいですか?
👉 Slackチャンネルに参加する
👉 またはDiscordに参加して、他の貢献者やユーザーと交流する
あなたのフィードバックは、Karpenterによるマルチクラウドオートスケーリングの未来を形作るのに役立ちます!