チュートリアルFluxを使用したOCIアーティファクトのデプロイ
このチュートリアルでは、KubernetesマニフェストをOCIアーティファクトにパッケージ化し、Fluxを使用してクラスターにデプロイする方法を説明します。サンプルマニフェストプロジェクトをセットアップし、プロジェクトのコンテナレジストリにアーティファクトとしてマニフェストを保存するように設定し、アーティファクトを同期するように Flux を設定します。このセットアップにより、Flux が OCI イメージからの変更をピックアップする前に GitLab パイプラインで追加のステップを実行することができます。
このチュートリアルでは、公開プロジェクトからアプリケーションをデプロイします。非公開プロジェクトを追加したい場合は、プロジェクトデプロイトークンを作成する必要があります。
Flux を使用して OCI アーティファクトをデプロイするには、以下の手順に従います:
前提条件:
- FluxリポジトリがKubernetesクラスターに接続されていること。ゼロから始める場合は、Flux for GitOpsのセットアップを参照してください。
Kubernetesマニフェストリポジトリを作成します。
まず、Kubernetesマニフェスト用のリポジトリを作成します:
- GitLabで、
web-app-manifests
という新しいリポジトリを作成します。 -
web-app-manifests
に、src/nginx-deployment.yaml
という名前のファイルを以下の内容で追加します:apiVersion: apps/v1 kind: Deployment metadata: name: nginx spec: replicas: 1 template: spec: containers: - name: nginx image: nginx:1.14.2 ports: - containerPort: 80
-
web-app-manifests
に、src/kustomization.yaml
という名前のファイルを以下の内容で追加します:apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization resources: - nginx-deployment.yaml commonLabels: app: flux-oci-tutorial
マニフェスト・リポジトリを設定して OCI アーティファクトを作成します。
次に、マニフェストをOCIアーティファクトにパッケージするようにGitLab CI/CDを設定し、アーティファクトをGitLabコンテナレジストリにプッシュします:
-
web-app-manifests
のルートに、次のような内容の.gitlab-ci.yml
ファイルを作成し、プッシュします:package: stage: deploy image: name: fluxcd/flux-cli:v2.0.0-rc.1 entrypoint: [""] script: - mkdir -p manifests - kubectl kustomize ./src --output ./manifests - | flux push artifact oci://$CI_REGISTRY_IMAGE:latest \ --path="./manifests" \ --source="$CI_REPOSITORY_URL" \ --revision="$CI_COMMIT_SHORT_SHA" \ --creds="$CI_REGISTRY_USER:$CI_REGISTRY_PASSWORD" \ --annotations="org.opencontainers.image.url=$CI_PROJECT_URL" \ --annotations="org.opencontainers.image.title=$CI_PROJECT_NAME" \ --annotations="com.gitlab.job.id=$CI_JOB_ID" \ --annotations="com.gitlab.job.url=$CI_JOB_URL"
このファイルが GitLab にプッシュされると、
package
のジョブをひとつ持つ CI/CD パイプラインが作成されます。このジョブは-
kustomization.yaml
を使って最終的な Kubernetes マニフェストをレンダリングします。 - マニフェストをOCIアーティファクトにパッケージします。
- OCI アーティファクトをコンテナ レジストリにプッシュします。
パイプラインが完了したら、コンテナレジストリUIでOCIアーティファクトを確認できます。
-
アーティファクトを同期するためのFluxの設定
次に、web-app-manifests
リポジトリが生成したアーティファクトを同期するように Flux リポジトリを設定します。
設定するには、OCIRepository
リソースを作成します:
-
Fluxリポジトリのローカルクローンに、
clusters/my-cluster/web-app-manifests-source.yaml
という名前のファイルを以下の内容で追加します:apiVersion: source.toolkit.fluxcd.io/v1 kind: OCIRepository metadata: name: web-app-manifests namespace: flux-system spec: interval: 1m0s url: oci://registry.gitlab.com/gitlab-org/configure/examples/flux/web-app-manifests-oci ref: tag: latest
url
の部分は、web-app-manifests
プロジェクトのコンテナレジストリの URL に置き換えてください。 -
Fluxリポジトリのローカルクローンに、
clusters/my-cluster/web-app-manifests-kustomization.yaml
という名前のファイルを以下の内容で追加します:apiVersion: kustomize.toolkit.fluxcd.io/v1 kind: Kustomization metadata: name: nginx-source-kustomization namespace: flux-system spec: interval: 1m0s path: ./ prune: true sourceRef: kind: OCIRepository name: web-app-manifests targetNamespace: default
このファイルは、レジストリから取得したアーティファクトのマニフェストを同期するように Flux に指示するKustomizationリソースを追加します。
-
新しいファイルをコミットしてプッシュします。
設定の確認
クラスターに新しく作成されたnginx
ポッドが表示されているはずです。
デプロイの同期をもう一度確認したい場合は、src/nginx-deployment.yaml
ファイルのレプリカ数を更新し、デフォルトブランチにプッシュしてみてください。すべてがうまくいっていれば、パイプラインが終了したときに変更がクラスターに同期されるはずです。
おめでとうございます!アプリケーションをデプロイし、変更を同期するプロジェクトの設定に成功しました!