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

ArgoCDとGitHub Self Hosted Runnerを使って リリース時間を1/4にした話

Ryo Sakamoto
November 24, 2022
1.7k

ArgoCDとGitHub Self Hosted Runnerを使って リリース時間を1/4にした話

CNDT 2022登壇資料

Ryo Sakamoto

November 24, 2022
Tweet

Transcript

  1. 自己紹介 4 • 坂本 諒 • SRE部所属 ◦ Kubernetesの管理やCIフローの整備など •

    趣味 ランニング ◦ 月200kmぐらい ◦ 昨日(11/20)ハーフマラソン走ってきました ▪ 90分6秒 ◦ 来月(12月)湘南国際マラソン参加予定
  2. Chatworkとは 6 効率的に情報共有できる グループチャット 仕事の見える化ができる タスク管理 見落としがなくなる ファイル管理 いつでも会議ができる ビデオ/音声通話

    * 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株式会社にて選定。
  3. Chatworkは利用者数No.1*のビジネスチャット 7 3月 リリース 10万社 突破! 20万社 突破! 導入社数 37万6000社以上!

    (2022年9月末日時点) 30万社 突破! * Nielsen NetView 及びNielsen Mobile NetView Customized Report 2022年5月度調べ月次利用者(MAU:Monthly Active User)調査。 * 調査対象はChatwork、Microsoft Teams、Slack、LINE WORKS、Skypeを含む47サービスをChatwork株式会社にて選定。
  4. ChatworkのアプリケーションのKubernetes利用 10 • Kubernetesの本番利用は2016年末から ◦ まずは新規アプリケーションでの採用 ◦ Kubernetesは現在ではEKSを利用 • 2020年にメイン(モノリス)のアプリケーションをKubernetesに移行

    ◦ PHPのレジェンドシステムをEC2からKubernetesに移行する話 そ の5 〜PHPアプリケーションをコンテナ化しよう〜 - Chatwork Creator's Note ◦ 詳細はブログに記載 • 2021年にほとんどのアプリケーションをKubernetesに移行
  5. Chatworkがリリースで使用しているツール 16 • Helm ◦ Kubernetesパッケージマネージャ ◦ 汎用性の高い記述にしてchartsも公開 ▪ https://github.com/chatwork/charts

    • Helmfile ◦ https://github.com/helmfile/helmfile ◦ prod/stgなど環境差異を吸収する • CircleCI/Github Actions • Jenkins/ArgoCD
  6. HelmとHelmfile 17 • Helmfile ◦ Helmをさらに宣言的/環境別に管理するためのOSS ▪ helmコマンドをyamlファイルで管理できる → GitOpsとの相性が良い

    ▪ 環境という概念があり、環境ごとの値が定義可能 Helmfileの場合 Helmの場合 helmコマンドをyaml化して GitOps! helm installコマンド のポチポチが必要
  7. Helmfileの機能 • デプロイに便利な機能 ◦ 環境定義 ◦ 複数チャートの依存関係を管理 ◦ AWS ParameterStore連携

    helmfile --environment prod apply prod values.yaml / ├── helmfile.yaml └── environments/ ├── values.yaml ├── prod.yaml └── test.yaml Helmfile prod.yaml helmfile --environment test apply values.yaml testyaml test
  8. helmfileの例(helmfile.yamlの1/2) environments: prod: values: - ./environments/values.yaml - ./environments/prod.yaml test: values:

    - ./environments/values.yaml - ./environments/test.yaml kubeVersion: {{ .Values.kubernetes.version }}
  9. helmfileの例(helmfile.yamlの1/2) environments: prod: values: - ./environments/values.yaml - ./environments/prod.yaml test: values:

    - ./environments/values.yaml - ./environments/test.yaml kubeVersion: {{ .Values.kubernetes.version }} 環境ごとの値の設定
  10. helmfileの例(helmfile.yamlの1/2) environments: prod: values: - ./environments/values.yaml - ./environments/prod.yaml test: values:

    - ./environments/values.yaml - ./environments/test.yaml kubeVersion: {{ .Values.kubernetes.version }} helmに渡すパラメータ
  11. helmfileの例(helmfile.yamlの2/2) releases: - name: "datadog-agent" namespace: "kube-system" chart: "datadog/datadog" version:

    "{{ .Values.datadog.version }}" values: - ./values/settings.yaml.gotmpl helmでリリースする内容
  12. helmfileの例(helmfile.yamlの2/2) releases: - name: "datadog-agent" namespace: "kube-system" chart: "datadog/datadog" version:

    "{{ .Values.datadog.version }}" values: - ./values/settings.yaml.gotmpl helmでリリースする内容 helmに渡すvaluesの go template
  13. 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}}
  14. 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のパス
  15. 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}} 環境固有の値が入る
  16. ArgoCDでhelmfileを使う 40 • helmfileを多用しているので、当然ArgoCDでもhelmfileを使いたい • ArgoCDにはpluginという仕組みがあって、自分で定義することが可能 ◦ helmfile -q --environment

    XXX template --include-crds --skip-tests ◦ ただしArgoCDのimageにコマンドが入っている必要 • 自分たちでimageを作成して公開 ◦ https://hub.docker.com/r/chatwork/argocd-helmfile
  17. CI/CDの流れ 47 Application k8s Config Charts ECR Kubernetes Cluster CI

    Pipeline CD Pipeline Push Build Update Push Manifest Out Of Sync Manifest A
  18. CI/CDの流れ 48 Application k8s Config Charts ECR Kubernetes Cluster Sync

    CI Pipeline CD Pipeline kubectl apply Manifest Push Update Push Build A
  19. ArgoCDへの移行の結果 49 • リソース問題はなくなって、並列でリリースできるようになったので、 かなりの時間短縮 • どのmanifestが出る・出ているのかGUIで確認可能 ◦ 本番は手動sync •

    ジョブの結果が見やすい ◦ Jenkins自体はスクリプトのエラー内容だけだったので、どこで失 敗したのかわかりにくい • ツール間の密結合解消 • ツール自体の再現性
  20. 移行中の話 51 • 試験環境では試したりしても、本番だけ微妙に条件が違ったりして、本番 のCI/CDフローでしか確認できないものがあり、ドキドキ • CircleCIで”なんでこの設定なのか?”の背景がわからず、右往左往 • ArgoCDの使い方講習会 ◦

    今回ArgoCDに移行したアプリケーションはかなり多くの人が関わるの で、毎週講習会&リリース実演会をやり、疑問点などを解消 ▪ 関わる人が多いのはまさにモノリスアプリケーションの大変なと ころ? ▪ Jenkinsとの並行稼動期間でもArgoCDで一度リリースした人が Jenkinsでリリースすることはなかった
  21. ArgoCD移行後のテスト環境のリリースの問題 53 • EKS上のテスト環境はAWSのサービスを使いたいときなどに利用 ◦ 諸事情によりテスト環境は全体で1つしかない... ▪ アプリケーション毎ではあるけれど • できるだけ早くテストを回したい

    ◦ imageだけを差し替えて何度も試したい • 本番用のインテグレーションは、CIの待ちだったり、ArgoCDのsync待 ちだったり、高速に回しにくい • image tagの設定をArgoCDの環境変数設定機能で入れているが、何回 もやると面倒
  22. CI/CDの流れ 56 Application k8s Config Charts ECR Kubernetes Cluster Sync

    CI Pipeline CD Pipeline kubectl apply Manifest Push Update Push Build A
  23. CI/CDの流れ 57 Application k8s Config Charts ECR Kubernetes Cluster Sync

    CI Pipeline CD Pipeline kubectl apply Manifest Push Push Build A Update?
  24. CIツールから直接Kubernetes(ArgoCD)に接続したくない 58 • Github ActionsなどはIPを固定できないので、api serverを外部公開す る必要がある • 公開しても大丈夫だと思うが、、閉じれるものは閉じたい •

    Github ActionsにはSelf Hosted Runnerというすばらしい仕組みが ◦ https://github.com/actions-runner-controller/actions-runner -controller ◦ これをアプリケーションと同じk8sクラスタで動かすことで解決
  25. Actions Runner Controller 59 • Github Actionsにもともとself-hostd runnerという仕組みがある ◦ https://docs.github.com/ja/actions/hosting-your-own-runner

    s/about-self-hosted-runners • ただ、自分でrunnerを動かすとなると、それなりに大変 ◦ ジョブのキューでスケールさせたい ◦ webhookで即時に反映させたい(そもそもpollingしたり) • このrunnerをk8sで動かすためのコントローラー ◦ “Self-Hosted Runners & Actions Runner Controller (ARC)を運用するこ と”(Track D 2022/11/21 14:20-15:00) ▪ https://event.cloudnativedays.jp/cndt2022/talks/1553
  26. CI/CDの流れ 62 Application k8s Config Charts ECR Kubernetes Cluster Sync

    CI Pipeline CD Pipeline kubectl apply Manifest A
  27. CI/CDの流れ 63 Application k8s Config Charts ECR Kubernetes Cluster Sync

    CI Pipeline CD Pipeline kubectl apply Manifest A R
  28. CI/CDの流れ 64 Application k8s Config Charts ECR Kubernetes Cluster Sync

    CI Pipeline CD Pipeline kubectl apply Manifest Push A R
  29. CI/CDの流れ 65 Application k8s Config Charts ECR Kubernetes Cluster Sync

    CI Pipeline CD Pipeline kubectl apply Manifest Push A R PR comment
  30. CI/CDの流れ 66 Application k8s Config Charts ECR Kubernetes Cluster Sync

    CI Pipeline CD Pipeline kubectl apply Manifest Push Push A R PR comment Build
  31. CI/CDの流れ 67 Application k8s Config Charts ECR Kubernetes Cluster Sync

    CI Pipeline CD Pipeline kubectl apply Manifest Push Push Build run_on Patch A R PR comment
  32. テスト環境のリリース改善は続く 70 • 諸事情により今はテスト環境が1つしかない.... ◦ 基本的にはイメージの差し替えのみを行う状態 • ArgoCD Pull Request

    Generatorを使ってPR毎のアプリケーションを 出せるようにしたい ◦ https://argo-cd.readthedocs.io/en/stable/operator-manual/a pplicationset/Generators-Pull-Request/
  33. まとめ 74 • 長年かわいがっていたJenkinsからArgoCDに移行 ◦ 最長で30分かかっていたのが(CI含めて)8分程度に短縮 ◦ 安定性の向上 • Dev側のリリースの心理的な負担が軽減

    ◦ リリース速度・品質の向上 • Github Actions self-hosted-runnerを導入して、安全にクラスタ内で CIを実行できるように ◦ テスト環境のリリース速度をさらに向上
  34. Chatworkその他のセッション 76 • Kubernetesとterraformのセキュリティ/ガバナンス向上委員会 with OPA ◦ Track D 2022/11/21

    13:20-14:00 ◦ Keisuke Furuya • SLO策定までの道とChaosEngineeringを使った最適解の見つけ方 ◦ Track A 2022/11/22 13:20-14:00 ◦ Shinya Sasaki