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

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

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

t-akzw

June 11, 2020
Tweet

Other Decks in Technology

Transcript

  1. 今回話すこと・話さないこと • 話す ◦ AKS/Azure ◦ GitOps ◦ 利用したhelmチャートの紹介 •

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

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

    ▪ 利用プロバイダ 様々な技術が求められる 要件に応じたシステムを毎回作るのはいつか破綻する
  4. 今回開発したシステムの特徴 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. プロバイダ制約なし
  5. Agenda 1. 背景 2. 技術選定 3. CD 4. 導入 5.

    Pros and Cons 6. まとめ・今後の課題
  6. 技術選定! • CD: Argo CD • secret management: sealed secret

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

    Kubernetes. (Kubernetesのための宣言型のGitOps継続的デリバリーツール) https://argoproj.github.io/argo-cd/
  8. Argo CD 選定理由 • 構築が楽で開発初期から綺麗なCDフローを作れそう • GitOpsだと誰がいつ何をしたかの監査履歴がgit logとして残る • マージすると勝手にsync

    + sync状態の可視化 • UIでリソース可視化、設定やコンテナログの確認ができる • helm, kustomizeなど複数のマニフェストのサポート • プロバイダ非依存 • CLI
  9. Agenda 1. 背景 2. 技術選定 3. CD 4. 導入 5.

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

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

    tagを差し替えたマニフェストのPRを作成 5. stagingにマージ(= stagingへのデプロイ) 6. producitonにマージ(= productionへのデプロイ)
  12. Agenda 1. 背景 2. 技術選定 3. CD 4. 導入 a.

    Azure/AKS b. 利用チャート 5. Pros and Cons 6. まとめ・今後の課題
  13. Azure/AKS • terraformでの構築の困り → 今回はスクリプトで対処 • SP作成(az ad sp create-for-rbac

    ...) ◦ client secretをkey vaultに格納 ◦ aksに対してupdate-credentialを実行 ◦ 有効期限は--years引数で実質無期限に設定 • terraform実行(client secretが必要) ◦ key vaultからsecret情報を取得して環境変数にセット
  14. 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
  15. Agenda 1. 背景 2. 技術選定 3. CD 4. 導入 a.

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

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

    ◦ key vaultからcrt, keyを取得してtemplateに挿入 ▪ secretマニフェスト作成 ◦ kubectl applyでSecret作成を実行 もっと良い方法をご存知の方は是非教えてください!
  18. ingress nginx (IP制限) • annotationsを指定できる ◦ nginx.ingress.kubernetes.io/whitelist-source-range • 今回はNSGでIP制限をかけた ◦

    az network nsg rule create ◦ PodでのIP制限はセキュリティや負荷的にどうなのか? ◦ annotationsでLBにIP制限をかけたい(要望)
  19. 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
  20. • 今回はAzure Monitorを利用 • terraformで構築 ◦ azurerm_log_analytics_workspace, solution ◦ azurerm_application_insights,

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

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

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

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

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

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

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

    ▪ 利用プロバイダ 様々な技術が求められる 要件に応じたシステムを毎回作るのはいつか破綻する
  28. パネルディスカッション用 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でロードバランサを指定できる?できなそう。