Upgrade to Pro — share decks privately, control downloads, hide ads and more …

いろいろなAWSアカウントのArgo CDを統合した話

Ryo Sakamoto
September 12, 2023
770

いろいろなAWSアカウントのArgo CDを統合した話

Ryo Sakamoto

September 12, 2023
Tweet

Transcript

  1. Chatworkとは 5 効率的に情報共有できる グループチャット 仕事の見える化ができる タスク管理 見落としがなくなる ファイル管理 いつでも会議ができる ビデオ/音声通話

    * BOXIL SaaS AWARD 2022「ランキング部門 コラボレーション部門賞」「ベスト評価賞 (初期設定の容易さNo.1、価格の満足度No.1)」を受賞 BOXIL「Chatwork」口コミ評価 * Nielsen NetView 及びNielsen Mobile NetView Customized Report 2022年5月度調べ月次利用者(MAU:Monthly Active User)調査。 * 調査対象はChatwork、Microsoft Teams、Slack、LINE WORKS、Skypeを含む47サービスをChatwork株式会社にて選定。
  2. 統合前のArgo CDの環境 9 • 各EKSクラスタにArgo CDをインストール ◦ 導入当初、Argo CD自体の運用に慣れていなかったので、1番単純 な構成にしたかった

    • それぞれのArgo CDが別々のURLを持つ ◦ EKSのバージョンをURLに入れていたのでそれぐらいしか違いはな いが、AWSアカウントが違ったりすると、ドメインが違っていたり
  3. Argo CD統合の機運 12 • Argo CDのURLが固定しにくい ◦ ChatworkではEKSアップデートをBlue/Greenでやっているので、 クラスタが入れ替わりやすい •

    Github OAuth Appへの登録がつらい ◦ Argo CDの認証はGithubのユーザでSSOしている ◦ App作成のAPIがなく、手動でポチポチ • Argo CDは定常的な状態で運用したい ◦ 新規のEKSクラスタ作成時に既存のArgo CD経由でアプリケーショ ンを入れたい
  4. Argo CD統合の方針 14 • Argo CDのEKSクラスタ運用の負担を減らす ◦ prod/stg,testの2環境 ▪ AWSのクロスアカウントにも対応

    ◦ Blue/Greenではなく、インプレースでのアップグレード ▪ 可能な限り停止させないようにはするが、アプリケーションの EKSクラスタほどの可用性を担保しない
  5. AWSクロスアカウントへの対応 16 • Argo CDの操作権限のAWSクロスアカウントへの対応 ◦ Argo CDのPodはIRSAでRole付与 ◦ EKSクラスタは複数のAWSアカウントに存在している

    • Argo CDのplugin(helmfile)のAWSクロスアカウントへの対応 ◦ Chatworkではhelmfileを利用している ◦ https://github.com/chatwork/dockerfiles/tree/master/argocd-h elmfile-plugin ◦ helmfileの中でParameter Storeを参照して、クレデンシャルを含む helmfileをGit管理できるようにしている
  6. Argo CD plugin(helmfile)のAWSクロスアカウント対応 19 • Chatworkではhelmfileを利用している ◦ pluginのimageを公開 ▪ sidecar形式に対応

    ▪ https://github.com/chatwork/dockerfiles/tree/master/argoc d-helmfile-plugin • helmfileの中でParameter Storeを参照して、クレデンシャルを含む helmfileをGit管理できるようにしている
  7. helmfileの例(settings.yaml.gotmpl) datadog: apiKey: ref+awsssm://kubernetes/datadog/apiKey?region=XXX logLevel: {{ .Values.datadog.logLevel }} collectEvents: true

    clusterChecksRunner: enabled: true replicas: {{ .Values.datadog.clusterChecksRunner.replicas }} resources: {{- toYaml .Values.datadog.clusterChecksRunner.resources | nindent 4}} Parameter Storeのパス
  8. Argo CD plugin(helmfile)のAWSクロスアカウント対応 22 • 絵に書くとあっさりに見えますが ◦ Repo ServerがAssume Roleに対応していない

    ◦ helmfileがAssume Roleに対応していない ◦ Secrets Managerならクロスアカウントに対応しているけれど、 Parameter Storeの利用箇所を全箇所書き換え必要
  9. Argo CD plugin(helmfile)のAWSクロスアカウント対応 23 • pluginのスクリプトにはなんでも書ける! • 絵に書くとあっさりに見えますが ◦ Repo

    ServerがAssume Roleに対応していない ◦ helmfileがAssume Roleに対応していない ◦ Secrets Managerならクロスアカウントに対応しているけれど、 Parameter Storeの利用箇所を全箇所書き換え必要
  10. Argo CD plugin(helmfile)のAWSクロスアカウント対応 24 unset AWS_SESSION_TOKEN AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY; read AWS_ACCESS_KEY_ID

    AWS_SECRET_ACCESS_KEY AWS_SESSION_TOKEN<<< $(aws sts assume-role --role-arn $ARGOCD_ENV_REPO_SERVER_IAM_ROLE_ARN --role-session-name argocd-reposerver --output json | jq -r '.Credentials | [.AccessKeyId ,.SecretAccessKey ,.SessionToken] | join(" ")' ); export AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY AWS_SESSION_TOKEN; env > /tmp/env; helmfile -q --environment $ARGOCD_ENV_HELMFILE_ENV template --include-crds --skip-tests • pluginのスクリプト部分に下記を記載(ワンライナーで)
  11. Argo CDのApplicationをどうやって管理するか 26 • 個別Argo CD時代は、App of Apps ◦ in-clusterしかなかったので、Applicationだけ

    ◦ ApplicationをApplicationで作成 ◦ App of Appsは なかなか大変 ▪ 本番はそれほど変わらないのでよいが、テスト環境とか自分が何 を触っているのか迷子になる • 統合Argo CDでは複数のクラスタを1つのArgo CDで管理するので、 ApplicationSetをテンプレートとして作成
  12. Argo CDのApplicationSetで考慮した点 27 • Cluster Generatorの採用とCluster Credentialへの対応 ◦ 新規のEKSクラスタ用のCluster Credentialをapplyすると、

    Applicationの作成まで自動 • applicationsetcontroller.policyの挙動 ◦ ApplicationSet -> Applicationを生成する際の挙動 ◦ いろいろなユースケースを考えてcreat-onlyに ▪ 2.8でApplicaitonSetごとに挙動を変えられるように🎉
  13. Argo CDのApplicationSetで考慮した点 28 • preserveResourcesOnDeletionの挙動 ◦ applicationを消した場合のK8sのリソースをどうするのかの設定 ◦ applicationを作り直したい(特に導入初期)ことがあり、このパラメー タの存在を知らず、test環境が全部消えた

    ▪ Argo CD自体もApplicationSetで管理しているので、自分で自分 を消し始めたり ▪ applicationsetcontroller.policyがsync && preserveResourcesOnDeletionがfalse(デフォルト)だと ApplicationSetを消すとK8sのリソースまで消えるので注意