このページでは、Helm チャートを作成して Artifact Registry のリポジトリに push することで、Artifact Registry から Helm チャートを同期する方法について説明します。また、Helm リポジトリからチャートを同期するサンプル構成も含まれています。
Helm リポジトリから同期するように Config Sync を構成できます。Helm チャートを、 Google Cloudで推奨される Helm リポジトリである Artifact Registry に保存できます。この機能を使用するには、RootSync API と RepoSync API を有効にする必要があります。
Config Sync は
helm template
を使用し、Helm チャートをレンダリングするため、完全な Helm ライフサイクル管理はサポートしていません。
バンドルされている Helm と Kustomize のバージョンに、Config Sync のバージョンと、それにバンドルされている Kustomize と Helm のバージョンのリストが示されています。
始める前に
- アカウントにログインします Google Cloud を初めて使用する場合は、 Google Cloud アカウントを作成して、 実際のシナリオで Google プロダクトのパフォーマンスを評価してください。新規のお客様には、ワークロードの実行、テスト、デプロイができる無料クレジット $300 分を差し上げます。
-
Google Cloud CLI をインストールします。
-
外部 ID プロバイダ(IdP)を使用している場合は、まず連携 ID を使用して gcloud CLI にログインする必要があります。
-
gcloud CLI を初期化するには、次のコマンドを実行します:
gcloud init -
プロジェクトを Google Cloud 作成または選択します。
プロジェクトを選択または作成するために必要なロール
- プロジェクトを選択する: プロジェクトの選択に特定の IAM ロールは必要ありません。ロールが付与されているプロジェクトを選択できます。
-
プロジェクトを作成する: プロジェクトを作成するには、プロジェクト作成者ロール
(
roles/resourcemanager.projectCreator)が必要です。これにはresourcemanager.projects.create権限が含まれています。詳しくは、ロールを付与する方法をご覧ください。
-
プロジェクトを作成します。 Google Cloud
gcloud projects create PROJECT_ID
PROJECT_IDは、作成する Google Cloud プロジェクトの名前に置き換えます。 -
作成した Google Cloud プロジェクトを選択します。
gcloud config set project PROJECT_ID
PROJECT_IDは、 Google Cloud プロジェクトの名前に置き換えます。
GKE、Config Sync、Artifact Registry の API を有効にします。
API を有効にするために必要なロール
API を有効にするには、 権限を含む Service Usage 管理者 IAM ロール(
roles/serviceusage.serviceUsageAdmin)が必要です。serviceusage.services.enable詳しくは、ロールを付与する方法をご覧ください。gcloud services enable container.googleapis.com
anthosconfigmanagement.googleapis.com artifactregistry.googleapis.com -
Google Cloud CLI をインストールします。
-
外部 ID プロバイダ(IdP)を使用している場合は、まず連携 ID を使用して gcloud CLI にログインする必要があります。
-
gcloud CLI を初期化するには、次のコマンドを実行します:
gcloud init -
プロジェクトを Google Cloud 作成または選択します。
プロジェクトを選択または作成するために必要なロール
- プロジェクトを選択する: プロジェクトの選択に特定の IAM ロールは必要ありません。ロールが付与されているプロジェクトを選択できます。
-
プロジェクトを作成する: プロジェクトを作成するには、プロジェクト作成者ロール
(
roles/resourcemanager.projectCreator)が必要です。これにはresourcemanager.projects.create権限が含まれています。詳しくは、ロールを付与する方法をご覧ください。
-
プロジェクトを作成します。 Google Cloud
gcloud projects create PROJECT_ID
PROJECT_IDは、作成する Google Cloud プロジェクトの名前に置き換えます。 -
作成した Google Cloud プロジェクトを選択します。
gcloud config set project PROJECT_ID
PROJECT_IDは、 Google Cloud プロジェクトの名前に置き換えます。
GKE、Config Sync、Artifact Registry の API を有効にします。
API を有効にするために必要なロール
API を有効にするには、 権限を含む Service Usage 管理者 IAM ロール(
roles/serviceusage.serviceUsageAdmin)が必要です。serviceusage.services.enable詳しくは、ロールを付与する方法をご覧ください。gcloud services enable container.googleapis.com
anthosconfigmanagement.googleapis.com artifactregistry.googleapis.com - Config Sync の要件を満たし、最新バージョンの Config Sync を使用しているクラスタを作成するか、このクラスタにアクセスできることを確認します。
nomosCLI をインストールするか、最新バージョンにアップグレードします。- Helm 3.8.0 以降をインストールします。 以前のバージョンの Helm では、OCI 形式のチャートに対するサポートは 試験運用版です。
- クラスタで Workload Identity Federation for GKE を有効にします。
制限事項
信頼できる情報源の値を変更するだけでは、構成ファイル内の変更不可フィールドを変更することはできません。変更不可フィールドを更新する必要がある場合は、まず信頼できるソースで変更を行い、クラスタ内のオブジェクトを手動で削除します。Config Sync は、新しいフィールド値を使用してオブジェクトを再作成します。
次の Helm チャートには Job が含まれているため、Config Sync でのデプロイにはおすすめしません。
Config Sync での Job の使用が推奨されない理由について詳しくは、Config Sync を使用したジョブの管理を回避するをご覧ください。
Artifact Registry リポジトリを作成する
このセクションでは、Artifact Registry リポジトリを作成します。Artifact Registry リポジトリの作成の詳細については、リポジトリを作成するをご覧ください。
Artifact Registry API を有効にします。
gcloud services enable artifactregistry.googleapis.com --project=PROJECT_IDArtifact Registry リポジトリを作成します。
gcloud artifacts repositories create AR_REPO_NAME \ --repository-format=docker \ --location=AR_REGION \ --description="Config Sync Helm repo" \ --project=PROJECT_ID
次のように置き換えます。
PROJECT_ID: 組織のプロジェクト ID。AR_REPO_NAME: リポジトリの ID。AR_REGION: リポジトリのリージョンまたはマルチリージョン ロケーション。
次のセクションで使用される変数:
FLEET_HOST_PROJECT_ID: GKE の Workload Identity Federation for GKE を使用している場合は、PROJECT_IDと同じです。フリートの Workload Identity Federation for GKE を使用している場合は、クラスタが登録されているフリートのプロジェクト ID です。GSA_NAME: Artifact Registry への接続に使用するカスタム Google サービス アカウントの名前。KSA_NAME: Reconciler の Kubernetes サービス アカウント。- ルート リポジトリで、
RootSync名がroot-syncの場合は、root-reconcilerを追加します。それ以外の場合は、root-reconciler-ROOT_SYNC_NAMEを追加します。 - 名前空間リポジトリで、
RepoSync名がrepo-syncの場合はns-reconciler-NAMESPACEを追加します。それ以外の場合は、ns-reconciler-NAMESPACE-REPO_SYNC_NAME-REPO_SYNC_NAME_LENGTHを追加します。ここで、REPO_SYNC_NAME_LENGTHはREPO_SYNC_NAMEの文字数です。
- ルート リポジトリで、
読み取り権限を付与する
次の手順で、Kubernetes サービス アカウントを使用して Artifact Registry を認証します。
Workload Identity Federation for GKE プールを使用して、Artifact Registry 読み取り(roles/artifactregistry.reader)IAM ロールを Kubernetes サービス アカウントに付与します。
gcloud artifacts repositories add-iam-policy-binding AR_REPO_NAME \
--location=AR_REGION \
--member="serviceAccount:FLEET_HOST_PROJECT_ID.svc.id.goog[config-management-system/KSA_NAME]" \
--role=roles/artifactregistry.reader \
--project=PROJECT_ID
Helm チャートを Artifact Registry リポジトリに push する
このセクションでは、一般公開の Helm チャートをダウンロードして、Artifact Registry に push します。
mysql-9.3.1.tgzパッケージを一般公開の Helm リポジトリから取得し、ローカルにダウンロードします。helm pull mysql --repo https://charts.bitnami.com/bitnami --version 9.3.1アクセス トークンによる認証を行います。
Linux / macOS
gcloud auth print-access-token | helm registry login -u oauth2accesstoken \ --password-stdin https://AR_REGION-docker.pkg.devWindows
gcloud auth print-access-token ya29.8QEQIfY_... helm registry login -u oauth2accesstoken -p "ya29.8QEQIfY_..." \ https://AR_REGION-docker.pkg.dev/PROJECT_ID/AR_REPO_NAMEこのコマンドで、
oauth2accesstokenはアクセス トークンによる認証で使用するユーザー名、gcloud auth print-access-tokenはアクセス トークンを取得するコマンドです。アクセス トークンは認証用のパスワードです。アクセス トークンによる認証が最も安全な認証方法です。Helm チャートを Artifact Registry に push します。
helm push mysql-9.3.1.tgz oci://AR_REGION-docker.pkg.dev/PROJECT_ID/AR_REPO_NAME
Helm チャートから同期するように Config Sync を構成する
このセクションでは、RootSync オブジェクトを作成し、Helm チャートから同期するように Config Sync を構成します。
Helm チャートのデフォルト値をオーバーライドするには、spec.helm.values フィールドに値を指定するか、spec.helm.valuesFileRefs フィールドを使用して ConfigMap への参照を追加します。オプション フィールドの詳細については、Helm リポジトリの構成をご覧ください。
値
RootSync オブジェクトを一意の名前で作成します。
cat <<EOF>> ROOT_SYNC_NAME.yaml apiVersion: configsync.gke.io/v1beta1 kind: RootSync metadata: name: ROOT_SYNC_NAME namespace: config-management-system spec: sourceFormat: unstructured sourceType: helm helm: repo: oci://AR_REGION-docker.pkg.dev/PROJECT_ID/AR_REPO_NAME chart: mysql version: 9.3.1 releaseName: my-mysql namespace: test auth: k8sserviceaccount # Use the optional field spec.helm.values to override default values. # You can use the same format as the default values file to override # default values. values: image: pullPolicy: Always primary: resources: limits: cpu: 250m memory: 256Mi requests: cpu: 250m memory: 256Mi EOFROOT_SYNC_NAMEは、RootSync オブジェクトの名前に置き換えます。この名前はクラスタ内で一意で、26 文字以下にする必要があります。 Google Cloud コンソールまたは Google Cloud CLI を使用して Config Sync をインストールした場合は、root-sync以外の名前を選択します。この例では、リソースのテンプレートに
namespace: {{ .Release.Namespace }}が含まれているため、Helm チャートがtestNamespace にデプロイされています。helm.valuesを使用すると、デフォルト値をオーバーライドできます。オプション フィールドの詳細については、Helm リポジトリの構成をご覧ください。RootSync オブジェクトを適用します。
kubectl apply -f ROOT_SYNC_NAME.yamlConfig Sync がイメージから同期していることを確認します。
nomos status --contexts=$(kubectl config current-context)出力は次のようになります。
Connecting to clusters... *cluster-name -------------------- <root>:root-sync oci://AR_REGION-docker.pkg.dev/PROJECT_ID/AR_REPO_NAME/mysql:9.3.1 SYNCED 9.3.1 Managed resources: NAMESPACE NAME STATUS SOURCEHASH default configmap/my-mysql Current 9.3.1 default secret/my-mysql Current 9.3.1 default service/my-mysql Current 9.3.1 default service/my-mysql-headless Current 9.3.1 default serviceaccount/my-mysql Current 9.3.1 default statefulset.apps/my-mysql Current 9.3.1これで、Helm チャートがクラスタに正常に同期されました。
valuesFileRefs
RootSync オブジェクトを一意の名前で作成します。
cat <<EOF>> ROOT_SYNC_NAME.yaml apiVersion: configsync.gke.io/v1beta1 kind: RootSync metadata: name: ROOT_SYNC_NAME namespace: config-management-system spec: sourceFormat: unstructured sourceType: helm helm: repo: oci://AR_REGION-docker.pkg.dev/PROJECT_ID/AR_REPO_NAME chart: mysql version: 9.3.1 releaseName: my-mysql auth: k8sserviceaccount # use the optional field spec.helm.valuesFilesRefs to override default values # by referencing a ConfigMap valuesFileRefs: - name: CONFIGMAP_NAME dataKey: DATA_KEY EOF次のように置き換えます。
ROOT_SYNC_NAME: RootSync オブジェクトの名前。この名前はクラスタ内で一意で、26 文字以下にする必要があります。 Google Cloud コンソールまたは Google Cloud CLI を使用して Config Sync をインストールした場合は、root-sync以外の名前を選択します。CONFIGMAP_NAME: ConfigMap の名前。これには、Kubernetes で受け入れられ、クラスタ内で一意の有効な ConfigMap 名を指定できます。- (省略可)
DATA_KEY: 値を読み取る ConfigMap のデータキー。デフォルトはvalues.yamlです。
値を使用して ConfigMap オブジェクトを作成します。
cat <<EOF>> CONFIGMAP_NAME.yaml apiVersion: v1 kind: ConfigMap metadata: name: CONFIGMAP_NAME namespace: config-management-system immutable: true # You can use the same format as the default values file to override # default values. data: DATA_KEY: |- image: pullPolicy: Always primary: resources: limits: cpu: 250m memory: 256Mi requests: cpu: 250m memory: 256Mi EOFRootSync で
DATA_KEYの値を指定しない場合は、デフォルトのvalues.yamlになります。ConfigMap オブジェクトを適用します。
kubectl apply -f CONFIGMAP_NAME.yamlRootSync オブジェクトを適用します。
kubectl apply -f ROOT_SYNC_NAME.yamlConfig Sync がイメージから同期していることを確認します。
nomos status --contexts=$(kubectl config current-context)出力は次のようになります。
Connecting to clusters... *cluster-name -------------------- <root>:root-sync oci://AR_REGION-docker.pkg.dev/PROJECT_ID/AR_REPO_NAME/mysql:9.3.1 SYNCED 9.3.1 Managed resources: NAMESPACE NAME STATUS SOURCEHASH default configmap/my-mysql Current 9.3.1 default secret/my-mysql Current 9.3.1 default service/my-mysql Current 9.3.1 default service/my-mysql-headless Current 9.3.1 default serviceaccount/my-mysql Current 9.3.1 default statefulset.apps/my-mysql Current 9.3.1これで、Helm チャートがクラスタに正常に同期されました。
クラスタ内の同期されたリソースの
imagePullPolicyを確認して、ConfigMap の値がグラフのレンダリングに使用されたことを確認することもできます。kubectl get statefulset -n test my-mysql -o yaml | grep imagePullPolicyConfigMap は変更できません。値を変更するには、新しい ConfigMap を作成し、新しい ConfigMap を参照するように RootSync または RepoSync 仕様の
spec.helm.valuesFileRefsを更新する必要があります。新しい ConfigMap を作成すると、値が変更され Helm チャートが再レンダリングされます。これは、再レンダリング時にspec.helm.valuesFileRefsで参照されている複数の ConfigMap を同時に更新する必要がある場合に役立ちます。グラフのレンダリングに使用する値を変更するには、別の名前で新しい ConfigMap を作成します。cat <<EOF>> CONFIGMAP_NAME-2.yaml apiVersion: v1 kind: ConfigMap metadata: name: CONFIGMAP_NAME-2 namespace: config-management-system immutable: true # You can use the same format as the default values file to override # default values. data: DATA_KEY: |- image: pullPolicy: Never primary: resources: limits: cpu: 100m memory: 256Mi requests: cpu: 250m memory: 200Mi EOF新しい ConfigMap を参照するように RootSync オブジェクトを更新します。
cat <<EOF>> ROOT_SYNC_NAME.yaml apiVersion: configsync.gke.io/v1beta1 kind: RootSync metadata: name: ROOT_SYNC_NAME namespace: config-management-system spec: sourceFormat: unstructured sourceType: helm helm: repo: oci://AR_REGION-docker.pkg.dev/PROJECT_ID/AR_REPO_NAME chart: mysql version: 9.3.1 releaseName: my-mysql namespace: test auth: k8sserviceaccount # use the optional field spec.helm.valuesFilesRefs to override default values # by referencing a ConfigMap valuesFileRefs: - name: CONFIGMAP_NAME-2 dataKey: DATA_KEY EOFConfigMap オブジェクトを適用します。
kubectl apply -f CONFIGMAP_NAME-2.yamlRootSync オブジェクトを適用します。
kubectl apply -f ROOT_SYNC_NAME.yamlConfig Sync がイメージから同期していることを確認します。
nomos status --contexts=$(kubectl config current-context)クラスタ内の同期されたリソースの
imagePullPolicyを確認して、更新された ConfigMap の新しい値がグラフのレンダリングに使用されたことを確認することもできます。kubectl get statefulset -n test my-mysql -o yaml | grep imagePullPolicy
次のステップ
- Config Sync のインストールについて学習する。