Flux CD Flux CD

GitRepository と Kustomization で最初のアプリケーションをデプロイする

Kustomization リソースを使って Flux を Git のマニフェストに向け、同期の様子を確認します。

12 min learn.level.初級

Flux は、クラスター内の他のものと同じように Kubernetes リソースで設定します。そのうちの 2 つが、仕事の大半を担います。GitRepository のような source は設定の場所を示し、Kustomization は「その source のこのパスにあるマニフェストを取得し、このクラスターに適用し続ける」ことを示します。このガイドでは、小さなアプリケーションをデプロイし、Git を変更して同期が行われる様子を確認します。Flux が fleet-infra リポジトリに bootstrap 済みであることを前提としています(前のガイドを参照)。

マニフェストを準備する

fleet-infra の clone に、bootstrap が作成した clusters フォルダーと並べて、アプリケーションのフォルダーを追加します。

fleet-infra/
├── clusters/
│   └── dev/
│       ├── flux-system/        # bootstrap によって作成
│       └── webapp.yaml         # Flux の Kustomization(次のセクション)
└── apps/
    └── webapp/
        ├── namespace.yaml
        ├── deployment.yaml
        └── service.yaml

apps/webapp/namespace.yaml:

apiVersion: v1
kind: Namespace
metadata:
  name: webapp

apps/webapp/deployment.yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: webapp
  namespace: webapp
spec:
  replicas: 2
  selector:
    matchLabels:
      app: webapp
  template:
    metadata:
      labels:
        app: webapp
    spec:
      containers:
        - name: webapp
          image: nginx:1.25
          ports:
            - containerPort: 80

apps/webapp/service.yaml:

apiVersion: v1
kind: Service
metadata:
  name: webapp
  namespace: webapp
spec:
  selector:
    app: webapp
  ports:
    - port: 80
      targetPort: 80

一部のツールとは異なり、ここのマニフェストは namespace を明示的に指定しており、フォルダーには Flux が namespace を作成するように Namespace オブジェクトも含まれています。kustomization.yaml は不要です。フォルダーにそれが含まれていない場合、Flux はそこにあるすべての YAML ファイルのリストを構築します。

Flux の Kustomization を書く

bootstrap は、この同じリポジトリを指す flux-system という名前の GitRepository をすでに作成しているため、それを再利用できます。clusters/dev/webapp.yaml:

apiVersion: kustomize.toolkit.fluxcd.io/v1
kind: Kustomization
metadata:
  name: webapp
  namespace: flux-system
spec:
  interval: 10m
  sourceRef:
    kind: GitRepository
    name: flux-system
  path: ./apps/webapp
  prune: true
  wait: true
  timeout: 2m

重要なポイントは次のとおりです。

  • sourceRef は、望ましい状態の出所です。ここでは、bootstrap が設定した flux-system リポジトリです。
  • path は、適用する source 内のフォルダーです。
  • interval は、Git が変更されていなくても、Flux がマニフェストを再適用してドリフトを修正する頻度です。
  • prune: true は、Git から削除されたオブジェクトが、クラスターからも削除されることを意味します。設定しない限り、オフです。
  • wait と timeout は、成功を報告する前に、適用されたリソースが準備完了になるのを Flux に待たせます。

この YAML を手作業で書く代わりに、CLI で生成することもできます。

flux create kustomization webapp \
  --source=GitRepository/flux-system \
  --path=./apps/webapp \
  --prune=true --wait=true --timeout=2m --interval=10m \
  --export > clusters/dev/webapp.yaml

commit して、Flux に取り込ませる

git add -A
git commit -m "Add webapp"
git push

flux-system の Kustomization はすでに ./clusters/dev を監視しているため、次回の実行時に新しい webapp の Kustomization を見つけます。アプリケーションのために kubectl apply を実行することはありません。待たずに済ませるには、Flux に今すぐ Git を確認させます。

flux reconcile source git flux-system
flux get kustomizations --watch

デプロイを確認する

webapp の Kustomization が現れ、適用されたリビジョンを示すメッセージとともに Ready になります。クラスターを確認し、Flux が所有しているものを表示させます。

kubectl get all -n webapp
flux tree kustomization webapp

Git を変更して同期を確認する

apps/webapp/deployment.yaml を編集し、イメージを nginx:1.26 に変更して、commit して push します。Flux は GitRepository の間隔(bootstrap 後のデフォルトは 1 分)でリポジトリを取得し、変更を適用します。新しい ReplicaSet がロールアウトされます。確認します。

flux reconcile kustomization webapp --with-source
kubectl get deploy webapp -n webapp \
  -o jsonpath='{.spec.template.spec.containers[0].image}'; echo

これが一連の流れのすべてです。Git を編集すれば、Flux がクラスターを収束させます。この動作を制御する方法は、次のガイドで説明します。

別のリポジトリを使う

アプリケーションのマニフェストを bootstrap のリポジトリに置く必要はありません。別のリポジトリからデプロイするには、そのための GitRepository を作成し、Kustomization から参照します。

flux create source git webapp-config \
  --url=https://github.com/your-org/webapp-config \
  --branch=main --interval=1m \
  --export > clusters/dev/webapp-source.yaml

プライベートリポジトリの場合は、flux create secret git で認証情報を追加し、--secret-ref で参照するか、SSH の deploy key を使います。その後、Kustomization で sourceRef.name: webapp-config を設定します。

人気のガイド