AKSと始める未来のソフトウェアのCI/CD

1794b1ba4ae143ede504208cd8e2908d?s=47 t-akzw
June 11, 2020

 AKSと始める未来のソフトウェアのCI/CD

組織課題の解決のためにAKS + GitOpsで小規模な機械学習システムのインフラを構築しました。今回の発表では主にGitOpsを用いたCDフロー、利用helmチャートやAzure/AKSで得た知見について簡単に紹介していきます。

スライドでは色々課題のままのものもあるのでパネルディスカッションもご確認いただければと思います。
https://www.youtube.com/watch?v=QSdNY1hCBrk&feature=youtu.be

1794b1ba4ae143ede504208cd8e2908d?s=128

t-akzw

June 11, 2020
Tweet

Transcript

  1. AKSと始める未来のソフトウェアのCI/CD Microsoft Open Tech Night 2020/06/11 Toshinobu Akazawa

  2. 自己紹介 • 赤澤智信 • 機械学習システムのインフラ/サーバサイド開発・運用を担当 • 略歴 ◦ FUJITSU スパコン富嶽のインターコネクト開発

    ◦ DeNA ヘルスケアアプリのサーバサイド開発
  3. PKSHA xOpsについて • PKSHA Technologyの子会社 • 2019年08月 設立 • ロゴまだないっす^^

    • メンバーは数人
  4. 今回話すこと・話さないこと • 話す ◦ AKS/Azure ◦ GitOps ◦ 利用したhelmチャートの紹介 •

    話さない ◦ マニフェスト/terraform/スクリプトの詳細 ◦ 案件・推論部分の詳細
  5. Agenda 1. 背景 2. 技術選定 3. CD 4. 導入 5.

    Pros and Cons 6. まとめ・今後の課題
  6. 未来のソフトウェアのCI/CD...? xOpsの役割 is 未来のソフトウェアのCI/CD 未来のソフトウェア includes 機械学習・深層学習を用いたSW(/HW) のCI/CD includes 社会実装

    つまり 未来のソフトウェアを現実社会にデプロイする組織 is xOps
  7. xOpsの課題感 • インフラ/サーバサイドの開発・運用の体制構築 ◦ 少人数 ◦ 様々な要件 ▪ BigQuery、sagemaker、Elastic Search、etc..

    ▪ 利用プロバイダ 様々な技術が求められる 要件に応じたシステムを毎回作るのはいつか破綻する
  8. kubernetesの導入目的 • マルチプロバイダ • 再利用性 ◦ 新規案件のインフラ迅速立ち上げ ▪ モデルサービングや最適化に集中できる •

    負荷の軽減 ◦ 技術スタックの一元化、(ECS、GAE etc.. to k8s) ◦ 運用の安定化、一元化
  9. AKSの導入目的 • 社内での利用経験がないAzure周りの知見を得たい • AKSの評判は良い by オライリー本 ^^

  10. 今回開発したシステムの特徴 1. Cost: ¥50,000 or less 2. Latency: about 3

    secs 3. Concurrently: max 3 4. BERT + ElasticsearchによるNER/classification a. sanic、tensorflow、spacy nlpのサービング、推論を行う 5. コンテナ内部はステートレス 6. プロバイダ制約なし
  11. Agenda 1. 背景 2. 技術選定 3. CD 4. 導入 5.

    Pros and Cons 6. まとめ・今後の課題
  12. 技術選定... https://landscape.cncf.io/

  13. 技術選定! • CD: Argo CD • secret management: sealed secret

    • ingress: ingress nginx • manifest management: helm • certificate management: cert-manager
  14. Argo CD is a declarative, GitOps continuous delivery tool for

    Kubernetes. (Kubernetesのための宣言型のGitOps継続的デリバリーツール) https://argoproj.github.io/argo-cd/
  15. what is GitOps? Gitリポジトリの宣言的設定ファイル(helm etc..) アプリケーション状態 を 実現する仕組み sync

  16. what is GitOps? https://www.weave.works/technologies/gitops/

  17. Argo CD 選定理由 • 構築が楽で開発初期から綺麗なCDフローを作れそう • GitOpsだと誰がいつ何をしたかの監査履歴がgit logとして残る • マージすると勝手にsync

    + sync状態の可視化 • UIでリソース可視化、設定やコンテナログの確認ができる • helm, kustomizeなど複数のマニフェストのサポート • プロバイダ非依存 • CLI
  18. Argo CD 選定理由

  19. Argo CD 選定理由

  20. Agenda 1. 背景 2. 技術選定 3. CD 4. 導入 5.

    Pros and Cons 6. まとめ・今後の課題
  21. CD

  22. CD 1. masterマージ 2. github actions起動 3. imageビルド 4. 最新image

    tagを差し替えたマニフェストのPRを作成 5. stagingにマージ(= stagingへのデプロイ) 6. producitonにマージ(= productionへのデプロイ)
  23. config repo ディレクトリ構成

  24. config repo cdファイル例: sealed secret targetRevsionは固定しておく

  25. config repo cdディレクトリで指定したchart達

  26. Agenda 1. 背景 2. 技術選定 3. CD 4. 導入 a.

    Azure/AKS b. 利用チャート 5. Pros and Cons 6. まとめ・今後の課題
  27. 全体概要図

  28. Azure/AKS • 構築の困り ◦ サービスプリンシパル(SP)、RBAC周りが理解できず ▪ 公式資料の説明が最初はわかりにくかった... ◦ azコマンドでAKSを作成すべき?terraform? ▪

    構築に関する知見・情報が少ない...
  29. Azure RBAC 間違ってたらご指摘ください!

  30. Azure/AKS • terraformで構築した • 構築の困り ◦ client secretのterraformでの取り扱い... ◦ SP更新される度にAKSにupdate-credentiaを叩かないとだめ?

    ◦ 有効期限が切れるとどうなる?切れる前に更新... ベストプラクティスがわからない...
  31. Azure/AKS • terraformでの構築の困り → 今回はスクリプトで対処 • SP作成(az ad sp create-for-rbac

    ...) ◦ client secretをkey vaultに格納 ◦ aksに対してupdate-credentialを実行 ◦ 有効期限は--years引数で実質無期限に設定 • terraform実行(client secretが必要) ◦ key vaultからsecret情報を取得して環境変数にセット
  32. Azure/AKS • terraformでの構築の困り → 今回はスクリプトで対処 • SP作成(az ad sp create-for-rbac

    ...) ◦ client secretをkey vaultに格納 ◦ aksに対してupdate-credentialを実行 ◦ 有効期限は--years引数で実質無期限に設定 • terraform実行(client secretが必要) ◦ key vaultからsecret情報を取得して環境変数にセット ◦ 初回作成時以外はapplyしない マネージドIDの資料を見てなかった凹 これを使うのが良い? https://docs.microsoft.com/ja-jp/azure/aks/use-managed-identity
  33. Agenda 1. 背景 2. 技術選定 3. CD 4. 導入 a.

    Azure/AKS b. 利用チャート 5. Pros and Cons 6. まとめ・今後の課題
  34. • GitOpsするならSecretはGit管理 ◦ Git管理だとSecret暗号化が必須 • sealed secretで暗号・複合化 ◦ kubesealで暗号化 ◦

    デプロイ時にsealed Podで複合化 • つらみ ◦ Podが立っていないと暗号化できない... sealed secret
  35. sealed secret キーペアの取り扱い • 暗号・複合化のためのキーペア自体をSecretとして指定する ◦ このSecretだけはkubectl applyで適用している... • 手順をスクリプト化

    ◦ key vaultからcrt, keyを取得してtemplateに挿入 ▪ secretマニフェスト作成 ◦ kubectl applyでSecret作成を実行 もっと良い方法をご存知の方は是非教えてください!
  36. sealed secret キーペアの取り扱い 2. key vaultから取得したcrt/keyの値をスクリプトで挿入してkubectl apply 3. このsecretマニフェスト自体はgit管理しない 1.

    sealed secretで使うキーペア用のSecretマニフェスト template
  37. ingress nginx https://docs.microsoft.com/ja-jp/azure/aks/ingress-static-ip • WAF • TLS終端 • (IP制限) •

    参考になる資料 →
  38. • 利用チャート: https://github.com/kubernetes/ingress-nginx • Application Gatewayはコスト制約で断念(¥11,125../月) • modsecurityを利用できる(annotationsに以下を書くだけ) ingress nginx

    (WAF) https://github.com/kubernetes/ingress-nginx/blob/master/docs/user-guide/nginx-configuration/annotations.md#modsecurity
  39. ingress nginx (IP制限) • annotationsを指定できる ◦ nginx.ingress.kubernetes.io/whitelist-source-range • 今回はNSGでIP制限をかけた ◦

    az network nsg rule create ◦ PodでのIP制限はセキュリティや負荷的にどうなのか? ◦ annotationsでLBにIP制限をかけたい(要望)
  40. ingress nginx (IP制限)

  41. cert manager • certificate management、TLS終端で利用 • 利用チャート: https://github.com/jetstack/cert-manager • 問題が多かった...

    ◦ CRDが固定のnamespace/nameの利用を期待(v0.14.1) ◦ 異なるnamespaceとnameを利用していたためエラー ▪ cert-manager.io/inject-ca-from-secret: cert-manager/cert-manager-webhook-tls ◦ v0.15.0でCRDを独自でいれる必要はなくなった... ▪ -set installCRDs=true
  42. • 今回はAzure Monitorを利用 • terraformで構築 ◦ azurerm_log_analytics_workspace, solution ◦ azurerm_application_insights,

    web_test ◦ azurerm_monitor_metric_alert ◦ azurerm_monitor_scheduled_query_rules_alert ◦ ... 監視
  43. Azure Monitor https://docs.microsoft.com/ja-jp/azure/azure-monitor/overview

  44. Azure Monitor Metric

  45. Logs Analytics Alerts

  46. Logs Analytics Alerts query

  47. Logs Analytics Alerts query • azコマンドでlogs queryを見たい...(要望)

  48. その他利用ツール • stern ◦ 調査時にログがみやすいので便利だった • weave scope ◦ Pod負荷を一覧で可視化、コンテナにログイン、など

    • trivy(コンテナ脆弱性スキャン) ◦ コスト制約のためOSSであるtrivyを利用 • rollbar(エラーモニタリング) • descheduler
  49. Agenda 1. 背景 2. 技術選定 3. CD 4. 導入 5.

    Pros and Cons 6. まとめ・今後の課題
  50. kubernetes Pros and Cons • Pros ◦ 導入理由(マルチプロバイダ、一元化、etc..) ◦ 使っていて楽しい!!将来性を感じる!!

    • Cons ◦ 学習コストが高い ▪ 一歩踏み込んだところのエラーを追うのがきつい... ▪ Go学習これから頑張っていきます... ▪ CRDもまだそんなわかってない...
  51. Azure/AKS Pros and Cons • Pros ◦ リソースグループごとのコストチェック(助かる..) ◦ UIが綺麗で使いやすい

    ◦ Azure Monitor便利 • Cons ◦ 個人開発者の入門記事やOSS の Azure サポートが少なめ (e.g. tensorflow-serving の Azure Storage 対応) ◦ az コマンドや terraform に非対応のサービスが時々ある
  52. ArgoCD/GitOps Pros and Cons • Pros ◦ 導入理由(監査履歴、プロバイダ非依存、可視化) ◦ オペミスが無いのでリリースに安心感がある

    ◦ ブランチのsync先を変えるだけで環境切り替え+試験ができる • Cons ◦ secretの取り扱いがめんどくさい ◦ 使用ブランチを消したらArgoが固まる... ◦ 資料や事例が少ない
  53. Agenda 1. 背景 2. 技術選定 3. CD 4. 導入 5.

    Pros and Cons 6. まとめ・今後の課題
  54. 【再掲】xOpsの課題感 • インフラ/サーバサイドの開発・運用の体制構築 ◦ 少人数 ◦ 様々な要件 ▪ BigQuery、sagemaker、Elastic Search、etc..

    ▪ 利用プロバイダ 様々な技術が求められる 要件に応じたシステムを毎回作るのはいつか破綻する
  55. まとめ・今後の課題 • まとめ ◦ xOps課題感をk8s+GitOpsで改善していける可能性を感じた ▪ 再利用性、一元化、安全なCD・運用、(学習コスト...) ◦ 最終的なコストはRI利用で約34000円程度(制約: 50000円)

    • 今後の課題 ◦ サービスメッシュの導入 ◦ 監視まわり(マルチプロバイダ) ◦ RBAC
  56. パネルディスカッション用 1. AKS構築方法のベストプラクティス a. マネージドIDを使ってazコマンドで作成するのが良いのか? terraformは推奨されない?オススメが知りたい。 b. バージョンアップの際のベストなやり方はあるのか?   今だと手動で nodepool追加して対応することになりそう。

    c. nodepoolのセキュリティグループは自動で生成されるので後から操作しにくい。 例えば、LBのpublic ipをTerraformで作るにしても生成された AKSのリソースグループを指定する必要があるので、 TerraformでAKSのdestroy & applyするたびに毎回 public ipの方のTerraformも再実行し直す必要がある。 i. AKSの作成時にリソースグループ指定できる?( AKS用のリソースグループが自動生成される認識) 2. annotationsでLBにIP制限をかけたい、考え方として正しいのか? 3. control plane a. ユーザ側が意識しておいた方がいいことはある? 4. ASGでロードバランサを指定できる?できなそう。