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

2. ArgoCDによるGitopsとdeploy管理

F6df8bd336f1ff47494a43c68a562bfa?s=47 satokota
May 26, 2022
130

2. ArgoCDによるGitopsとdeploy管理

F6df8bd336f1ff47494a43c68a562bfa?s=128

satokota

May 26, 2022
Tweet

Transcript

  1. None
  2. 2 IBM Client Engineering / © 2022 IBM Corporation Name:

    米坂 武士 Company: 日本アイ・ビー・エム Dept: IBM Client Engineering Role: Cloud Engineer Joined: 2021年 Skills: CI/CD、IaC 前職からKubernetes NativeなCI/CDの構築・運用に携 わっており、現職でも社内でCI/CD関連研修の講師も務め ております。
  3. 3 IBM Client Engineering / © 2022 IBM Corporation CI

    / CDとは CI / CDの計画 CI / CDの実現 CI / CDの概念 CI / CDの重要性 実現するために押 さえておきたい技 術・知識 実現するための ツールの選定及び 実装
  4. 4 IBM Client Engineering / © 2022 IBM Corporation CI

    / CDとは CI / CDの計画 CI / CDの実現 CI / CDの概念 CI / CDの重要性 実現するために押 さえておきたい技 術・知識 実現するための ツールの選定及び 実装
  5. 5 IBM Client Engineering / © 2022 IBM Corporation 1

    GitOpsとは? 2 なぜArgoCDなのか? 3 ArgoCDのアーキテクチャ 4 ArgoCDの設定 5 ImageOpsとは? 6 まとめ
  6. GitOpsとは? IBM Client Engineering / © 2022 IBM Corporation

  7. 7 IBM Client Engineering / © 2022 IBM Corporation •

    GitOpsとはWeaveworks社が2017年にBlogで発表したCDの手法 参考:https://www.weave.works/blog/gitops-operations-by-pull-request [原文要約] • Gitを信頼出来る唯一の情報源として使用することで、バージョン管理、Peer Reviewを行いデプロイ・ロールバック等をkubectl等のCLIを利用する事なくGit を介して行う [少し噛み砕く] • インフラ(Kubernetes上のリソース)とアプリケーションの両方を含めたシステム 全体をコード化して、Gitで管理する Trust me!!
  8. 8 IBM Client Engineering / © 2022 IBM Corporation •

    以下のサイクルでOpenShift / Kubernetes上のリソースを管理すること - Gitへの変更をCommit - Pull Requestを作成 - Pull Requestを承認 - 承認された変更を適用
  9. 9 IBM Client Engineering / © 2022 IBM Corporation •

    運用者の目線で言うと下記の操作をgit pushで自動で行う手法 $ kubectl apply $ kustomize build $ helm upgrade $ git push
  10. 10 IBM Client Engineering / © 2022 IBM Corporation •

    生産性の向上 - Gitの操作によってkubernetesリソースを管理する事ができるため、アプリ ケーション開発と同様の変更プロセスを適用できる - 手動によるkubectl等のコマンドを実行する必要がなくなり、オペミスを排除 する事ができる • 可視性の向上 - Gitを見るだけで現在のClusterの構成が確認できる - 誰が・いつ・どのような変更を加えたのかがGitの履歴によりわかりやすくな る • ガバナンスの強化 - レビュープロセスを通すことで組織のガバナンスを適用する事が可能
  11. 11 IBM Client Engineering / © 2022 IBM Corporation Git

    Repo (Source Code) Git Repo (manifest) Image Repo CI Pipeline OpenShift Cluster / Kubernetes Cluster Code change & Push Build & Push Push new image tag Watch Deploy Manifest change & Push
  12. IBM Client Engineering / © 2022 IBM Corporation なぜArgoCDなのか?

  13. 13 IBM Client Engineering / © 2022 IBM Corporation Jenkinsとはどう

    違うのか?
  14. 14 IBM Client Engineering / © 2022 IBM Corporation Jenkinsは開発作業の自動

    化を目的としているので GitOpsという切り口で比 較するのは難しい・・・
  15. 15 IBM Client Engineering / © 2022 IBM Corporation Traditional

    Cloud-Native 任意の環境(物理、VM、コンテナ)で 利用可能 Kubernetes環境に特化 Pluginの利用は全体で共有される 完全に独立されている PipelineをJenkinsfileに記述 Native Kubernetes Resource (Custom Resource)
  16. 16 IBM Client Engineering / © 2022 IBM Corporation Traditional

    Cloud-Native 任意の環境(物理、VM、コンテナ)で 利用可能 Kubernetes環境に特化 Pluginの利用は全体で共有される 完全に独立されている PipelineをJenkinsfileに記述 Native Kubernetes Resource (Custom Resource) CRDで定義できるため、設定自体をGitOps で管理が可能 Jenkinsfileの定義や管理方法が煩雑になり がち
  17. 17 IBM Client Engineering / © 2022 IBM Corporation •

    Applatixが開発し、2018年にIntuitに買収さ れた • CNCFのインキュベーションプロジェクト • リッチなGUIが提供されており、閲覧だけで なく、登録/変更操作が可能 • Cluster内のResourceとGit Repoのmanifest のdiffを参照し同期する • SSO統合が可能(OIDC、OAuth2、LDAP、 GitHub、GitLab等)
  18. 18 IBM Client Engineering / © 2022 IBM Corporation •

    GitOpsを提唱したWeaveworks社が開発 • CNCFのインキュベーションプロジェクト • シンプルで軽量(GUIすらない) • Gitのhash値を参照し差分があれば同期する • ユーザー管理機能はなくRBACで制御 • 後発製品だけあってデフォルトで通知等の 便利なCRDが予め用意されている
  19. 19 IBM Client Engineering / © 2022 IBM Corporation ArgoCD

    Flux OperatorHub GUI Diffing Multi Tenancy Notice
  20. 20 IBM Client Engineering / © 2022 IBM Corporation ArgoCD

    Flux OperatorHub GUI Diffing Multi Tenancy Notice デフォルトの機能としてはないがア ドオンコンポーネントが用意されて いるので、追加が可能
  21. 21 IBM Client Engineering / © 2022 IBM Corporation ArgoCD

    Flux OperatorHub GUI Diffing Multi Tenancy Notice リッチなGUIとRedHatのサポートが 受けられる
  22. 22 IBM Client Engineering / © 2022 IBM Corporation

  23. 23 IBM Client Engineering / © 2022 IBM Corporation

  24. 24 IBM Client Engineering / © 2022 IBM Corporation

  25. 25 IBM Client Engineering / © 2022 IBM Corporation

  26. 26 IBM Client Engineering / © 2022 IBM Corporation なんらかの理由によりResourceが削除されてもGitの定義と実際のClusterの差分を検知し、

    再同期を自動で行う
  27. 27 IBM Client Engineering / © 2022 IBM Corporation •

    2019年11月にArgoCDとFluxは同じようなことをやってるから一緒にやって いくと発表 • GitOps Engineという仕組みでお互い共通化していき、不足している部分をカ バーしあっていくという働き
  28. 28 IBM Client Engineering / © 2022 IBM Corporation •

    しかし実際には統合はうまくいかなかった • Fluxがv2を提供するためにはGitOps Engineではダメと結論付けてGitOps Toolkit(後のFlux2)を開発する道を選ぶ • ArgoCDはArgoCDと並行してGitOps Engineを継続開発する
  29. ArgoCDのアーキテクチャ IBM Client Engineering / © 2022 IBM Corporation

  30. 30 IBM Client Engineering / © 2022 IBM Corporation ArgoCDはGitOpsのための概念及びResource、Componentで実現されている

    https://argo-cd.readthedocs.io/en/stable/operator-manual/architecture/ • 概念 - Live State - Target State • Resource - Application - AppProject • Component - API Server - Application Controller - Repository Server
  31. 31 IBM Client Engineering / © 2022 IBM Corporation Git

    Repository Server Application Controller Webhook Event Call Generate manifest Compare State Deploy Get manifest GUI CLI API Server AppProject Application AppProject Application Application Get & Monitor Update State
  32. 32 IBM Client Engineering / © 2022 IBM Corporation •

    Live State - Cluster上の実際の状態 • Target State - Git Repoに定義されている manifestの状態
  33. 33 IBM Client Engineering / © 2022 IBM Corporation •

    Application - CRDによって定義される Resource - 必ずいずれかのAppProjectに 所属している - 主に以下を定義する – manifestを取得するGit Repo – Deploy先のCluster及び namespace – 自動同期の有効化 - 1Service = 1Applicationがおす すめ
  34. 34 IBM Client Engineering / © 2022 IBM Corporation •

    AppProject - CRDによって定義される Resource - Applicationを論理的にグループ 化し、複数のApplicationが所属 - 所属するApplicationに対して以 下の機能を提供 – 対象となるGit Repoを制限 – Deploy先を制限(Cluster及 びnamespace) – Deploy可能なResourceを制 限(Deployment、CRD、 DaemonSetsなど) – 権限の管理
  35. 35 IBM Client Engineering / © 2022 IBM Corporation •

    API Server - gRPC / REST APIを受けとる Server - Applicationとステータスの管 理 - Application操作の呼び出し - Git / Clusterの認証情報の管理 - 外部Identity Providersとの認証 認可の権限委譲
  36. 36 IBM Client Engineering / © 2022 IBM Corporation •

    Repository Server - /tmp 配下にRepositoryを Cloneする - ローカルキャッシュを維持 - 下記の要素が入力されれば manifestを(templateの場合は 生成して)返却 – Git Repo URL – Revision – manifest path
  37. 37 IBM Client Engineering / © 2022 IBM Corporation •

    Application Controller - Kubernetes Controllerとして動 作 - Live StateとTarget Stateを比較 - Repository Serverからmanifest を取得しClusterに反映
  38. 38 IBM Client Engineering / © 2022 IBM Corporation •

    Argo Workflow - Kubernetes-nativeなワークフローエンジン - 機械学習やデータ処理のため計算集約的なジョブを短時間で実行 • Argo Rollouts - Canary Release、Blue Green Deployなどの高度なDeploy戦略が可能 • Argo Events - イベント駆動型自動化フレームワーク - EventSource(どこからの情報を受け取るのか)とSensor(何を実行するのか)を 自由に組み合わせる
  39. ArgoCDの設定 IBM Client Engineering / © 2022 IBM Corporation

  40. 40 IBM Client Engineering / © 2022 IBM Corporation •

    Git Repoの設定 • AppProjectの設定 • Applicationの設定 ※CLIのインストール https://argo-cd.readthedocs.io/en/stable/cli_installation/
  41. 41 IBM Client Engineering / © 2022 IBM Corporation GUIから設定

    Settings -> Repositories(HTTPS / SSH / GitHub Appから選択) <HTTPS> <SSH> AppProjectに紐付ける場合は定義 Git RepoのURLを定義 認証がある場合はusername / passwordを定義 AppProjectに紐付ける場合は定義 Git RepoのURLを定義 鍵認証がある場合は、秘密鍵を定義
  42. 42 IBM Client Engineering / © 2022 IBM Corporation SecretをGit上で管理することは好ましくないので

    SealedSecretを使い暗号化する事を推奨 参考: https://github.com/bitnami-labs/sealed-secrets Git Repoの情報はSecretに保存されるため、詳細情報を含むSecretを作成し適用可能 <HTTPS> <SSH> ① ArgoCDで一意になる名前を定義 ② 接続するURLを定義(HTTPS / SSH) ③ 認証が必要な場合、ユーザー名 / パス ワードを定義 ④ SSH接続用の秘密鍵情報を定義
  43. 43 IBM Client Engineering / © 2022 IBM Corporation GUIから設定

    Settings -> Project -> ADD PROJECT 制限するGit Repoを定義 制限するDeploy先のCluster及び namespaceを定義 許可するCluster Resourceを定義 拒否するCluster Resourceを定義 許可するnamespace Resourceを 定義 拒否するnamespace Resourceを 定義
  44. 44 IBM Client Engineering / © 2022 IBM Corporation ①

    制限するGit Repoを定義 ② 制限するDeploy先のCluster及び namespaceを定義 ③ 制限するDeploy可能なResourceを定義 ④ グループに対してのロールの割り当て YAMLで定義して適用する事も可能
  45. 45 IBM Client Engineering / © 2022 IBM Corporation GUIから設定

    Dashbord -> NEW APP Application名を定義 所属するAppProjectを定義 Syncポリシーを定義(Manual / Automatic) Syncオプションを定義 Git RepoのURLを定義 対象のRevisionを定義 manifestの格納ディレクトリを定義 Deploy先のClusterを定義 Deploy先のnamespaceを定義
  46. 46 IBM Client Engineering / © 2022 IBM Corporation ①

    所属するAppProjectを指定 ② 取得元のGit RepoのURL、ブランチ名、 manifestが格納されているディレクトリを 指定 ③ Deploy先のCluster及びnamespaceを指定 ④ 同期オプションの設定 YAMLで定義して適用する事も可能
  47. 47 IBM Client Engineering / © 2022 IBM Corporation •

    PRUNE RESOURCES - Target Stateから削除されたResourceをLive Stateからも削除する場合には、 有効化 • SELF HEAL - Live StateのResourceがなんらかの理由で削除され自動で復旧する場合には、 有効化
  48. 48 IBM Client Engineering / © 2022 IBM Corporation •

    PRUNE LAST - 同期操作が全て正常に完了した後でプルーニングを行う場合には、有効化 • APPLY OUT OF SYNC ONLY - 変更があるResourceのみを適用する場合には、有効化 管理するResourceの数が膨大だと全て反映するのに時間がかかってしまうの でこのオプションを有効化することで反映時間の短縮を図る
  49. 49 IBM Client Engineering / © 2022 IBM Corporation

  50. ImageOpsとは? IBM Client Engineering / © 2022 IBM Corporation

  51. 51 IBM Client Engineering / © 2022 IBM Corporation 2020年にCyber

    Agent社の長谷川氏が提唱した造語 Imageの更新をトリガーに自動でImage tagを取得しGit RepoにPushを行い それを同期する手法 簡潔に言うと「Imageが更新されると自動で同期される」
  52. 52 IBM Client Engineering / © 2022 IBM Corporation 以下のステップで実現

    1. ArgoCD Image Updaterを導入(アドオンコンポーネント) 2. 対象のImage Registryの認証情報を設定 3. 対象のApplicationにannotationを追加
  53. 53 IBM Client Engineering / © 2022 IBM Corporation Git

    Repo (Source Code) Git Repo (manifest) Image Repo CI Pipeline OpenShift Cluster / Kubernetes Cluster Code change & Push Build & Push Watch & Push new image tag Watch Deploy Manifest change & Push
  54. 54 IBM Client Engineering / © 2022 IBM Corporation 公式では、ArgoCDが動作しているnamespaceに入れることを推奨しているため、以

    下の コマンドを実行して適用 参考:https://argocd-image-updater.readthedocs.io/en/stable/install/installation/ oc apply –n openshift-gitops ∖ - f https://raw.githubusercontent.com/argoproj-labs/argocd-image-updater/stable/manifests/install.yaml
  55. 55 IBM Client Engineering / © 2022 IBM Corporation 既存のCredentailを元にSecretを作成

    oc create secret generic registry-bot ∖ --from-file=.dockerconfigjson=<path/to/.docker/config.json> ∖ --type=kubernetes.io/dockerconfigjson ∖ -n openshift-gitops oc create secret docker-registry registry-bot ∖ --docker-server=<your-registry-server> ∖ --docker-username=<your-name> ∖ --docker-password=<your-pword> ∖ --docker-email=<your-email> ∖ -n openshift-gitops CLIからCredentialを指定してSecretを作成 参考: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/
  56. 56 IBM Client Engineering / © 2022 IBM Corporation 作成したSecretをargocd-image-updater-configのregistries.confフィールドに追加

    ① Registryのシンボル名 任意の文字列が指定可能 ② Registry APIのURL HTTP/ HTTPSのURLで指定 ③ DNS名と一致しかつ構成内で一意である必 要がある ④ Registryにアクセスする際に使用する Credential Sourceを指定
  57. 57 IBM Client Engineering / © 2022 IBM Corporation Kustomizeを利用してパッケージすることを推奨

    こうすることにより、アドオンコンポーネント自体もGitOpsで管理することが可能
  58. 58 IBM Client Engineering / © 2022 IBM Corporation DEV環境用の設定

    本番環境用の設定 ① write-back-method argocd / gitを指定可能 gitを指定すると対象のRepoにImageタグを自動で Pushする ② image-list 更新対象となるイメージのリスト イメージ毎の設定をするのにaliasが必要になるので必 ず付与する ③ <alias>.update-strategy イメージタグを利用する場合はlatest、セマンティッ クバージョニングで最新のバージョンを利用する場合 はsemverを指定 ④ <alias>.ignore-tags 特定のタグを持つときは更新しないようにする ⑤ <alias>.allow-tags 更新対象となるイメージタグを正規表現で制限可能
  59. 59 IBM Client Engineering / © 2022 IBM Corporation Deploy

    Flowがシンプルになる CI Pipelineでイメージタグを書き換えてGit RepoにPushするような少し複雑な処理を排除 る事が可能 Rollbackする際に古いイメージに書き換えてPushしてもimage-updaterが最新のイメージ に書き換えてしまう。 回避手段の例 • Argocd CLIまたはGUIからRollback機能を利用 • 一時的にannotationを消してimage-updaterを無効化 • 最新のイメージを削除 メリット デメリット
  60. まとめ IBM Client Engineering / © 2022 IBM Corporation

  61. 61 IBM Client Engineering / © 2022 IBM Corporation •

    GitOpsを導入する事で、生産性、可視性が向上 • 簡単にGitOpsを体感したいのならGUIから操作可能で学習コストが低い ArgoCDがおすすめ • 慣れてきたらCRDで定義し設定自体もGitOpsを用いて管理が可能 • メリット / デメリットはあるがImageOpsの検討も是非
  62. 62 IBM Client Engineering / © 2022 IBM Corporation

  63. IBM Client Engineering IBM Client Engineering / © 2022 IBM

    Corporation
  64. Hint & Tips IBM Client Engineering / © 2022 IBM

    Corporation
  65. 65 IBM Client Engineering / © 2022 IBM Corporation OpenShiftのダッシュボードからWorkloads

    -> Secrets -> 検索ボックス に”openshift-gitops-cluster”を入力
  66. 66 IBM Client Engineering / © 2022 IBM Corporation CLIから取得する場合は、下記コマンドを実行

    oc get secret openshift-gitops-cluster -n openshift-gitops ∖ -o jsonpath='{.data.admin ∖.password}' | base64 -d
  67. 67 IBM Client Engineering / © 2022 IBM Corporation SSH接続を選択し、下記エラーが発生する場合の対処法

    FATA[0007] rpc error: code = Unknown desc = ssh: handshake failed: knownhosts: key mismatch FATA[0000] rpc error: code = FailedPrecondition desc = error creating SSH agent: "SSH agent requested but SSH_AUTH_SOCK not-specified" known_hostsに登録されていない為、発生するエラーなのでホストを登録する必要がある argocd-ssh-known-hosts-cmというConfigMapにssh-keyscanの結果を登録する
  68. 68 IBM Client Engineering / © 2022 IBM Corporation GUIからも追加が可能

    Settings -> Certificates -> ADD SSH KNOWN HOSTS
  69. 69 IBM Client Engineering / © 2022 IBM Corporation AppProjectでDeploy可能なResourceに設定しているにも関わらず、Sync時に下記のエラー

    が表示された場合 msg="Adding resource result, status: 'SyncFailed', phase: '', message: 'Resource apps:Deployment is not permitted in project xxxx.'" application=guestbook kind=Deployment name= xxxx namespace= xxxx phase=Sync syncId=00006-lddHO Deployするopenshift-gitops-argocd-application-controllerと言うServiceAccountに権限が ないため、発生するエラーなので下記コマンドを実行し権限を付与 oc policy add-role-to-user -n <デプロイ先のnamespace> edit system:serviceaccount:openshift- gitops:openshift-gitops-argocd-application-controller
  70. 70 IBM Client Engineering / © 2022 IBM Corporation Syncオプションでディレクトリを再帰的に同期するオプション

    有効化した際、サブディレクトリにtemplate(kustomizeやhelm)があるとエラーが発生し同 期が失敗 ワークアラウンドとしては下記 • recurseオプションを使わずにApplicationを分割 • Parent Directoryでパッケージング
  71. 71 IBM Client Engineering / © 2022 IBM Corporation ParentDirectory

    ├── kustomization.yaml ├── SubDirectory1 │ ├── configmap.yaml │ └── route.yaml ├── SubDirectory1 │ ├── configmap.yaml │ └── route.yaml ├── SubDirectory3 │ ├── configmap.yaml │ └── route.yaml └── service_account.yaml <良い例> <悪い例> ParentDirectory ├── SubDirectory1 │ ├── kustomization.yaml │ ├── configmap.yaml │ └── route.yaml ├── SubDirectory1 │ ├── kustomization.yaml │ ├── configmap.yaml │ └── route.yaml ├── SubDirectory3 │ ├── kustomization.yaml │ ├── configmap.yaml │ └── route.yaml └── service_account.yaml Application設定のPathをParentDirectoryに設定した場合 SubDirectory毎に Applicationを設定する か、ParentDirectoryで パッケージングする
  72. 72 IBM Client Engineering / © 2022 IBM Corporation Cluster構成が複雑になれば、Resource同士の依存関係も複雑になる

    このような課題を解決するためにSyncにはいくつかのフェーズがあり、Resourceの反映順序 を考慮する機能を提供している 概念として、Resource HooksとWaveが存在する • Resource Hooks - 5つのフェーズ • Wave - 数値による反映順序の優先順位付(-100 〜 100)
  73. 73 IBM Client Engineering / © 2022 IBM Corporation Resource

    Hooksの5つのフェーズ • PreSync - manifestの適用(Sync)前に実行するフェーズ Job等の事前処理がよく例に挙げられるが、ConfigMapやSecret等も定義可能 • Sync - PreSyncが成功した後に実行、manifest適用と同じタイミング • Skip - manifestの適用をスキップ • PostSync - Syncが完了した後に実行(全てのResourceがHealthyになった時) • SyncFail - Syncが失敗した時に実行 失敗通知などに利用できる
  74. 74 IBM Client Engineering / © 2022 IBM Corporation Resource

    Hooks、Waveは対象のResourceにannotationに追記 例としてSync前にConfigMapを作成しておきたい場合
  75. 75 IBM Client Engineering / © 2022 IBM Corporation •

    Imageとは https://kubernetes.io/ja/docs/concepts/containers/images/ • アジャイルソフトウェア開発宣言 https://agilemanifesto.org/iso/ja/manifesto.html • 12Factor app https://12factor.net/ja/ • DevOpsとは https://udemy.benesse.co.jp/development/system/devops.html • Kubernetes NativeなCI / CD https://atmarkit.itmedia.co.jp/ait/articles/2105/26/news005.html • Kubernetes Object https://kubernetes.io/ja/docs/concepts/overview/working-with-objects/kubernetes-objects/ • Kubernetes Resource List https://kubernetes.io/ja/docs/reference/kubectl/_print/#resource-types • Kubernetes Custom Resource https://kubernetes.io/ja/docs/concepts/extend-kubernetes/api-extension/custom-resources/ • Kubernetes Controller https://kubernetes.io/ja/docs/concepts/architecture/controller/