フラミナル

考え方や調べたことを書き殴ります。IT技術系記事多め

ArgoCDのBestPracticeを意訳してみた

f:id:lirlia:20200414043748p:plain

サイト:Best Practices - Argo CD - Declarative GitOps CD for Kubernetes

リポジトリの分離

アプリケーションのコードとk8sのmanifestを管理するGitリポジトリは分けるべき

1. CIのビルドを無駄に走らせない

アプリのコードとk8sのmanifestは用途が別物である。アプリの品質担保のために行うCIにmanifestは不要だが、同じリポジトリにしていると無駄にCIが実施されてしまう。

2. 監査ログの簡潔化

監査の目的は変更を「どのよな変更がおこなわれたのか」をgitの履歴から追うことなので種類の違うものを混在させるべきではない

3. 複数のコードリポジトリでの単体アプリの存在

アプリは複数のGitリポジトリで構成されることが珍しくない。特にライフサイクルが異なるものが混在することがよくある。(マイクロサービスでは特に)

そのため1つのアプリコードのリポジトリでmanifestを管理するのは理にかなていない。

4. アクセスの分離

開発者はアプリの開発であって、同じ人間が本番環境にアクセスできる費用は必ずしもない。manifestを触れる人間を明確に分離すべきだ。

5. CIの無限ループ

CIパイプラインを自動化している場合に、manifestの変更をアプリのコードと同じリポジトリにpushすると無限ループが発生する場合がある。きちんと分けて発生を回避しよう。

命令的な内容はmanifestから外そう

すべてをGitで管理するといいつつも命令性のある動的なものについては管理しないようにすべき。

例えば「podのレプリカをいくつ作るのか?」という設定はpodが増減するたびにmanifestを変更するとcommitログが汚れてしまう。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  # do not include replicas in the manifests if you want replicas to be controlled by HPA
  # replicas: 1
  template:
    spec:
      containers:
      - image: nginx:1.7.9
        name: nginx
        ports:
        - containerPort: 80

そのため命令性のある動的なものについては管理対象外とすること。

本当に普遍なGitリビジョンのmanifestを確保する

例えばkustomizeをつかってこのようにGitリポジトリを指定する。

bases:
- github.com/argoproj/argo-cd//manifests/cluster-install

このときURLの先の情報は時期によって変わっている可能性がある。なぜならその時点のGitのHEAD情報はアップデートされているからだ。

だからGit TagやCommitハッシュなどを使い、本当に変わらないURLをきちんと指定すること。

bases:
- github.com/argoproj/argo-cd//manifests/cluster-install?ref=v0.11.1