チュートリアルFluxを使用したOCIアーティファクトのデプロイ

このチュートリアルでは、KubernetesマニフェストをOCIアーティファクトにパッケージ化し、Fluxを使用してクラスターにデプロイする方法を説明します。サンプルマニフェストプロジェクトをセットアップし、プロジェクトのコンテナレジストリにアーティファクトとしてマニフェストを保存するように設定し、アーティファクトを同期するように Flux を設定します。このセットアップにより、Flux が OCI イメージからの変更をピックアップする前に GitLab パイプラインで追加のステップを実行することができます。

このチュートリアルでは、公開プロジェクトからアプリケーションをデプロイします。非公開プロジェクトを追加したい場合は、プロジェクトデプロイトークンを作成する必要があります。

Flux を使用して OCI アーティファクトをデプロイするには、以下の手順に従います:

  1. Kubernetesマニフェストリポジトリを作成します。
  2. マニフェストリポジトリを設定してOCIアーティファクトを作成します。
  3. アーティファクトを同期するようにFluxを設定します。
  4. 設定の検証

前提条件:

Kubernetesマニフェストリポジトリを作成します。

まず、Kubernetesマニフェスト用のリポジトリを作成します:

  1. GitLabで、web-app-manifests という新しいリポジトリを作成します。
  2. 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
    
  3. 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コンテナレジストリにプッシュします:

  1. 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 リソースを作成します:

  1. 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 に置き換えてください。

  2. 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リソースを追加します。

  3. 新しいファイルをコミットしてプッシュします。

設定の確認

クラスターに新しく作成されたnginx ポッドが表示されているはずです。

デプロイの同期をもう一度確認したい場合は、src/nginx-deployment.yaml ファイルのレプリカ数を更新し、デフォルトブランチにプッシュしてみてください。すべてがうまくいっていれば、パイプラインが終了したときに変更がクラスターに同期されるはずです。

おめでとうございます!アプリケーションをデプロイし、変更を同期するプロジェクトの設定に成功しました!