Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

GitOps スタイルの継続的デリバリを構成する

GitOps は、Git を用いてリソース構成情報を宣言的に記述・管理し、その変更を自動でクラスタに適用する手法です。GitOps を取り入れることで、設定の変更点や履歴が明確に追跡可能となり、デプロイプロセスが自動化されることにより手作業が削減されます。

PFCP では、 Kubernetes 上の GitOps を実現する手段として Flux をマネージドサービスとして提供しています。Flux は、Kubernetes 上での GitOps を実現するために使用されるオープンソースの自動化ツールです。リポジトリ内の変更を監視し、それを自動的にクラスタに適用する役割を担います。以下では、実際に Flux を用いて GitOps を可能にする方法について紹介します。

Flux の導入と設定

以下では、単に「リポジトリ」といった際は GitHub リポジトリを指すものとします。

  1. ポータルのネームスペースにアクセスし、 Flux の Kubernetes リソースを利用するためのネームスペースを作成します。ここでは例として、 org-foo--flux というネームスペースを作成します。

  2. 作成した org-foo--flux Namespace に、 flux という名前の ServiceAccount を作成します。Flux はこの ServiceAccount を使用してマニフェストを適用します。 ServiceAccount に flux 以外の名前を設定すると動作しないので注意が必要です。

    kubectl create serviceaccount flux --namespace=org-foo--flux
    
  3. Flux によりマニフェストを適用したい Namespace から Flux が使用する org-foo--flux Namespace の Flux ServiceAccount に対して権限を付与します。

    kubectl create rolebinding flux \
       # Flux によってマニフェストを適用したい Namespace
       --namespace=org-foo--target \
       # Flux がマニフェストの適用に使用する権限
       --clusterrole=org-edit \
       # Flux がマニフェストの適用に使用する ServiceAccount
       --serviceaccount=org-foo--flux:flux
    

    Flux によってマニフェストを適用したい Namespace が複数ある場合には、それぞれの Namespace から同様に権限を付与する必要があります。

    org-admin が必要なリソースを管理したい場合

    --clusterrole=org-edit の部分は管理したいリソースの種類に合わせて変更してください。たとえば RoleBinding を Flux で管理したい場合は、flux ServiceAccount に org-admin を付与する必要があります。その場合、一般ユーザによる組織管理者権限を持つ flux ServiceAccount を使ったクラスタ操作を避けるために、必ず org-foo--flux namespace の使用者を組織管理者のみに限定してください。

  4. 以下のmanifest.yamlファイルを記述し、GitRepository リソースおよび Kustomization リソースを作成します。この例では、https://github.com/pfcomputing/hellomain ブランチに存在するマニフェストがクラスタに適用されます。

    apiVersion: source.toolkit.fluxcd.io/v1
    kind: GitRepository
    metadata:
      name: hello
      namespace: org-foo--flux
    spec:
      interval: 5m
      url: https://github.com/pfcomputing/hello
      ref:
        branch: main
    ---
    apiVersion: kustomize.toolkit.fluxcd.io/v1
    kind: Kustomization
    metadata:
      name: hello
      namespace: org-foo--flux
    spec:
      interval: 10m
      sourceRef:
        kind: GitRepository
        name: hello
      path: "./kustomize"
      prune: true
      timeout: 1m
    
  5. マニフェストを適用します。

    kubectl apply -f manifest.yaml
    

これらの手順により、設定したリポジトリに存在するマニフェストファイルとクラスタの状態が同期されます。

Flux におけるプライベート Git リポジトリの利用

パブリックなリポジトリだけでなく、プライベートなリポジトリを参照して GitOps を行うことも可能です。以下に手順を示します。

  1. Git リポジトリにアクセスするための Secret を作成します。

    export KEY_NAME=flux-ssh-key
    ssh-keygen -t ed25519 -f $KEY_NAME
    kubectl create secret generic flux-git-secret \
    --from-literal=known_hosts="$(ssh-keyscan github.com)" \
    --from-file=identity=$KEY_NAME
    
  2. cat $KEY_NAME.pub の結果を GitHub の該当リポジトリに読み取り権限を持つデプロイキーとして登録します(GitHub ドキュメント)。

  3. manifest.yaml GitRepository を以下のように編集します。

    • URL をプライベートなリポジトリに書き換え
    • spec.secretRef フィールドにname: flux-git-secret を指定
    apiVersion: source.toolkit.fluxcd.io/v1
    kind: GitRepository
    ...
    spec:
      ...
      url: # 利用したいプライベートリポジトリに書き換え
      secretRef: # フィールドを追加
        name: flux-git-secret
    
  4. マニフェストを適用します。

    kubectl apply -f manifest.yaml
    

これらの変更により、プライベートなリポジトリに存在するマニフェストとクラスタの状態が同期されます。

Flux は、GitHub 以外のリポジトリの使用や通知機能の利用なども可能です。より詳しくは以下をご確認ください。