Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

自己紹介 ● 赤澤智信 ● 機械学習システムのインフラ/サーバサイド開発・運用を担当 ● 略歴 ○ FUJITSU スパコン富嶽のインターコネクト開発 ○ DeNA ヘルスケアアプリのサーバサイド開発

Slide 3

Slide 3 text

PKSHA xOpsについて ● PKSHA Technologyの子会社 ● 2019年08月 設立 ● ロゴまだないっす^^ ● メンバーは数人

Slide 4

Slide 4 text

今回話すこと・話さないこと ● 話す ○ AKS/Azure ○ GitOps ○ 利用したhelmチャートの紹介 ● 話さない ○ マニフェスト/terraform/スクリプトの詳細 ○ 案件・推論部分の詳細

Slide 5

Slide 5 text

Agenda 1. 背景 2. 技術選定 3. CD 4. 導入 5. Pros and Cons 6. まとめ・今後の課題

Slide 6

Slide 6 text

未来のソフトウェアのCI/CD...? xOpsの役割 is 未来のソフトウェアのCI/CD 未来のソフトウェア includes 機械学習・深層学習を用いたSW(/HW) のCI/CD includes 社会実装 つまり 未来のソフトウェアを現実社会にデプロイする組織 is xOps

Slide 7

Slide 7 text

xOpsの課題感 ● インフラ/サーバサイドの開発・運用の体制構築 ○ 少人数 ○ 様々な要件 ■ BigQuery、sagemaker、Elastic Search、etc.. ■ 利用プロバイダ 様々な技術が求められる 要件に応じたシステムを毎回作るのはいつか破綻する

Slide 8

Slide 8 text

kubernetesの導入目的 ● マルチプロバイダ ● 再利用性 ○ 新規案件のインフラ迅速立ち上げ ■ モデルサービングや最適化に集中できる ● 負荷の軽減 ○ 技術スタックの一元化、(ECS、GAE etc.. to k8s) ○ 運用の安定化、一元化

Slide 9

Slide 9 text

AKSの導入目的 ● 社内での利用経験がないAzure周りの知見を得たい ● AKSの評判は良い by オライリー本 ^^

Slide 10

Slide 10 text

今回開発したシステムの特徴 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. プロバイダ制約なし

Slide 11

Slide 11 text

Agenda 1. 背景 2. 技術選定 3. CD 4. 導入 5. Pros and Cons 6. まとめ・今後の課題

Slide 12

Slide 12 text

技術選定... https://landscape.cncf.io/

Slide 13

Slide 13 text

技術選定! ● CD: Argo CD ● secret management: sealed secret ● ingress: ingress nginx ● manifest management: helm ● certificate management: cert-manager

Slide 14

Slide 14 text

Argo CD is a declarative, GitOps continuous delivery tool for Kubernetes. (Kubernetesのための宣言型のGitOps継続的デリバリーツール) https://argoproj.github.io/argo-cd/

Slide 15

Slide 15 text

what is GitOps? Gitリポジトリの宣言的設定ファイル(helm etc..) アプリケーション状態 を 実現する仕組み sync

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

Argo CD 選定理由 ● 構築が楽で開発初期から綺麗なCDフローを作れそう ● GitOpsだと誰がいつ何をしたかの監査履歴がgit logとして残る ● マージすると勝手にsync + sync状態の可視化 ● UIでリソース可視化、設定やコンテナログの確認ができる ● helm, kustomizeなど複数のマニフェストのサポート ● プロバイダ非依存 ● CLI

Slide 18

Slide 18 text

Argo CD 選定理由

Slide 19

Slide 19 text

Argo CD 選定理由

Slide 20

Slide 20 text

Agenda 1. 背景 2. 技術選定 3. CD 4. 導入 5. Pros and Cons 6. まとめ・今後の課題

Slide 21

Slide 21 text

CD

Slide 22

Slide 22 text

CD 1. masterマージ 2. github actions起動 3. imageビルド 4. 最新image tagを差し替えたマニフェストのPRを作成 5. stagingにマージ(= stagingへのデプロイ) 6. producitonにマージ(= productionへのデプロイ)

Slide 23

Slide 23 text

config repo ディレクトリ構成

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

Agenda 1. 背景 2. 技術選定 3. CD 4. 導入 a. Azure/AKS b. 利用チャート 5. Pros and Cons 6. まとめ・今後の課題

Slide 27

Slide 27 text

全体概要図

Slide 28

Slide 28 text

Azure/AKS ● 構築の困り ○ サービスプリンシパル(SP)、RBAC周りが理解できず ■ 公式資料の説明が最初はわかりにくかった... ○ azコマンドでAKSを作成すべき?terraform? ■ 構築に関する知見・情報が少ない...

Slide 29

Slide 29 text

Azure RBAC 間違ってたらご指摘ください!

Slide 30

Slide 30 text

Azure/AKS ● terraformで構築した ● 構築の困り ○ client secretのterraformでの取り扱い... ○ SP更新される度にAKSにupdate-credentiaを叩かないとだめ? ○ 有効期限が切れるとどうなる?切れる前に更新... ベストプラクティスがわからない...

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

Agenda 1. 背景 2. 技術選定 3. CD 4. 導入 a. Azure/AKS b. 利用チャート 5. Pros and Cons 6. まとめ・今後の課題

Slide 34

Slide 34 text

● GitOpsするならSecretはGit管理 ○ Git管理だとSecret暗号化が必須 ● sealed secretで暗号・複合化 ○ kubesealで暗号化 ○ デプロイ時にsealed Podで複合化 ● つらみ ○ Podが立っていないと暗号化できない... sealed secret

Slide 35

Slide 35 text

sealed secret キーペアの取り扱い ● 暗号・複合化のためのキーペア自体をSecretとして指定する ○ このSecretだけはkubectl applyで適用している... ● 手順をスクリプト化 ○ key vaultからcrt, keyを取得してtemplateに挿入 ■ secretマニフェスト作成 ○ kubectl applyでSecret作成を実行 もっと良い方法をご存知の方は是非教えてください!

Slide 36

Slide 36 text

sealed secret キーペアの取り扱い 2. key vaultから取得したcrt/keyの値をスクリプトで挿入してkubectl apply 3. このsecretマニフェスト自体はgit管理しない 1. sealed secretで使うキーペア用のSecretマニフェスト template

Slide 37

Slide 37 text

ingress nginx https://docs.microsoft.com/ja-jp/azure/aks/ingress-static-ip ● WAF ● TLS終端 ● (IP制限) ● 参考になる資料 →

Slide 38

Slide 38 text

● 利用チャート: 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

Slide 39

Slide 39 text

ingress nginx (IP制限) ● annotationsを指定できる ○ nginx.ingress.kubernetes.io/whitelist-source-range ● 今回はNSGでIP制限をかけた ○ az network nsg rule create ○ PodでのIP制限はセキュリティや負荷的にどうなのか? ○ annotationsでLBにIP制限をかけたい(要望)

Slide 40

Slide 40 text

ingress nginx (IP制限)

Slide 41

Slide 41 text

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

Slide 42

Slide 42 text

● 今回はAzure Monitorを利用 ● terraformで構築 ○ azurerm_log_analytics_workspace, solution ○ azurerm_application_insights, web_test ○ azurerm_monitor_metric_alert ○ azurerm_monitor_scheduled_query_rules_alert ○ ... 監視

Slide 43

Slide 43 text

Azure Monitor https://docs.microsoft.com/ja-jp/azure/azure-monitor/overview

Slide 44

Slide 44 text

Azure Monitor Metric

Slide 45

Slide 45 text

Logs Analytics Alerts

Slide 46

Slide 46 text

Logs Analytics Alerts query

Slide 47

Slide 47 text

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

Slide 48

Slide 48 text

その他利用ツール ● stern ○ 調査時にログがみやすいので便利だった ● weave scope ○ Pod負荷を一覧で可視化、コンテナにログイン、など ● trivy(コンテナ脆弱性スキャン) ○ コスト制約のためOSSであるtrivyを利用 ● rollbar(エラーモニタリング) ● descheduler

Slide 49

Slide 49 text

Agenda 1. 背景 2. 技術選定 3. CD 4. 導入 5. Pros and Cons 6. まとめ・今後の課題

Slide 50

Slide 50 text

kubernetes Pros and Cons ● Pros ○ 導入理由(マルチプロバイダ、一元化、etc..) ○ 使っていて楽しい!!将来性を感じる!! ● Cons ○ 学習コストが高い ■ 一歩踏み込んだところのエラーを追うのがきつい... ■ Go学習これから頑張っていきます... ■ CRDもまだそんなわかってない...

Slide 51

Slide 51 text

Azure/AKS Pros and Cons ● Pros ○ リソースグループごとのコストチェック(助かる..) ○ UIが綺麗で使いやすい ○ Azure Monitor便利 ● Cons ○ 個人開発者の入門記事やOSS の Azure サポートが少なめ (e.g. tensorflow-serving の Azure Storage 対応) ○ az コマンドや terraform に非対応のサービスが時々ある

Slide 52

Slide 52 text

ArgoCD/GitOps Pros and Cons ● Pros ○ 導入理由(監査履歴、プロバイダ非依存、可視化) ○ オペミスが無いのでリリースに安心感がある ○ ブランチのsync先を変えるだけで環境切り替え+試験ができる ● Cons ○ secretの取り扱いがめんどくさい ○ 使用ブランチを消したらArgoが固まる... ○ 資料や事例が少ない

Slide 53

Slide 53 text

Agenda 1. 背景 2. 技術選定 3. CD 4. 導入 5. Pros and Cons 6. まとめ・今後の課題

Slide 54

Slide 54 text

【再掲】xOpsの課題感 ● インフラ/サーバサイドの開発・運用の体制構築 ○ 少人数 ○ 様々な要件 ■ BigQuery、sagemaker、Elastic Search、etc.. ■ 利用プロバイダ 様々な技術が求められる 要件に応じたシステムを毎回作るのはいつか破綻する

Slide 55

Slide 55 text

まとめ・今後の課題 ● まとめ ○ xOps課題感をk8s+GitOpsで改善していける可能性を感じた ■ 再利用性、一元化、安全なCD・運用、(学習コスト...) ○ 最終的なコストはRI利用で約34000円程度(制約: 50000円) ● 今後の課題 ○ サービスメッシュの導入 ○ 監視まわり(マルチプロバイダ) ○ RBAC

Slide 56

Slide 56 text

パネルディスカッション用 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でロードバランサを指定できる?できなそう。