$30 off During Our Annual Pro Sale. View Details »

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.  手軽に世界展開
    Federated Clusters on GKE!
    DevFest Tokyo 2017, Oct 9
    Ryo NAKAMARU, SUPINF Inc. / Rescale, Inc.

    View Slide

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

    View Slide

  3. That has to work around the world

    View Slide

  4. Be fast

    View Slide

  5. And LessOps

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  9. 9

    View Slide

  10. ステップバイステップ

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  19. 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
    にお任せ

    View Slide

  20. という GKE を使って・・

    View Slide

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

    View Slide

  22. 可用性を高める手段

    View Slide

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

    View Slide

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

    View Slide

  25. • ゾーンをまたいだ 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

    View Slide

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

    View Slide

  27. 自動スケーリング
    • 自動スケーリング を 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

    View Slide

  28.     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

    View Slide

  29. そして

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  34.  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

    View Slide

  35.  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 個
    起動して

    View Slide

  36.  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 ..

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  40.  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

    View Slide

  41. Ingress で負荷分散

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide


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

    View Slide

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

    View Slide

  47. HTTP(S) Load Balancing
    47

    View Slide

  48. HTTP(S) Load Balancing
    48

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  52. 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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  56. 実運用のためのヒント

    View Slide

  57. CAUTION .

    View Slide

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

    View Slide

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

    View Slide

  60. Cluster federation 関係ないけど

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  65. 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

    View Slide

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

    View Slide

  67. 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": {
    ..

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  72. 情報収集

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  78. Presented by

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  82. ご静聴ありがとうございました :)
    参考文献:
    • 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

    View Slide