チュートリアルFlux を使った Git リポジトリのデプロイ

このチュートリアルでは、Flux を使ってアプリケーションをビルドして Kubernetes クラスターにデプロイする GitLab プロジェクトを作成します。サンプルのマニフェストプロジェクトを設定し、マニフェストをデプロイブランチにプッシュするように設定し、デプロイブランチを同期するように Flux を設定します。この設定により、Flux がリポジトリから変更を取り込む前に GitLab パイプラインで追加のステップを実行することができます。

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

GitOpsデプロイ用のリポジトリをセットアップするには:

  1. Kubernetesマニフェストリポジトリを作成します。
  2. デプロイ用のブランチを作成します。
  3. ブランチにプッシュするようにGitLab CI/CDを設定します。
  4. マニフェストを同期するためにFluxを設定します。
  5. 設定の検証

前提条件:

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-branches-tutorial
    

デプロイ・ブランチを作成します。

次に、クラスターの現在の状態を反映するブランチを作成します。

このワークフローでは、デフォルトブランチがアプリケーションの単一のソースとなります。Kubernetesクラスタに反映させるには、コードや設定の変更がデフォルトブランチに存在する必要があります。後のステップで、デフォルトブランチからの変更をデプロイブランチにマージするようにCI/CDを設定します。

デプロイブランチを作成するには

  1. web-app-manifests で、デフォルトブランチから_gitlab/deploy/example という名前のブランチを作成します。この例では、デプロイブランチを機能ブランチと区別するためにブランチ名を指定していますが、これは必須ではありません。デプロイメントブランチには好きな名前を付けることができます。
  2. write_repository スコープでプロジェクトグループ、または個人のアクセストークンを作成します。
  3. DEPLOYMENT_TOKEN という名前のトークン値を持つCI/CD 変数を作成します。ジョブログに表示されないように、値をマスクすることを忘れないでください。
  4. 次の値でデプロイブランチを保護するルールを追加します:

    • マージを許可します:誰も
    • プッシュとマージを許可します:前のステップで作成したトークン、または個人アクセストークンを作成した場合はユーザーを選択します。
    • 強制プッシュを許可します:トグルをオフにします。
    • コードオーナーの承認が必要:トグルをオフにします。

この設定により、対応するトークンだけがブランチにプッシュできるようになります。

これで、保護されたデプロイブランチを持つリポジトリが作成できました!

ブランチにプッシュするように GitLab CI/CD を設定します。

次に、デフォルトブランチからの変更をデプロイブランチにマージするように CI/CD を設定します。

web-app-manifests のルートに、次のような内容の.gitlab-ci.yml ファイルを作成し、プッシュします:

deploy:
  stage: deploy
  environment: production
  variables:
    DEPLOYMENT_BRANCH: _gitlab/deploy/example
  script:
    - |
      git config user.name "Deploy Example Bot"
      git config user.email "test@example.com"
      git fetch origin $DEPLOYMENT_BRANCH
      git checkout $DEPLOYMENT_BRANCH
      git merge $CI_COMMIT_SHA --ff-only
      git push https://deploy:$DEPLOYMENT_TOKEN@$CI_SERVER_HOST/$CI_PROJECT_PATH.git HEAD:$DEPLOYMENT_BRANCH
  resource_group: $CI_ENVIRONMENT_SLUG

これにより、単一のdeploy ジョブを持つ CI/CD パイプラインが作成されます:

  1. デプロイブランチをチェックアウトします。
  2. デフォルトブランチからの新しい変更をデプロイブランチにマージします。
  3. 設定されたトークンで変更をリポジトリにプッシュします。

マニフェストを同期するための Flux の設定

次に、web-app-manifests リポジトリによってデプロイブランチが同期されるように Flux リポジトリを設定します。

設定するには、GitRepository リソースを作成します:

  1. Fluxリポジトリのローカルクローンに、clusters/my-cluster/web-app-manifests-source.yaml という名前のファイルを以下の内容で追加します:

    apiVersion: source.toolkit.fluxcd.io/v1
    kind: GitRepository
    metadata:
      name: web-app-manifests
      namespace: flux-system
    spec:
      interval: 5m0s
      url: https://gitlab.com/gitlab-org/configure/examples/flux/web-app-manifests-branches
      ref:
        branch: _gitlab/deploy/example
    

    urlweb-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: ./src
      prune: true
      sourceRef:
        kind: GitRepository
        name: web-app-manifests
      targetNamespace: default
    

    このファイルは、レジストリから取得したアーティファクトのマニフェストを同期するように Flux に指示するKustomizationリソースを追加します。

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

設定の確認

パイプラインが完了すると、クラスターに新しく作成されたnginx ポッドが表示されるはずです。

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

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