Slide 1

Slide 1 text

 手軽に世界展開 Federated Clusters on GKE! DevFest Tokyo 2017, Oct 9 Ryo NAKAMARU, SUPINF Inc. / Rescale, Inc.

Slide 2

Slide 2 text

世界規模でのサービス展開

Slide 3

Slide 3 text

That has to work around the world

Slide 4

Slide 4 text

Be fast

Slide 5

Slide 5 text

And LessOps

Slide 6

Slide 6 text

GKE クラスタ構成 + 環境変数を見てみよう デモ

Slide 7

Slide 7 text

各国からの接続結果 https://www.geoscreenshot.com 7

Slide 8

Slide 8 text

何が起きているの? • 各国のユーザから 一番近い クラスタがサービスを提供している • グローバルな Web サービスを提供する ひとつ の方法として • 複数クラスタを管理する フェデレーション制御プレーン を利用 • Google Cloud らしい方法 でグローバルに負荷分散している 8

Slide 9

Slide 9 text

9

Slide 10

Slide 10 text

ステップバイステップ

Slide 11

Slide 11 text

今日のお話 • Kubernetes • Google Container Engine (GKE) • クラスタフェデレーション • HTTP(S) Load Balancing • 運用上の課題など 11

Slide 12

Slide 12 text

Kubernetes • オープンソースのコンテナ管理プラットフォーム • コンテナは Pod という抽象単位で管理される • Pod のデプロイ、ロールバック、監視、再起動、スケールなどが楽 • コンテナのホストである node、それを管理する master で構成 • Google Cloud なら master の管理を代行してくれる GKE が便利 12

Slide 13

Slide 13 text

Kubernetes 13 master node node node コンテナを 起動する人 node を 管理する人

Slide 14

Slide 14 text

Kubernetes 14 master API server node node node pod pod アプリケーションや 管理用コンテナが それぞれ起動

Slide 15

Slide 15 text

Kubernetes 15 GUI Web .. CLI kubectl .. master API server node node node pod 2 個 起動して

Slide 16

Slide 16 text

Kubernetes 16 GUI Web .. CLI kubectl .. master API etcd server node node node

Slide 17

Slide 17 text

Kubernetes 17 master API controller manager etcd server node node node CLI kubectl .. GUI Web ..

Slide 18

Slide 18 text

Kubernetes pod 18 master API controller manager etcd server node node node CLI kubectl .. pod GUI Web ..

Slide 19

Slide 19 text

GKE GCE instance group GKE managed Google Container Engine (GKE) 19 Kubernetes master API controller manager etcd server node node node CLI kubectl .. GUI Web .. Google Cloud にお任せ

Slide 20

Slide 20 text

という GKE を使って・・

Slide 21

Slide 21 text

21 「サービス落とさないでね」

Slide 22

Slide 22 text

可用性を高める手段

Slide 23

Slide 23 text

Pod の自動修復 • k8s は 指定したレプリカ数、コンテナが動くよう調整してくれる • livenessProbe: 異常時に強制的な再起動が可能 • readinessProbe: リクエスト受付可能な時だけ Service 下に 23

Slide 24

Slide 24 text

ノードの自動修復 • ノードの自動修復(β 機能)を enable でクラスタを作ると  ノードプール全体で自動修復機能が有効に  参考: github.com/kubernetes/node-problem-detector 24 $ gcloud container clusters create ${cluster_name} \ --enable-autorepair

Slide 25

Slide 25 text

• ゾーンをまたいだ node の冗長化 (master のゾーン冗長化 + SLO 99.99% は現在アーリーアクセスを募集中) • 各ゾーンに num-nodes 台のインスタンスが起動 複数ゾーン 25 $ gcloud container clusters create ${cluster_name} \ --zone "${region}-a" --additional-zones “${region}-b,${region}-c" \ --num-nodes 1

Slide 26

Slide 26 text

$ gcloud container clusters create tokyo --num-nodes 2 \ --zone “asia-northeast1-a" --additional-zones “asia-northeast1-b,asia-northeast1-c" 複数ゾーン 26

Slide 27

Slide 27 text

自動スケーリング • 自動スケーリング を enable でクラスタを作ると  スケジュールされるすべてのポッドに実行場所が割り当たるよう  クラスタサイズ が自動変更される。pod ではなく node のスケール。  参考: github.com/kubernetes/autoscaler/tree/master/cluster-autoscaler 27 $ gcloud container clusters create ${cluster_name} \ --enable-autoscaling --min-nodes=1 --max-nodes=5

Slide 28

Slide 28 text

    Horizontal Pod Autoscaling 28 • CPU 使用率に応じて Pod 数が伸縮する。こちらは node でなく pod。  GKE v1.8 以降では CPU 使用率以外のカスタムリソースに対応予定。  参考: github.com/kubernetes/autoscaler/tree/master/cluster-autoscaler $ kubectl autoscale deployment ${deployment_name} \ --cpu-percent=70 --min=1 --max=2

Slide 29

Slide 29 text

そして

Slide 30

Slide 30 text

30 「世界中、応答は 100 ms 以内で」

Slide 31

Slide 31 text

各国にクラスタを作る .. ? • これまでは・・ ‣ クラスタを各国で起動 ‣ HTTP(S) Load Balancing のバックエンドに逐一追加 ‣ or Route53 のレンテンシベースルーティングを利用など • k8s には複数クラスタのサポートないの? • あるよ、Google Cloud と統合された クラスタフェデレーション がね 31

Slide 32

Slide 32 text

 Cluster Federation • 代替案の存在、実際の効果はさておいて・・ • 狙いは ‣ エンドユーザに最も近いクラスタを応答させ、レイテンシを下げたい ‣ 世界規模でサービスの可用性を高めたい ‣ もしくは複数のクラウド、オンプレミスで冗長化したい 32

Slide 33

Slide 33 text

 Cluster Federation • フェデレーション制御プレーン (FCP) を起動し • 各クラスタをそこに参加させると • FCP が ‣ 配下クラスタの状況を随時把握し ‣ 自身が受けた API コールを配下クラスタに(いい感じに)伝播させる 33

Slide 34

Slide 34 text

 Cluster Federation 34 GUI Web .. CLI kubectl .. etcd Federation control plane Federation API server controller manager Federation Cluster 1 API etcd server master API etcd server Cluster 2 master FCP

Slide 35

Slide 35 text

 Cluster Federation 35 GUI Web .. CLI kubectl .. etcd Federation control plane Federation API server Cluster 1 API server master API server Cluster 2 master FCP pod 20 個 起動して

Slide 36

Slide 36 text

 Cluster Federation 36 etcd Federation control plane Federation API server controller manager Federation Cluster 1 API etcd server master API etcd server Cluster 2 master FCP pod 10 個 起動して pod 10 個 起動して pod 20 個 起動して CLI kubectl .. GUI Web ..

Slide 37

Slide 37 text

 Cluster Federation 37 ※ FCP はどこかの   クラスタにさえ   入っていれば OK!

Slide 38

Slide 38 text

 Cluster Federation その作り方 ⇨ https://github.com/pottava/k8s-federated-clusters 38

Slide 39

Slide 39 text

 Cluster Federation • 公式にサポートされた機能ではありません(SLA 対象外) • が、GKE として各 GCP サービスと絶賛統合中 ‣ Federated な Ingress と HTTP(S) Load Balancing ‣ Federated DNS と Cloud DNS ‣ .. 39

Slide 40

Slide 40 text

 Google will support .. ! 40 “Google Container Engine - Kubernetes 1.8 takes advantage of the cloud built for containers“ https://cloudplatform.googleblog.com/ 2017/09/google-container-engine- kubernetes-18.html

Slide 41

Slide 41 text

Ingress で負荷分散

Slide 42

Slide 42 text

Service • 各アプリケーションへのエンドポイント • 特定 IP アドレス + ポートで サービスとして受けたリクエストを  クラスタのどこかで起動している Pod へ転送してくれる • GKE ならサービス定義で type: LoadBalancer を指定すれば  L4 の LB で簡単にサービスを外部公開できるものの、  Cluster Federation では L7 を使うので NodePort を指定 42

Slide 43

Slide 43 text

Ingress 43 • クラスタ外部 からのアクセスを受け付ける • GKE なら GCE Load-Balancer Controller というアドオンのおかげで • Ingress を作るだけで、各 k8s リソースがよしなに関連づいた  L7 ロードバランサ + 各種関連 GCP リソースが作られる (控えめに言って最高)

Slide 44

Slide 44 text

しかも Cluster Federation 下なら .. • Federation API Server に  “Service 作って〜” とか “Ingress 作って〜” と依頼するだけで • 配下の 全クラスタ で同一のサービスが作られ • 1 つの L7 ロードバランサに 全クラスタが入る 44

Slide 45

Slide 45 text

45 たった 1 度 の 命令で 1 つ の L7 ロードバランサに 全クラスタ のインスタンスグループが入る

Slide 46

Slide 46 text

HTTP(S) Load Balancing 46 • L7 ロードバランサ • 複数リージョンでも 単一 IP アドレスで 負荷分散が可能 • バックエンド自動切替えで、障害時フェイルオーバ/復旧時リバランス • パスベースで、バックエンドサービス ( k8s の Service ) を指定可能

Slide 47

Slide 47 text

HTTP(S) Load Balancing 47

Slide 48

Slide 48 text

HTTP(S) Load Balancing 48

Slide 49

Slide 49 text

HTTP(S) Load Balancing 49 • Premium ティア のネットワーク必須(デフォルト) • Standard ティアで作るとリージョナルなロードバランサに ‣ リージョンごとに 1 IP 必要 ‣ フォワーディングルールもリージョンごと ‣ アジアからの配信 ~10 TB $0.11/GB (Premium アジア内通信 $0.12/GB)

Slide 50

Slide 50 text

「IP アドレス固定してね ♪」

Slide 51

Slide 51 text

静的外部 IP アドレス • HTTP(S) Load Balancing へ割り当てれば IP を固定できる • compute addresses create --gl で で グローバル × 静的 な IP を確保! • リージョナルな IP アドレスだと L7LB のバックエンドサービスとして  異なるリージョンのインスタンスグループを同時に指定できない・・ (Ingress が作るデフォルトの外部 IP は、リージョナル × 動的) 51 $ compute addresses create --global

Slide 52

Slide 52 text

52 Ingress with static IP • あとは以下のような定義で Ingress を作れば OK!  `my-external-ip` という名前の 外部 IP アドレス が LB に使われます apiVersion: extensions/v1beta1 kind: Ingress metadata: name: my-ingress annotations: kubernetes.io/ingress.global-static-ip-name: "my-external-ip" kubernetes.io/ingress.class: "gce" spec: backend: serviceName: my-service servicePort: 80

Slide 53

Slide 53 text

「無停止アップデートいける?」

Slide 54

Slide 54 text

Zero Downtime Deployments • Federation API サーバに向かって話すのが、通常の GKE と唯一の違い • 単一クラスタの時と同じ指示 で OK ‣ Deployment でのローリングアップデート ‣ Deployment と Service を組み合わせて Blue/Green デプロイ 54

Slide 55

Slide 55 text

デモ 全世界のサービスを一挙に v2.0 へアップデート! 55

Slide 56

Slide 56 text

実運用のためのヒント

Slide 57

Slide 57 text

CAUTION .

Slide 58

Slide 58 text

Cluster Federation 設定の注意点 58 • Cloud DNS を使う スコープ を FCP クラスタに渡す必要がある • type: NodePort ‣ Ingress が全リージョンのクラスタへ同一ポートで通信できるように ‣ service の `nodePort` は明示的に指定する必要がある • TLS 自動化に難あり: kube-lego などに頼れない証明書管理 • Authorized Networks(GKE)で接続元を縛るのも厳しい・・

Slide 59

Slide 59 text

そもそも大域的な負荷分散・・必要? 59 • 監視、運用コストの増加に見合うだけの展開理由はあるのか・・ • Google Premium ネットワークそもそも強い ‣ CDN 挟めばよりレイテンシは下がる • データどこに持つの問題もでてくる ‣ Firestore? Spanner? Cloud Storage?

Slide 60

Slide 60 text

Cluster federation 関係ないけど

Slide 61

Slide 61 text

自動スケーリングの注意点 61 • node 自動スケーリング ‣ 前提に注意。例) 全コンテナリスケジュール → 瞬断の可能性 ‣ https://cloud.google.com/container-engine/docs/cluster-autoscaler • pod 自動スケーリング ‣ ローリングアップデートするなら Deployment 経由が必須 • 設計は容易ではなく、簡単に可用性が向上するわけではない・・

Slide 62

Slide 62 text

パスベースルーティングの注意点 62 • 前方一致(not 完全一致)でバックエンドに流したい ‣ Nginx では起きないが GLBC では起きる問題 ‣ `path: /foo/*` と `path: /foo/*` を 2 つ定義すればOK • GCS への静的コンテンツルーティング ‣ Ingress から作った LB を編集できが、Ingress を更新すると・・ • ingress.kubernetes.io/rewrite-target: / ‣ prefix を外してバックエンドに流したい時のアノテーション

Slide 63

Slide 63 text

「まだわからないことばかり・・」

Slide 64

Slide 64 text

FAQ Q. Federation API サーバにはどう繋ぐのがいいの? A. そもそも FCP が落ちても稼働中サービスには影響がない ので  NodePort + Firewall で接続元を縛るくらいでいいかも (ただし kubefed で作ってしまうと type: LoadBalancer)  FCP クラスタはプリエンプティブインスタンスでも十分かも 64

Slide 65

Slide 65 text

FAQ Q. ロードバランサで HTTPS を受けるには? A. フェデレーション下では kube-lego などがうまく動作しないため   証明書を取得し、ロードバランサのフロントエンドから直接編集。 65 例)$ certbot certonly --manual --domain your-domain.com \     --email [email protected] \     --agree-tos --manual-public-ip-logging-ok \     --preferred-challenges dns

Slide 66

Slide 66 text

FAQ Q. ロードバランサで IPv6 を受けるには? A. 別途 v6 の静的グローバル IP を取得し、   Ingress から通常通り v4 で作ったロードバランサの設定を変更。 66 $ gcloud compute addresses create ipv6 --ip-version IPV6 --global

Slide 67

Slide 67 text

FAQ Q. クラスタごとにレプリカの配置を設定できたりするの? A. 67 apiVersion: extensions/v1beta1 kind: Deployment metadata: name: my-deploy annotations: federation.kubernetes.io/replica-set-preferences: | { "rebalance": true, "clusters": { "cluster-asia-northeast1": { "minReplicas": 2, "maxReplicas": 10, "weight": 1 }, "cluster-asia-east1": { ..

Slide 68

Slide 68 text

FAQ Q. ログの収集って何か特別なの必要? A. フェデレーション下でもデフォルトでは Stackdriver に流れる。  クラスタでフィルタする / しない もあり、ログ確認も捗る。  コンテキストや時系列ごとに情報をまとめたい時などは  Cloud SDK などで必要な整形を施してから転送することも可能。  いずれにしても世界中の情報が簡単に集約できる Stackdriver とても楽! 68

Slide 69

Slide 69 text

FAQ Q. メトリクスやトレース情報の収集は? A. デフォルト --enable-cloud-monitoring & --enable-cloud-endpoints。  カスタムな値も必要なら取れるが、初期状態でもメトリクスは豊富。  運用するサービスが OpenAPI に準拠した REST API なら  Pod にサイドカーコンテナを入れれば Cloud Endpoints 連携も簡単 69

Slide 70

Slide 70 text

 Cloud Endpoints 70 世界中のアクセス状況などが、こんな情報として集約されます!

Slide 71

Slide 71 text

 Cloud Endpoints 71 先日 Cloud Endpoints への 愛を語ってきました GKE でも使っていきたい https://speakerdeck.com/pottava/ cd-for-rest-apis-on-gae-with- cloud-endpoints-and-openapi

Slide 72

Slide 72 text

情報収集

Slide 73

Slide 73 text

プレミアムサポートの検討 73 問い合わせた言語 で応答がきます。対応時間もチェックしておきましょう!

Slide 74

Slide 74 text

コミュニティの Slack Team に入ろう GCPUG https://goo.gl/qiGfsY 日本語の圧倒的安心感 その後 Twitter で職人探しが捗る 74

Slide 75

Slide 75 text

コミュニティの Slack Team に入ろう Google Cloud Platform Community https://gcp-slack.appspot.com/ 詳しい人だらけ 同じ悩みの人もきっといる 75

Slide 76

Slide 76 text

Podcast を聞こう 76 毎週 1 エピソード 通勤中 iPhone で 毎週冒頭の 5 分 だけでも有用

Slide 77

Slide 77 text

他にもあるこんな情報源 77 YouTube、Medium、Cloud OnAir ..

Slide 78

Slide 78 text

Presented by

Slide 79

Slide 79 text

中丸 良 @pottava • Google Certified Professional - Cloud Architect • CTO at SUPINF Inc • Solutions Architect at Rescale, Inc. Profile 79

Slide 80

Slide 80 text

Containerize your app! 80 • クラウド / コンテナ を強みにした受託開発運用、コンサルティング • 2015 年から Docker の本番運用を開始・豊富な CI / CD 事例 • スピンフ、と読みます・・

Slide 81

Slide 81 text

Cloud HPC with 81 • クラウド HPC シミュレーションプラットフォームの提供 • 2011 年初頭に設立、Peter Thiel や Microsoft から出資 • スケーラブルなシミュレーションや機械学習を!

Slide 82

Slide 82 text

ご静聴ありがとうございました :) 参考文献: • Kubernetes Cluster Federation (The Hard Way) ( https:// github.com/kelseyhightower/kubernetes-cluster-federation ) • Cluster Federation and Global Load Balancing on Kubernetes and Google Cloud - Part 1 ( https://medium.com/google-cloud/ planet-scale-microservices-with-cluster-federation-and-global-load- balancing-on-kubernetes-and-a8e7ef5efa5e ) • https://www.youtube.com/watch?v=kmPBm-TQBSE