Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

GKEで半年運用してみた

gcp ja night #31 での発表資料です。
http://gcpja.connpass.com/event/23874/

[補足記事]
http://qiita.com/na_ga/items/d89b320ba098a0941043
http://qiita.com/na_ga/items/7c3cc3f52dd4068fd319

Related Books

Free with a 30 day trial from Scribd

See all
  • Be the first to comment

GKEで半年運用してみた

  1. 1. GKEで半年運用してみた Katsutoshi Nagaoka
 
 gcp ja night #31 (2016/01/21) #gcpja
  2. 2. 永岡 克利 (Katsutoshi Nagaoka) • 2011年 CyberAgent 中途入社 • 社内向け基盤システムの開発・運用 • 現在、ライブ配信サービス「takusuta」を立ち上げ、運用中 • エンジニア • #java #cassandra … • #golang #node.js #mongodb #aws #gcp … @na_ga About me
  3. 3. Outline • takusuta 紹介 • GKE ざっくり説明 • takusuta における GKE の活用例 • まとめ
  4. 4. takusuta 紹介
  5. 5. ライブ配信サービス takusuta iOS & Android App
 2015/07 ~
  6. 6. ライブ配信サービス takusuta https://takusuta.com/ on GKE
 2015/08 ~ iOS & Android App
 2015/07 ~
  7. 7. • API • EC2 • S3 • Web • GKE • S3 構成 AWS Route53 CloudFront S3 EC2 MongoDBELB BigQuery GCP GKEGCE-LB Aerospike
  8. 8. GKE 採用に至るまで • 2015/07 • iOS, Android アプリ公開 • S3 の Static Content でペライチな Web ページ • nodejs + riot による SEO 対策した Web ページを作ることに • ちょうど kubernetes v1.0.0 がリリースされた • 近いうちに GKE も GA になりそうな • どうせ作るなら… 一旦 Web だけワンチャン使ってみたい • 2015/08 • GKE is Generally Available • Web ページリニューアル
  9. 9. GKE について
  10. 10. GKE とは • Kubernetes のフルマネージドサービス • Docker コンテナの管理ツール • GCE 上に Kubernetes Cluster を構築 • クラスタのリサイズ • コンテナのグルーピング • コンテナの自動配置 • コンテナのリサイズ • コンテナの負荷分散 出典: http://kubernetes.io/
  11. 11. GKE の料金 • すごい安い • Cluster の各 Node 料金は GCE 料金が適用 • Cluster の料金は Node 数によって異なる • 5 Node までは無料 • 6 Node 以上で $0.15 hour / cluster • $108 month / cluster
  12. 12. GKE の用語 • Pod • コンテナのグループ • 1コンテナ以上で作成 • Replication Controller (RC) • Pod のレプリカ管理 • 管理下の Pod のリサイズを担当 Pod GKE Node Pod Pod GKE Node Pod Pod Pod RC Management Pod Replica
  13. 13. GKE の用語 • Pod • コンテナのグループ • 1コンテナ以上で作成 • Replication Controller (RC) • Pod のレプリカ管理 • 管理下の Pod のリサイズを担当 • Service • Pod に対する LB みたいなやつ • iptables で DNAT → kube-proxy Pod GKE Node Pod Pod GKE Node Pod Pod Pod Service RC Layer4 Load Balancer
  14. 14. GKE における構成
  15. 15. 単体構成 • GKE • tkst-service (type: LoadBalancer)
 設定された Global IP で公開される
 現状では Layer4 のみサポート tkst-pod GKE NODE GKE NODE tkst-service tkst-rc tkst-pod User Admin https://takusuta.com
  16. 16. 単体構成 • GKE • tkst-service (type: LoadBalancer)
 設定された Global IP で公開される
 現状では Layer4 のみサポート
 • Service に証明書を設定できない tkst-pod GKE NODE GKE NODE tkst-service tkst-rc tkst-pod User Admin https://takusuta.com
  17. 17. 単体構成 • GKE • tkst-service (type: LoadBalancer)
 設定された Global IP で公開される
 現状では Layer4 のみサポート
 • Service に証明書を設定できない • 各 Pod に証明書を持たせる tkst-pod GKE NODE GKE NODE tkst-service tkst-rc tkst-pod User Admin https://takusuta.com
  18. 18. 単体構成 • GKE • tkst-service (type: LoadBalancer)
 設定された Global IP で公開される
 現状では Layer4 のみサポート
 • Service に証明書を設定できない • 各 Pod に証明書を持たせる • 非効率的なので避けたい tkst-pod GKE NODE GKE NODE tkst-service tkst-rc tkst-pod User Admin https://takusuta.com
  19. 19. GCE-LB と組み合わせた構成 • GKE • tkst-service (type: NodePort)
 各 Node が Service に設定した
 ポートでリクエストを受け付ける tkst-pod GKE NODE GKE NODE tkst-service tkst-rc tkst-pod User tkst-backend tkst-url-map GCE-HTTPS-LB https://takusuta.com Admin
  20. 20. GCE-LB と組み合わせた構成 • GKE • tkst-service (type: NodePort)
 各 Node が Service に設定した
 ポートでリクエストを受け付ける
 • GCE-LB に証明書を設定する tkst-pod GKE NODE GKE NODE tkst-service tkst-rc tkst-pod User tkst-backend tkst-url-map GCE-HTTPS-LB https://takusuta.com Admin
  21. 21. GCE-LB と組み合わせた構成 • GKE • tkst-service (type: NodePort)
 各 Node が Service に設定した
 ポートでリクエストを受け付ける
 • GCE-LB に証明書を設定する • GKE の Instance Group と
 ポートを Backend として指定する tkst-pod GKE NODE GKE NODE tkst-service tkst-rc tkst-pod User tkst-backend tkst-url-map GCE-HTTPS-LB https://takusuta.com Admin
  22. 22. Cross Region LB 構成 • 米国からは US Region tkst-pod GKE NODE GKE NODE tkst-service tkst-rc tkst-pod User from US tkst-backend-us tkst-url-map Cross-Region HTTPS-LB https://takusuta.com tkst-pod GKE NODE GKE NODE tkst-service tkst-rc tkst-pod tkst-backend-asia
  23. 23. Cross Region LB 構成 • 日本からは Asia Region tkst-pod GKE NODE GKE NODE tkst-service tkst-rc tkst-pod User from Japan tkst-backend-us https://takusuta.com tkst-pod GKE NODE GKE NODE tkst-service tkst-rc tkst-pod tkst-backend-asia tkst-url-map Cross-Region HTTPS-LB
  24. 24. Cross Region LB 構成 • 利用率や Rate で自動切り替え • ex: CPU 80% tkst-pod GKE NODE GKE NODE tkst-service tkst-rc tkst-pod User from Japan tkst-backend-us https://takusuta.com tkst-pod GKE NODE GKE NODE tkst-service tkst-rc tkst-pod tkst-backend-asia tkst-url-map Cross-Region HTTPS-LB
  25. 25. Region/zone の選択 • Zone によって差異がある • Haswell [2013 ] • Ivy Bridge [2012 ] • Sandy Bridge [2011 ] • Asia Region は同じなので
 気にしなくて ok 出典: https://cloud.google.com/compute/docs/zones
  26. 26. GKE の構築
  27. 27. Google Cloud SDK • Google 社製の GCP 管理ツール群 • gcloud • Cluster の作成/管理 • kubectl • RC の作成/管理 • Service の作成/管理
  28. 28. Cluster の作成 # create cluster
 $ gcloud container clusters create "tkst-asia-001" 
 --num-nodes 3 --zone "asia-east1-b" --machine-type "n1-highcpu-4" 
 --scope "compute-rw","storage-ro","bigquery","logging-write","monitoring"
 
 • cluster 作成時しか設定できない項目がある • num-nodes は cluster 作成後もオンラインで変更できる • 現時点では num-nodes 以外の項目は cluster 作成後に変更できない
 • 特に scope は後々面倒になるので注意が必要 • GKE から Fluentd などで BigQuery に流し込む為には bigquery scope が必須 • 直近使う予定がなくても、とりあえず付けといた方が良い

  29. 29. Cluster の取得 # describe cluster
 $ gcloud container clusters describe tkst-asia-001
 
 currentNodeCount: 3 currentMasterVersion: 1.1.4 currentNodeVersion: 1.1.4 initialClusterVersion: 1.1.4 nodeConfig: diskSizeGb: 100 machineType: n1-highcpu-4 oauthScopes: - https://www.googleapis.com/auth/bigquery - https://www.googleapis.com/auth/compute - https://www.googleapis.com/auth/devstorage.read_only - https://www.googleapis.com/auth/logging.write - https://www.googleapis.com/auth/monitoring nodeIpv4CidrSize: 24 status: RUNNING zone: asia-east1-b
  30. 30. Image のアップロード # build docker image
 $ docker build .
 
 # upload docker image to Google Container Registry (GCR)
 $ docker tag -f tkst/tkst asia.gcr.io/xxxxx/tkst:1.9.3
 $ gcloud docker push asia.gcr.io/xxxxx/tkst:1.9.3
 
 • GCR はホスト名でアップロード先リージョンを指定できる • asia.gcr.io: asia リージョン • us.gcr.io: us リージョン • eu.gcr.io: european リージョン
  31. 31. RC の作成 # create replication controller
 $ cat << EOS > ./tkst-rc.json; kubectl create -f ./tkst-rc.json { "kind": "ReplicationController", "apiVersion": "v1", "metadata": { "name": "tkst-rc", "labels": { "name": "tkst-rc" } }, "spec": { "replicas": 3, "selector": { "name": "tkst-rc-pods" }, "template": { "metadata": { "labels": { "name": "tkst-rc-pods" } }, "spec": { "containers": [ { "name": "tkst-container", "image": "asia.gcr.io/xxxxx/tkst:1.9.3", "ports": [ { "containerPort":3000, "protocol":"TCP" } ] } ] } } } } EOS
  32. 32. RC の取得 # get replication controller
 $ kubectl get rc CONTROLLER CONTAINER(S) IMAGE(S) SELECTOR REPLICAS tkst-rc tkst asia.gcr.io/xxxxx/tkst:1.9.3 name=tkst-rc-pods 3 
 
 # describe replication controller
 $ kubectl describe rc tkst-rc Name: tkst-rc Namespace: default
 Image(s): asia.gcr.io/xxxxx/tkst:1.9.3 Selector: name=tkst-rc-pods Labels: name=tkst-rc Replicas: 3 current / 3 desired Pods Status: 3 Running / 0 Waiting / 0 Succeeded / 0 Failed No volumes.
 Events: FirstSeen LastSeen Count Reason Message ───────── ──────── ───── ────── ─────── 25m 25m 1 SuccessfulCreate Created pod: tkst-rc-5gghw 25m 25m 1 SuccessfulCreate Created pod: tkst-rc-b59cv
 25m 25m 1 SuccessfulCreate Created pod: tkst-rc-qw4da
  33. 33. Pod の取得 # get pod
 $ kubectl get pod NAME READY STATUS RESTARTS AGE tkst-rc-1tjlf 1/1 Running 0 25m tkst-rc-5zogh 1/1 Running 0 25m tkst-rc-kpujg 1/1 Running 0 25m
 
 # describe pod
 $ kubectl describe pod tkst-rc-1tjlf Name: tkst-rc-1tjlf Namespace: default Image(s): asia.gcr.io/xxxxx/tkst:1.9.3 Node: gke-tkst-asia-001-a48fb14f-node-crjc/10.240.0.18 Start Time: Thu, 21 Jan 2016 06:03:50 +0900 Labels: name=tkst-rc-pods Status: Running IP: 10.184.2.3 Replication Controllers: tkst-rc (3/3 replicas created)
  34. 34. Pod への接続 # attach pod
 $ kubectl attach pod tkst-rc-1tjlf 
 # get pod log
 $ kubectl logs -f tkst-rc-1tjlf # get pod log (with content name) $ kubectl logs -f tkst-rc-1tjlf -c tkst-node-container {"level":"info","message":"use memcached store [options={"hosts":["10.240.0.4:11211 {"level":"debug","message":"try to update site-maps cache.","label":"dev","timestamp": {"level":"debug","message":"cache update scheduler started. key=sitemap","label":"dev" {"level":"info","message":"[middleware_access_logger] setup with options {"tag":"ta {"level":"info","message":"[WEB] Append route. path={"twitter":"/explore/auth/twitt {"level":"info","message":"[WEB] Append route. path="/explore/logout"","label":"web_ {"level":"info","message":"[WEB] Append route. path="/ping"","label":"web_dev","time {"level":"info","message":"[WEB] Append route. path="/"","label":"web_dev","timestam ...
  35. 35. Service の作成 # create service
 $ cat << EOS > ./tkst-srv.json; kubectl create -f ./tkst-srv.json { "kind": "Service", "apiVersion": "v1", "metadata": { "name": "tkst-srv", "labels": { "name": "tkst-srv" } }, "spec": { "type": "NodePort", "ports": [ { "port": 3000, "targetPort": 3000, "nodePort": 30000 } ], "selector": { "name": "tkst-rc-pods" } } } EOS
  36. 36. Service の取得 # get service
 $ kubectl get service NAME CLUSTER_IP EXTERNAL_IP PORT(S) SELECTOR tkst-srv 10.119.246.120 nodes 3000/TCP name=tkst-rc-pods kubernetes 10.119.240.1 <none> 443/TCP <none> 
 
 # describe service
 $ kubectl describe service tkst-srv Name: tkst-srv Namespace: default Labels: name=tkst-srv Selector: name=tkst-rc-pods Type: NodePort IP: 10.119.246.120 Port: 3000/TCP NodePort: 30000/TCP Endpoints: 10.116.0.3:3000,10.116.2.3:3000 Session Affinity: None No events.
  37. 37. HTTPS-LB の作成 # create backend
 $ gcloud beta compute backend-services create "tkst-backend" 
 —-protocol HTTP --port-name "tkst-port" --http-health-check "tkst-check"
 
 # add backend resource 
 $ gcloud beta compute backend-services add-backend "tkst-backend" --instance-group "${GKE_INSTANCE_GROUP}" 
 # create url maps $ gcloud beta compute url-maps create "tkst-https-lb" 
 --default-service "tkst-backend" # create target https proxy $ gcloud beta compute target-https-proxies create "tkst-https-lb-proxy" 
 --url-map "tkst-https-lb" 
 --ssl-certificate "${SSL_CERTIFICATE}"
 
 # create forwarding rule $ gcloud beta compute forwarding-rules create "tkst-https-lb-forward" 
 --global --address "${LB_GLOBAL_IP}" --port-range "443" 
 --target-https-proxy "tkst-https-lb-proxy"
  38. 38. takusuta における GKE 活用例
  39. 39. 用途によって Cluster を別ける • 大きなクラスターは作らない • 5 ノード以下は無料 • 最大ノード数は 250 まで(少し前は 100 までだった) • 同じ Pod でまとめた方がキャパシティ制御しやすい
  40. 40. 用途によって Cluster を別ける • ennis-asia-app-001 cluster • num-nodes: 5, machine-type: n1-highcpu-4 • service: ennis-asia-app-srv (type=NodeType, 30000), • rc: ennis-asia-app-rc (replica=10 )
 • ennis-asia-nginx-001 cluster • num-nodes: 3, machine-type: n1-highcpu-2 • service: ennis-asia-nginx-srv (type=NodeType, 30080, 30443) • rc: ennis-asia-nginx-rc (replica=3 )
  41. 41. Cluster の命名規則ぽい奴 • ennis-asia-app-001 • ennis: プロジェクトの chord name • asia: 配置する region • app: 稼働させる container の名称 • 001: ユニークにするための連番(なんでも良い)
 • Cluster の machine-type をオンラインで変更はサポートされていない • 現状だと新しく Cluster を作成して GCE-LB を切り替える • 高い頻度で Cluster を再構築 (使い捨て) している
  42. 42. Cluster の命名規則ぽい奴 • ennis-asia-app-001 • ennis: プロジェクトの chord name • asia: 配置する region • app: 稼働させる container の名称 • 001: ユニークにするための連番(なんでも良い)
 • Cluster の machine-type をオンラインで変更はサポートされていない • 現状だと新しく Cluster を作成して GCE-LB を切り替える • 高い頻度で Cluster を再構築 (使い捨て) している • Instance Templates の更新 API が無い … (́・ω・`)
  43. 43. Multi Container Pod • ennis-app pod • 用途 • Web アプリケーションコンテナ • 全てのログは 127.0.0.1:24224 を経由して BigQuery に投げている • コンテナ • API (ennis-node-con, TCP:3000, 3001) • Fluentd (ennis-fluentd-con, TCP:24224)

  44. 44. Multi Container Pod # get service list $ kubectl get service NAME CLUSTER_IP EXTERNAL_IP PORT(S) SELECTOR ennis-app-srv 10.187.254.39 nodes 3000/TCP,3001/TCP name=ennis-app-rc-pods kubernetes 10.187.240.1 <none> 443/TCP <none> # get replication controller list
 $ kubectl get rc CONTROLLER CONTAINER(S) IMAGE(S) ennis-app-rc-1453323827 ennis-node-con asia.gcr.io/xxxxx/ennis-node:1.9.5 ennis-fluentd-con asia.gcr.io/xxxxx/fluentd-aggregator:1.0.1 # get pod list $ kubectl get pod NAME READY STATUS RESTARTS AGE ennis-app-rc-1453323827-0ampm 2/2 Running 0 2h ennis-app-rc-1453323827-5xvfk 2/2 Running 0 2h ennis-app-rc-1453323827-gvr4z 2/2 Running 0 2h
  45. 45. Single Container Pod • ennis-nginx pod  • 用途 • GCE-LB の Default Backend として設定する • url-maps に該当しないリクエストは nginx 経由で転送させる • ex: http(s)://107.178.243.152/ → https://takusuta.com/ • コンテナ • Nginx (ennis-nginx-proxy-con, TCP:80)

  46. 46. Single Container Pod # get service list $ kubectl get service NAME CLUSTER_IP EXTERNAL_IP PORT(S) SELECTOR ennis-nginx-srv 10.107.251.130 nodes 80/TCP name=ennis-nginx-rc-pods kubernetes 10.107.240.1 <none> 443/TCP <none> # get replication controller list
 $ kubectl get rc CONTROLLER CONTAINER(S) IMAGE(S) ennis-nginx-rc ennis-nginx-proxy-con asia.gcr.io/xxxxx/nginx-proxy:1.0.2 # get pod list $ kubectl get pod NAME READY STATUS RESTARTS AGE ennis-nginx-rc-3byoj 1/1 Running 0 7h ennis-nginx-rc-i6dbs 1/1 Running 0 7h ennis-nginx-rc-sefai 1/1 Running 0 7h
  47. 47. Sample : Dockerfile # nginx-proxy Dockerfile $ cat ./nginx-proxy/Dockerfile FROM takusuta/nginx-1.8.0 MAINTAINER Katsutoshi Nagaoka <katsutoshi.nagaoka@gmail.com> USER root ENV HOME /root WORKDIR /root # Define default command. CMD ["bash"] # Generate script. ADD generate-nginx-proxy-conf.sh /usr/local/sbin/generate-nginx-proxy-conf.sh # Staring nginx. EXPOSE 80 CMD /usr/local/sbin/generate-nginx-proxy-conf.sh && nginx -g "daemon off;"
  48. 48. Sample : Dockerfile # generate nginx-proxy config script $ cat ./nginx-proxy/generate-nginx-proxy-conf.sh #!/bin/sh if [ "x${ENNIS_WEB_DOMAIN}" = "x" ] ; then echo "Invalid parameter, ENNIS_WEB_DOMAIN is empty”; exit 1 fi cat << EOS > /etc/nginx/conf.d/nginx-proxy.conf server { listen 80; server_name _; location ~^/ping$ { access_log off; return 200; } location / { return 301 https://${ENNIS_WEB_DOMAIN}$request_uri; } } EOS
  49. 49. Sample : RC # create ennis-nginx replication controller
 $ cat << EOS > ./${NGINX_RC_NAME}.json && kubectl create -f ./${NGINX_RC_NAME}.json { "kind": "ReplicationController",
 "apiVersion": "v1", "metadata": { "name": "${NGINX_RC_NAME}", "labels": { "name": "${NGINX_RC_NAME}" } }, "spec": { "replicas": 3, "selector": { "name": "${NGINX_POD_NAME}" }, "template": { "metadata": { "labels": { "name": "${NGINX_POD_NAME}" } }, "spec": { "containers": [ { "name": “ennis-nginx-proxy-con", "image": "${GCR_DOMAIN}/${PROJECT_ID}/nginx-proxy:${TAG}", "env": [ { "name": "ENNIS_WEB_DOMAIN", "value": "${DOMAIN}" } ], "ports": [ { "containerPort":80, "protocol":"TCP" } ] } ... EOS
  50. 50. Sample : Service # create ennis-nginx service
 $ cat << EOS > ./${NGINX_SRV_NAME}.json && kubectl create -f ./${NGINX_RC_NAME}.json { "kind": "Service", "apiVersion": "v1", "metadata": { "name": "${NGINX_SRV_NAME}", "labels": { "name": "${NGINX_SRV_NAME}" } }, "spec": { "type": "NodePort", "ports": [ { "port": 80, "targetPort": 80, "nodePort": 30080, "protocol": "TCP" } ], "selector": { "name": "${NGINX_POD_NAME}" } } } EOS
  51. 51. GCR への最速アップロード • GCE 上の Jenkins でイメージのビルド & アップロードをしている • 同じ Google ネットワーク内のため最速で GCR にアップロード可能 • タグ切り → CI → Jenkins (build & upload & release) ← hubot • GCR が落ちたなどの障害は今の所、経験なし
  52. 52. GCR への最速アップロード • GCE 上の Jenkins でイメージのビルド & アップロードをしている • 同じ Google ネットワーク内のため最速で GCR にアップロード可能 • タグ切り → CI → Jenkins (build & upload & release) ← hubot • GCR が落ちたなどの障害は今の所、経験なし • GCR 上にアップロードした古いイメージの削除に若干難あり • そのうち改善されるはず…
  53. 53. RC の無停止アップデート • kubectl rolling-update コマンドでリリース作業をしている • 新旧 RC の各 Pod を一台ずつ inc/dec してくれる • single container Pod は非常に簡単
 kubectl rolling-update [old-rc-name] [new-image-url]
 • multi container Pod は分かり難い • kubectl rolling-update [old-rc-name] -f [new-rc-json] • rc name に "-unixtime" などを追記し、
 selector と metadata も同様に version: "unixtime" などを入れる • ex: ennis-asia-app-rc → ennis-asia-app-rc-1453323016
  54. 54. RC の無停止アップデート # create multi container pod schema JSON for rolling update
 $ RC_NAME=tkst-rc $ RC_CREATED=$(Date +'%s') 
 $ RC_UNIQUE_NAME=${RC_NAME}-${RC_CREATED} 
 $ cat << EOS | kubectl rolling-update ${RC_CURRENT_NAME} -f - { "kind": "ReplicationController", "metadata": { "name": "${RC_UNIQUE_NAME}", "labels": { "name": "${RC_UNIQUE_NAME}" } }, "spec": { "selector": { "name": "${RC_NAME}-pods", "version": "${RC_CREATED}" }, "template": { "metadata": { "labels": { "name": "${RC_NAME}-pods", "version": "${RC_CREATED}" } }, "spec": { "containers": [ { ... }, { ... }, ... ], ... EOS
  55. 55. Cluster / RC のスケール • gcloudコマンドで node を制御できる • gcloud compute instance-groups managed 
 resize [gke-cluster-instance-group] --size [num] • kubectl scale コマンドで replica を制御できる • kubectl scale rc [rc-name] --replicas=[num] • RC のオートスケールも実装されたが、まだ使い道が浮かんでこない
  56. 56. Cloud Logging によるログ管理 • GKE は各 Pod の標準出力を Cloud Logging に投げている  • ログの集約及び閲覧をリアルタイムに実現できる • 最近 GKE フィルターが付いて益々便利になった
  57. 57. Cloud Logging によるログ管理 • GKE は各 Pod の標準出力を Cloud Logging に投げている  • ログの集約及び閲覧をリアルタイムに実現できる • 最近 GKE フィルターが付いて益々便利になった • 標準機能だとノイズが多く若干不便 • app container から CL の REST API を直接叩いている (winston-gcl) • ログ名、レベルによるフィルターも効くのでもっと便利に • 負荷急騰時は、一旦 CL を見る体勢
  58. 58. Cloud Monitoring による死活監視 • イマなら StackDriver を無料で使える • 元々AWS の死活監視に使用していたので違和感なし • Alert 時は Slack とメールでの通知を行っている
  59. 59. Cloud Monitoring による死活監視 • イマなら StackDriver を無料で使える • 元々AWS の死活監視に使用していたので違和感なし • Alert 時は Slack とメールでの通知を行っている • GKE Container リソースで取得可能な metrics が少ない • 古い GKE Cluster の場合 StackDriver agent から取得できない • GKE Cluster をアップデート (or 作り直し) で正常に取得できる • 足りない箇所は各 container から custom metrics を送信している
  60. 60. Kubernetes dashboard • 標準機能の簡易ダッシュボード • そんなに信用してないし、あまり見ていない • 使いにくい https://xxx.xxx.xxx.xxx/api/v1/proxy/namespaces/kube-system/services/kube-ui
  61. 61. • 結構使える子 • https://github.com/kubernetes/kubedash • Cloud Monitoring は重い… • パッと確認するのに便利 • インストールも簡単 kubedash https://xxx.xxx.xxx.xxx/api/v1/proxy/namespaces/kube-system/services/kubedash
  62. 62. まとめ
  63. 63. GKEで半年運用してみて… • 簡単 & 安い & 期待 • 細かいところは幾つかあるが、本番環境で問題なく利用できてる • ここ数ヶ月で Cloud Logging の GKE 連携改善など色々キテル • GKE のドキュメントは少ないが、kubernetes docs で事足りる
 • GKE によるコンテナ管理は非常に魅力的で、積極的に使っていきたい • 出来るだけシンプルに使う・複雑な構成はしない
  64. 64. チートシート # pod
 $ kubectl get pod $ kubectl describe pod [pod-name] $ kubectl attach [pod-name] $ kubectl logs [-f] [pod-name] [-c container-name] # replication controller
 $ kubectl get rc $ kubectl describe rc [rc-name] $ kubectl rolling-update [rc-name] [new-image-url] $ kubectl rolling-update [rc-name] -f [new-rc-schema-json-file-path] $ kubectl scale rc [rc-name] --replicas=[num] # service
 $ kubectl service service $ kubectl describe service [service-name] # cluster
 $ kubectl cluster-info $ gcloud compute instance-groups managed resize [gke-cluster-instance-group] --size [num]
  65. 65. ご静聴ありがとうございました

×