APC 技術ブログ

株式会社エーピーコミュニケーションズの技術ブログです。

株式会社 エーピーコミュニケーションズの技術ブログです。

AKSでGitOps(Flux v2)を使う(2)〜 Private Repositoryを利用する

今回はPrivate Repositoryの話

以前投稿した「AKSでGitOps(Flux v2)を使う(1)」の続きです。

今回はPrivate Repositoryの話になります。前回、GitRepositoryもHelmRepositoryもPublicに公開されているものを利用しました。 このため、認証など特に必要なくアクセスできました。しかし、実際にはPrivateなRepositoryを使うことも多いのではないでしょうか。

そうした場合にどのように設定すればよいか。今回はそうした点をご紹介していきたいと思います。

PrivateなHelm Repository

まずはHelm Repositoryのお話。ここで 以前の投稿「ACRでHelmチャートを共有する」の内容が活用されます。 ACRにHelmチャートをプッシュする方法については以前の投稿をご参照ください。

設定方法

1) Flux CLI Public RepositoryのときのようにYamlファイルで定義することもできますが、そうするとPrivateなリポジトリ名を Yamlファイルに記載しなければなりません。FluxのIaC定義ファイルのリポジトリがPrivateであれば問題ないのですが 今回はPublicなGit Repositoryに配置しているため、コマンドラインからHelmRepositoryの設定を投入したいと思います。

そのためにはFlux CLIをあらかじめローカルPCにインストールしておく必要があります。Fluxの公式ドキュメントを参考にインストールしてください。

fluxcd.io

2) ACRアクセス用サービスプリンシパルの登録

Helm RepositoryとなってるACRへアクセスするためのサービスプリンシパルを作成し、パスワードとユーザー名称を取得します。

SERVICE_PRINCIPAL_NAME=flux-demo-helm-registry
ACR_REGISTRY_ID=$(az acr show --name $ACR_NAME --query id --output tsv)
PASSWORD=$(az ad sp create-for-rbac --name $SERVICE_PRINCIPAL_NAME \
          --scopes $(az acr show --name $ACR_NAME --query id --output tsv) \
           --role acrpull \
          --query "password" --output tsv)
USER_NAME=$(az ad sp list --display-name $SERVICE_PRINCIPAL_NAME --query "[].appId" --output tsv)

3)Kubernetes Secretにユーザー名称とパスワードを格納

今回は簡単にユーザー名称とパスワードをSecretに格納します。(名称を helmrepocred としています)

kubectl create namespace flux-config


# authentication for helm registry
# first, create secret
kubectl create secret docker-registry helmrepocred \
 --namespace flux-config \
 --docker-server=$ACR_NAME.azurecr.io \
 --docker-username=$USER_NAME \
 --docker-password=$PASSWORD

4) FluxのHelmRepositoryを作成

acr-helmという名称でHelmRepositoryを登録します。 --secret-refには上で作成したSecretの名称を指定します。

flux create source helm acr-helm \
  --url=oci://$ACR_NAME.azurecr.io/helm \
  --namespace flux-config \
  --secret-ref=helmrepocred

5)HelmReleaseでHelmRepositoryを参照する

これで公開したくない情報の登録は完了です。あとはHelm ReleaseでこのHelmRepositoryを参照すればアクセスできるようになります。

apiVersion: helm.toolkit.fluxcd.io/v2beta1
kind: HelmRelease
metadata:
  name: aggregator
  namespace: flux-config
spec:
  targetNamespace: apps
  releaseName: aggregator
  chart:
    spec:
      chart: spring-boot-app
      version: 0.1.1
      sourceRef:                              #作成したHelm Repositoryを参照
        kind: HelmRepository
        name: acr-helm
        namespace: flux-config
  interval: 15m0s
  install:
    remediation:
      retries: 3
  values:
    image:
      repository: turtle2005/aggregator
      tag: 1.0.0
    service:
      type: LoadBalancer
    env:
    - name: TIMEFEED_HOST
      value: http://timefeed:8080  
    replicaCount: 3

PrivateなGit Repository

まずはGit Repositoryのお話。

今回はGitHubを使っています。

設定方法

1) GitHubのPAT(Personal Access Token)の取得

GitHubへのアクセスにはSSH等他のやり方もあると思いますが、この事例ではGitHubのPATを利用しています。

PATの作成方法はGitHubの公式ページをご確認ください。

作成したら環境変数にユーザー名と生成したトークンを設定します。

GITHUB_USER="Put your account"
GITHUB_TOKEN="Put your PAT here"

2)Kubernetes Secretにユーザー名とトークンを格納

HelmRepository同様、情報をKubernetesのSecretに格納します。名称を sampleappscred としています。

kubectl create secret generic sampleappscred \
 --namespace flux-config \
 --from-literal=username="$GITHUB_USER" \
 --from-literal=password="$GITHUB_TOKEN"

3) FluxのGitRepositoryを作成

GitRepositoryの指定を行います。 --urlの部分にPrivate のリポジトリを指定します。--secret-refには上で作ったSecret名称を指定します。

flux create source git sample-apps-private \
  --url=<put your private repo> \
  --namespace flux-config \
  --branch=main \
  --secret-ref=sampleappscred

4)Kustomization等で指定する

こちらも秘匿情報の登録は完了です。あとは作成したGitRepositoryを参照すればOKです。

apiVersion: kustomize.toolkit.fluxcd.io/v1beta2
kind: Kustomization
metadata:
  name: flux-config-aggregator
spec:
  interval: 5m
  targetNamespace: flux-config
  sourceRef:
    kind: GitRepository
    name: sample-apps-private                      # 上で作成したGitRepository名を指定する
  path: ./deploy/aggregator/production
  prune: true

デプロイ

これまでのサンプルで上記指定を行い、アプリケーションがデプロイされるようになりました。

ここまでくれば通常のアプリケーション環境でFluxによるGitOpsが実現できるようになると思います。

FluxにはNotificationやタグやSemVerを用いた更新のフィルタリングなど多くの機能がまだあります。 機会があればそうした機能もいずれご紹介できればと思います。

最後に

私達のチームでは、Azure・AKSを活用したシステムのSIや内製化のお手伝いをさせていただいております。 Azureやコンテナ技術の知見を持つエンジニアが対応いたします。ご相談等ありましたらぜひご連絡ください。