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

federated-cluster-on-gke

 federated-cluster-on-gke

DevFest Tokyo 2017 でお話しした GKE クラスタを世界中に展開して管理するお話しです

ryo nakamaru

October 09, 2017
Tweet

More Decks by ryo nakamaru

Other Decks in Technology

Transcript

  1. 何が起きているの? • 各国のユーザから 一番近い クラスタがサービスを提供している • グローバルな Web サービスを提供する ひとつ

    の方法として • 複数クラスタを管理する フェデレーション制御プレーン を利用 • Google Cloud らしい方法 でグローバルに負荷分散している 8
  2. 9

  3. Kubernetes • オープンソースのコンテナ管理プラットフォーム • コンテナは Pod という抽象単位で管理される • Pod のデプロイ、ロールバック、監視、再起動、スケールなどが楽

    • コンテナのホストである node、それを管理する master で構成 • Google Cloud なら master の管理を代行してくれる GKE が便利 12
  4. Kubernetes 14 master API server node node node pod pod

    アプリケーションや 管理用コンテナが それぞれ起動
  5. Kubernetes 15 GUI Web .. CLI kubectl .. master API

    server node node node pod 2 個 起動して
  6. 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 にお任せ
  7. • ゾーンをまたいだ 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
  8. $ gcloud container clusters create tokyo --num-nodes 2 \ --zone

    “asia-northeast1-a" --additional-zones “asia-northeast1-b,asia-northeast1-c" 複数ゾーン 26
  9. 自動スケーリング • 自動スケーリング を 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
  10.     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
  11. 各国にクラスタを作る .. ? • これまでは・・ ‣ クラスタを各国で起動 ‣ HTTP(S) Load

    Balancing のバックエンドに逐一追加 ‣ or Route53 のレンテンシベースルーティングを利用など • k8s には複数クラスタのサポートないの? • あるよ、Google Cloud と統合された クラスタフェデレーション がね 31
  12.  Cluster Federation • フェデレーション制御プレーン (FCP) を起動し • 各クラスタをそこに参加させると • FCP

    が ‣ 配下クラスタの状況を随時把握し ‣ 自身が受けた API コールを配下クラスタに(いい感じに)伝播させる 33
  13.  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
  14.  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 個 起動して
  15.  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 ..
  16.  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
  17. Service • 各アプリケーションへのエンドポイント • 特定 IP アドレス + ポートで サービスとして受けたリクエストを

     クラスタのどこかで起動している Pod へ転送してくれる • GKE ならサービス定義で type: LoadBalancer を指定すれば  L4 の LB で簡単にサービスを外部公開できるものの、  Cluster Federation では L7 を使うので NodePort を指定 42
  18. Ingress 43 • クラスタ外部 からのアクセスを受け付ける • GKE なら GCE Load-Balancer

    Controller というアドオンのおかげで • Ingress を作るだけで、各 k8s リソースがよしなに関連づいた  L7 ロードバランサ + 各種関連 GCP リソースが作られる (控えめに言って最高)
  19. しかも Cluster Federation 下なら .. • Federation API Server に

     “Service 作って〜” とか “Ingress 作って〜” と依頼するだけで • 配下の 全クラスタ で同一のサービスが作られ • 1 つの L7 ロードバランサに 全クラスタが入る 44
  20. 45 たった 1 度 の 命令で 1 つ の L7

    ロードバランサに 全クラスタ のインスタンスグループが入る
  21. HTTP(S) Load Balancing 46 • L7 ロードバランサ • 複数リージョンでも 単一

    IP アドレスで 負荷分散が可能 • バックエンド自動切替えで、障害時フェイルオーバ/復旧時リバランス • パスベースで、バックエンドサービス ( k8s の Service ) を指定可能
  22. HTTP(S) Load Balancing 49 • Premium ティア のネットワーク必須(デフォルト) • Standard

    ティアで作るとリージョナルなロードバランサに ‣ リージョンごとに 1 IP 必要 ‣ フォワーディングルールもリージョンごと ‣ アジアからの配信 ~10 TB $0.11/GB (Premium アジア内通信 $0.12/GB)
  23. 静的外部 IP アドレス • HTTP(S) Load Balancing へ割り当てれば IP を固定できる

    • compute addresses create --gl で で グローバル × 静的 な IP を確保! • リージョナルな IP アドレスだと L7LB のバックエンドサービスとして  異なるリージョンのインスタンスグループを同時に指定できない・・ (Ingress が作るデフォルトの外部 IP は、リージョナル × 動的) 51 $ compute addresses create --global
  24. 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
  25. Zero Downtime Deployments • Federation API サーバに向かって話すのが、通常の GKE と唯一の違い •

    単一クラスタの時と同じ指示 で OK ‣ Deployment でのローリングアップデート ‣ Deployment と Service を組み合わせて Blue/Green デプロイ 54
  26. Cluster Federation 設定の注意点 58 • Cloud DNS を使う スコープ を

    FCP クラスタに渡す必要がある • type: NodePort ‣ Ingress が全リージョンのクラスタへ同一ポートで通信できるように ‣ service の `nodePort` は明示的に指定する必要がある • TLS 自動化に難あり: kube-lego などに頼れない証明書管理 • Authorized Networks(GKE)で接続元を縛るのも厳しい・・
  27. そもそも大域的な負荷分散・・必要? 59 • 監視、運用コストの増加に見合うだけの展開理由はあるのか・・ • Google Premium ネットワークそもそも強い ‣ CDN

    挟めばよりレイテンシは下がる • データどこに持つの問題もでてくる ‣ Firestore? Spanner? Cloud Storage?
  28. 自動スケーリングの注意点 61 • node 自動スケーリング ‣ 前提に注意。例) 全コンテナリスケジュール → 瞬断の可能性

    ‣ https://cloud.google.com/container-engine/docs/cluster-autoscaler • pod 自動スケーリング ‣ ローリングアップデートするなら Deployment 経由が必須 • 設計は容易ではなく、簡単に可用性が向上するわけではない・・
  29. パスベースルーティングの注意点 62 • 前方一致(not 完全一致)でバックエンドに流したい ‣ Nginx では起きないが GLBC では起きる問題

    ‣ `path: /foo/*` と `path: /foo/*` を 2 つ定義すればOK • GCS への静的コンテンツルーティング ‣ Ingress から作った LB を編集できが、Ingress を更新すると・・ • ingress.kubernetes.io/rewrite-target: / ‣ prefix を外してバックエンドに流したい時のアノテーション
  30. FAQ Q. Federation API サーバにはどう繋ぐのがいいの? A. そもそも FCP が落ちても稼働中サービスには影響がない ので

     NodePort + Firewall で接続元を縛るくらいでいいかも (ただし kubefed で作ってしまうと type: LoadBalancer)  FCP クラスタはプリエンプティブインスタンスでも十分かも 64
  31. 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
  32. FAQ Q. ロードバランサで IPv6 を受けるには? A. 別途 v6 の静的グローバル IP

    を取得し、   Ingress から通常通り v4 で作ったロードバランサの設定を変更。 66 $ gcloud compute addresses create ipv6 --ip-version IPV6 --global
  33. 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": { ..
  34. FAQ Q. ログの収集って何か特別なの必要? A. フェデレーション下でもデフォルトでは Stackdriver に流れる。  クラスタでフィルタする / しない

    もあり、ログ確認も捗る。  コンテキストや時系列ごとに情報をまとめたい時などは  Cloud SDK などで必要な整形を施してから転送することも可能。  いずれにしても世界中の情報が簡単に集約できる Stackdriver とても楽! 68
  35.  Cloud Endpoints 71 先日 Cloud Endpoints への 愛を語ってきました GKE でも使っていきたい

    https://speakerdeck.com/pottava/ cd-for-rest-apis-on-gae-with- cloud-endpoints-and-openapi
  36. 中丸 良 @pottava • Google Certified Professional - Cloud Architect

    • CTO at SUPINF Inc • Solutions Architect at Rescale, Inc. Profile 79
  37. Containerize your app! 80 • クラウド / コンテナ を強みにした受託開発運用、コンサルティング •

    2015 年から Docker の本番運用を開始・豊富な CI / CD 事例 • スピンフ、と読みます・・
  38. Cloud HPC with 81 • クラウド HPC シミュレーションプラットフォームの提供 • 2011

    年初頭に設立、Peter Thiel や Microsoft から出資 • スケーラブルなシミュレーションや機械学習を!
  39. ご静聴ありがとうございました :) 参考文献: • 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