Slide 1

Slide 1 text

IBM Cloud Community Summit 2019 Kazufumi Saito @capsmalt Soto Sugita @sotoiwa Kubernetesアプリケーション運⽤基礎

Slide 2

Slide 2 text

@capsmalt 2 Kazufumi Saito @capsmalt Soto Sugita @sotoiwa IBM Japan IBM Japan Systems Engineering

Slide 3

Slide 3 text

@capsmalt 3 共通点 1 Raspberry Pi で K8s Cluster 斎藤家 杉⽥家

Slide 4

Slide 4 text

@capsmalt 4 共通点 2 家族まで Kubernetes...K8s...K8s... 斎藤家 杉⽥家

Slide 5

Slide 5 text

@capsmalt 5

Slide 6

Slide 6 text

@capsmalt 6

Slide 7

Slide 7 text

@capsmalt 7 Why? Kubernetes

Slide 8

Slide 8 text

@capsmalt 8

Slide 9

Slide 9 text

@capsmalt 9 Party

Slide 10

Slide 10 text

@capsmalt 10

Slide 11

Slide 11 text

@capsmalt 11 Why? Kubernetes

Slide 12

Slide 12 text

@capsmalt 12 Declarative

Slide 13

Slide 13 text

@capsmalt 13 Declarative (宣⾔的)

Slide 14

Slide 14 text

@capsmalt 14 Worker Node (OS: Ubuntu) kubectl apply –f deploy-nginx.yaml nginx:1.15.12

Slide 15

Slide 15 text

@capsmalt 15 kubectl apply –f deploy-nginx.yaml Worker Node (OS: Ubuntu) レプリカ数を指定 (replicas: 2) nginx:1.15.12

Slide 16

Slide 16 text

@capsmalt 16 kubectl apply –f deploy-nginx.yaml Worker Node (OS: Ubuntu) イメージタグ(バージョン)を変更 nginx:1.15.8

Slide 17

Slide 17 text

@capsmalt 17 kubectl apply –f deploy-nginx.yaml Worker Node (OS: Ubuntu) イメージタグ(バージョン)を変更 nginx:1.15.8

Slide 18

Slide 18 text

@capsmalt 18 Worker Node (OS: Ubuntu) Kubernetes 管理下のコンテナ環境 Worker Node (OS: Ubuntu) Worker Node (OS: Ubuntu) Kubernetes クラスター 複数Nodeで Kubernetesクラスターを構成 コンテナ 正確にはPodですが,説明簡略化のためコンテナとします。

Slide 19

Slide 19 text

@capsmalt 19 Worker Node (OS: Ubuntu) Worker Node (OS: Ubuntu) Worker Node (OS: Ubuntu) Kubernetes クラスター あるコンテナに問題があれば,別Nodeで新コンテナとして動作 Kubernetes 管理下のコンテナ環境 コンテナ 正確にはPodですが,説明簡略化のためコンテナとします。

Slide 20

Slide 20 text

@capsmalt 20 Worker Node (OS: Ubuntu) Worker Node (OS: Ubuntu) Worker Node (OS: Ubuntu) Kubernetes クラスター あるNodeに問題があれば,別Nodeで新コンテナとして動作 Kubernetes 管理下のコンテナ環境 コンテナ 正確にはPodですが,説明簡略化のためコンテナとします。

Slide 21

Slide 21 text

@capsmalt 21 Declarative (宣⾔的) あるべき姿 (レプリカ数=2) を宣⾔しておけば, Kubernetes Controllerが, 宣⾔された状態 に近づけてくれる

Slide 22

Slide 22 text

@capsmalt 22 Worker Node (OS: Ubuntu) nginx:1.15.8 node:10.15.3 kubectl apply –f xxx.yaml

Slide 23

Slide 23 text

@capsmalt 23 Worker Node (OS: Ubuntu) nginx:1.15.8 node:10.15.3 kubectl apply –f xxx.yaml

Slide 24

Slide 24 text

@capsmalt 24 Worker Node (OS: Ubuntu) nginx:1.15.8 node:10.15.3 kubectl apply –f xxx.yaml Kubernetes クラスター上の アプリケーション や 構成 をリポジトリ管理する

Slide 25

Slide 25 text

@capsmalt 25 Worker Node (OS: Ubuntu) nginx:1.15.8 node:10.15.3 kubectl apply –f xxx.yaml もしK8sクラスターが壊れても・・・

Slide 26

Slide 26 text

@capsmalt 26 Worker Node (OS: Ubuntu) nginx:1.15.8 node:10.15.3 kubectl apply –f xxx.yaml リポジトリに “正しい構成” があるから, それを反映させればOK 復活︕

Slide 27

Slide 27 text

@capsmalt 27 Kubernetesやっていく上で知っておいた⽅が良いコト 1. K8sクラスターの運⽤ 2. K8s上アプリの運⽤

Slide 28

Slide 28 text

@capsmalt 28 Kubernetesやっていく上で知っておいた⽅が良いコト 1. K8sクラスターの運⽤ 2. K8s上アプリの運⽤

Slide 29

Slide 29 text

@capsmalt 29 Kubernetesやっていく上で知っておいた⽅が良いコト 1. K8sクラスターの運⽤ 2. K8s上アプリの運⽤ (本⽇は,アプリデプロイ)

Slide 30

Slide 30 text

@capsmalt 30 CI/CD Overview Code Build Test Release Unit Integration CI Pipeline CD Pipeline Hook Commit PR Package Dev, Stage Production ERROR Review Develop LGTM! Registry CI: Continuous Integration CD: Continuous Delivery

Slide 31

Slide 31 text

@capsmalt 31 CI/CD Overview - Kubernetes Code Build Test Release Unit Integration CI Pipeline CD Pipeline Hook Commit PR Package ERROR Review Develop LGTM! Registry CI: Continuous Integration CD: Continuous Delivery Dev, Stage Production

Slide 32

Slide 32 text

@capsmalt 32 CI/CD Overview - Kubernetes Code Build Test Release Unit Integration CI Pipeline CD Pipeline Hook Commit PR Package Dev, Stage Production ERROR Review Develop LGTM! Registry CI: Continuous Integration CD: Continuous Delivery kubectl apply -f xxx-stg.yaml kubectl apply -f xxx-prd.yaml

Slide 33

Slide 33 text

@capsmalt 33 CI/CD Overview - Kubernetes Code Unit Integration CI Pipeline CD Pipeline Hook Commit PR Package Dev, Stage Production ERROR Review Develop LGTM! Registry CI: Continuous Integration CD: Continuous Delivery kubectl apply -f xxx-stg.yaml kubectl apply -f xxx-prd.yaml CI Pipeline CD Pipeline Build Test Release CIツールが命令して 処理を流す(⾃動化) 例えば Jenkins CI と CD を両⽅やるケース (=CIOps)

Slide 34

Slide 34 text

@capsmalt 34 CI/CD Overview - Kubernetes Code Unit Integration CI Pipeline CD Pipeline Hook Commit PR Package Dev, Stage Production ERROR Review Develop LGTM! Registry CI: Continuous Integration CD: Continuous Delivery kubectl apply -f xxx-stg.yaml kubectl apply -f xxx-prd.yaml Production Dev, Stage Registry CD のフェーズ

Slide 35

Slide 35 text

@capsmalt 35 CI/CD Overview - Kubernetes Code Unit Integration CI Pipeline CD Pipeline Hook Commit PR Package Dev, Stage Production ERROR Review Develop LGTM! Registry CI: Continuous Integration CD: Continuous Delivery kubectl apply -f xxx-stg.yaml kubectl apply -f xxx-prd.yaml Production Dev, Stage Registry CD のフェーズ 打ちっぱなし ならOKな気がする

Slide 36

Slide 36 text

@capsmalt 36 何かが気になる・・

Slide 37

Slide 37 text

@capsmalt 37 CI/CD Overview - Kubernetes Code Unit Integration CI Pipeline CD Pipeline Hook Commit PR Package Dev, Stage Production ERROR Review Develop LGTM! Registry CI: Continuous Integration CD: Continuous Delivery kubectl apply -f xxx-stg.yaml kubectl apply -f xxx-prd.yaml Production Dev, Stage Registry ・CIツール⽤のSecret(Registry) ・Service Accountにパッチ ・etc. クレデンシャル情報の管理 (セキュリティリスク)

Slide 38

Slide 38 text

@capsmalt 38 CI/CD Overview - Kubernetes Code Unit Integration CI Pipeline CD Pipeline Hook Commit PR Package Dev, Stage Production ERROR Review Develop LGTM! Registry CI: Continuous Integration CD: Continuous Delivery kubectl apply -f xxx-stg.yaml kubectl apply -f xxx-prd.yaml Production Dev, Stage Registry 全てのデプロイ先を考慮した 設定やパイプラインが必要 デプロイ先ごとに異なるマニフェストファイルを作成して・・・ Dev2 たくさんのyaml

Slide 39

Slide 39 text

@capsmalt 39 CI/CD Overview - Kubernetes Code Unit Integration CI Pipeline CD Pipeline Hook Commit PR Package Dev, Stage Production ERROR Review Develop LGTM! Registry CI: Continuous Integration CD: Continuous Delivery kubectl apply -f xxx-stg.yaml kubectl apply -f xxx-prd.yaml Production Dev, Stage Registry イマのK8sクラスターの状態は 本当にあるべき姿なのか︖ パイプラインの中で実⾏したマニフェストファイルはどれ︖︖ 誰かが勝⼿に kubectl set/edit/applyしてない︖︖ kubectl set xxx kubectl edit xxx 失敗 直接イメージ変更

Slide 40

Slide 40 text

@capsmalt 40 GitOps

Slide 41

Slide 41 text

@capsmalt 41 What is GitOps ・「Weaveworks」社によって提唱された CD (Continuous Delivery) の⼿法 ・アプリコードとマニフェストは別に管理する (CI と CD を分離) ・全てのオペレーションは,Gitで⾏う (Pull Requestを起点にする) ・Gitリポジトリ上のK8sマニフェストと実際のK8sクラスターの構成を⼀致させる (GitOps OperatorがK8sコントローラとして担う)

Slide 42

Slide 42 text

@capsmalt 42 GitOps Overview - Kubernetes Code Build Test Release Unit Integration Hook Commit PR Package Dev, Stage Production ERROR Review Develop LGTM! Registry CI マニフェストファイルのアプリ更新 (e.g. イメージタグ更新) PR K8sマニフェスト

Slide 43

Slide 43 text

@capsmalt 43 GitOps やってみた

Slide 44

Slide 44 text

44 デモ環境 Developer Travis CI App Repo IBM Cloud Container Registry IBM Cloud Kubernetes Service Manifest Repo Weave Flux GitHub Sync Build Commit Push Watch Pull

Slide 45

Slide 45 text

45 デモ① • Kubernetesクラスター上で動くチャットボットをGitOpsをつかってリリース - マニフェストは⼿動で更新することもできるが,⾃動化した⽅がベター - CIツールが⾃動的にマニフェストを更新してプルリクエストを作成 Cluster Developer CI Tool App Repo Image Registry 1. Pull Requestのマージ 2. イメージのビルドとPush Manifest Repo GitOps operator 3. Pull Requestの⾃動作成 5. イメージの デプロイ 4. マニフェストの更新の検知 6. Pull 4. Pull Requestのマージ

Slide 46

Slide 46 text

46 デモ② • GitOpsとChatOpsを使い,カナリアリリースを⾏う • カナリアリリースとは • 新しい機能を⼀部のユーザー(カナリア)へ先⾏してリリース • リリースのスピード感と,不具合による影響の低減を両⽴するためのリリース⽅法 v1 v2 80% 20% ⼀定の割合のユーザーを 新しいバージョンへ振り分け v1 v2 特定のユーザーを 新しいバージョンへ振り分け Beta版テストに 同意したユーザーなど 今回のデモでは 振り分けにIstio を使ってます

Slide 47

Slide 47 text

47 デモ② • 評価が良ければ全体へ公開 • 問題が発⽣したらロールバック(カナリアをクローズ) Manifest Repo IBM Cloud Kubernetes Service GitOps Operator chatbot 1. 対応を bot と会話 2. botがリポ ジトリを更新 3. Operatorが クラスターを 更新 ChatOps GitOps 1. 対応を bot と会話

Slide 48

Slide 48 text

48 以下は⼩話

Slide 49

Slide 49 text

49 代表的なGitOpsツール • Weave Flux - helmに対応 - イメージの更新を検知する機能がある - 削除には未対応 - どちらかと⾔えばクラスター全体の設定を管理するイメージ • Argo CD - Web UIがある - いろいろなフォーマットに対応 • helm,ksonnet,kustomizeなど - 削除にも対応 - どちらかといえば個々のアプリケーション単位で管理するイメージ • 他にも・・・ - Spinnaker,Jenkins X - kubectl diff,kubectl applyを使って⾃前スクリプトで実装することも可能

Slide 50

Slide 50 text

50 Cluster Weave FluxのAuto Deploy機能 • Weave Fluxがイメージレジストリを監視し,新しいイメージが登録されたら,⾃動的に クラスターにデプロイし,マニフェストも更新してリポジトリに登録する • アプリ毎に有効/無効が選択可能 Developer CI Tool App Repo Image Registry 1. Pull Requestのマージ 2. イメージのビルドとPush Manifest Repo Weave Flux 3. 新しいイメージの検知 5. イメージの デプロイ 4. マニフェストの更新 6. Pull

Slide 51

Slide 51 text

51 GipOpsをやる上での考慮点 • 使⽤するツールの選定 - Weave Flux,Argo CD,Jenkins X,SpinnakerなどのGitOpsツール - 差分検知を⾏うkubediffや,kubectl applyを使って作り込むことも可能 • レプリカ数 - Horizontal Pod Autoscaler(HPA)を利⽤している場合は注意が必要 • 機密情報 - SecretをGit管理するのは適切ではない - SealedSecretやクラウドが提供するKMSを利⽤して保護する • リソースの削除や名前変更 - 削除には未対応 - GitOpsツールによって対応しているものもある - 変更できないリソースや属性に注意 - 名前を変えてしまうと重複してしまったり・・・ • 環境毎にブランチ/ディレクトリ/リポジトリをどのように分けるのか,リポジトリの運⽤とクラス ターへのデプロイ戦略をよく考える必要がある

Slide 52

Slide 52 text

52 ChatOps︓ビジネスチャットの普及 • 先進的なWeb企業を筆頭に,社内コミュニケーションの中⼼がビジネスチャットへと移りつつある - 即時性 - テーマを絞った議論が⾏いやすい • 例えばSlackだとテーマ別に「チャネル」を⽤意することで興味のある⼈が集まる - 会話の履歴を共有しやすい • もうなるべくメールは開きたくない - SlackでできることはSlackでやりたい Software Design 2016年1⽉号

Slide 53

Slide 53 text

53 ChatOpsとは • DevOpsツールや運⽤ツールの情報をチャットに集約し,チャットをインターフェースとして各種の操 作を可能にすることで,システムの開発や運⽤の効率化や⾃動化を⽬指すプラクティス chatbot &

Slide 54

Slide 54 text

54 ChatOpsの適⽤レベル 適⽤前︓ 臨機応変に直接, ⼈同⼠でコミュ ニケーション レベル1: Slackを使うよう になる。重⼤情 報専⽤のチャネ ルを作る。コラ ボレーション ツールで作業を 可視化するよう になる。 レベル2a︓ モニタリング ツールがコラボ レーションツー ルへ通知を⾏う ようになる • イベントの⾃動通 知,インシデント の解決時に通知 レベル2b: ⼿動でコラボ レーションツー ルからモニタリ ングツールの情 報を参照できる ようになる • 構成管理DB (CMDB)の検索, チケットシステム の検索,メトリッ クの検索 レベル3: コラボレーショ ンツール経由で モニタリング ツール同⼠が⾃ 動で連携するよ うになる • チケットやイベン トのステータスの 更新,runbookを実 ⾏して応答を表⽰ レベル4 Botが⼈間やツー ルとコラボレー ションツール内 でやり取りする ようになる • 会話をチケットシ ステムへ繋ぐ, キーワードをモニ ターして更新を返 す,ナレッジベー スの更新など レベル5︓ 認知機能のある 賢いBotになる • 履歴やナレッジを 元にした解決策の 提⽰を⾏う

Slide 55

Slide 55 text

55 ChatOpsとGitOpsのすすめ • ChatOpsとGitOpsは相性が良い - テキスト処理とGitリポジトリへの操作というお決まりのパターンの操作だけでアプリのデプロイや設定変更ができる • 普段アプリを開発しない⼈にもおすすめのチャットボット開発 - チャットのUIを利⽤するため,UIの開発の必要がなく,処理の内容に集中できる - チャットボットフレームワークを利⽤し,⾃動化したい処理⾃体はシェルスクリプトでも記載可能 • いろいろなところで動かせるチャットボット - Kubernetes上で動くPodとして - Serverless - Cloud FoundryやHerokuなどのPaaS - VMやベアメタル chatbot レンジャー

Slide 56

Slide 56 text

56 おうちKubernetesクラスター • ラズパイでKubernetesクラスタを構築する - https://qiita.com/sotoiwa/items/e350579d4c81c4a65260

Slide 57

Slide 57 text

57 CKA/CKAD • Certified Kubernetes Administrator (CKA) 受験ログ - https://qiita.com/sotoiwa/items/3509ca3d18d1bed00dee • Certified Kubernetes Application Developer (CKAD) 受験ログ - https://qiita.com/sotoiwa/items/70cf93ebe2718a3be6b3

Slide 58

Slide 58 text

58 CNCFグッズ

Slide 59

Slide 59 text

59 以下はバックアップ資料

Slide 60

Slide 60 text

60 GitOps︓Kubernetesを使い始めて感じた悩み・・・ • Kubernetesでは1つのアプリをデプロイするのに⼤量の yaml(Kubernetesマニフェスト)が必要 • yamlを書いてkubectl applyしたけど,このyamlはどこで 管理しよう︖ • アプリのソースコードと⼀緒にyamlをGitリポジトリで管 理しよう︕ • CIツール(Jenkinsなど)からアプリをデプロイできるよ うにしよう︕ kind: PersistentVolume kind: PersistentVolumeClaim kind: ConfigMap kind: Secret kind: Ingress kind: Service kind: Deployment apiVersion: apps/v1 metadata: name: liberty spec: selector: matchLabels: app: liberty replicas: 1 ・・・

Slide 61

Slide 61 text

61 CIOps( ≠ GitOps)では解決しない悩み • CIツールが直接Kubernetesへアプリをデプロイする - だれかが⼿動で設定変更しているかもしれない - リポジトリのマニフェストがクラスターに適⽤済みかわからない →リポジトリのマニフェスト=クラスターの状態を保証できない - CIツールが強⼒な権限を持っていてセキュリティリスクとなる - マニフェストを少し変更しただけなのに,アプリのビルドが⾛る Developer CI Tool App & Manifest Repo Image Registry Cluster RW RO RW RO RW RW CI/CD

Slide 62

Slide 62 text

62 GitOps︓Weaveworks社が提唱するKubernetesにおけるContinuous Deliveryのプラクティス • CIとCDを分離する - アプリのリポジトリとマニフェストのリポジトリを分ける - GitOps operatorがリポジトリのマニフェストとクラスターの状態を⼀致させる(Gitリポジトリが正) - ⼿動/CIツールによるkubectl apply(アプリの変更)は⾏わない - 変更はGit上でPull requestオペレーションにより⾏う - CIツールはクラスターへのwrite権限を持たない - マニフェストの変更ではアプリのビルドは⾛らない Developer CI Tool App Repo Image Registry Cluster RW RO RW RO RW Manifest Repo RW GitOps operator RO RW CI CD

Slide 63

Slide 63 text

63 デモ準備 • Slack - #ise-devops-demoチャンネルを開く • ターミナル - Kialiをポートフォワードする - 正常リクエスト - エラーリクエスト - チャットボットリポジトリ - Webアプリリポジトリ • ブラウザ - Chromeをデフォルトブラウザにする - リポジトリ - Kialiをいい感じに表⽰しておく - Webアプリ開いとく

Slide 64

Slide 64 text

Happy Kubernetes Life !! Happy Kubernetes Life !! 64