Google Kubernetes Engine
関連ページ:
Getting Started
Documentation
- https://cloud.google.com/kubernetes-engine/docs/?hl=ja
- https://cloud.google.com/kubernetes-engine/quotas?hl=ja
ベストプラクティス
- Best Practices for Operating Containers | Architectures | Google Cloud
- Logging, etc.
- Kubernetes best practices: terminating with grace | Google Cloud Blog
仕様
Quota
https://cloud.google.com/kubernetes-engine/quotas
Last updated at 2020-04-13
- GKEクラスタごと
- クラスタあたりの最大ノード数: 5,000
- ノードプールあたりの最大ノード数: 1,000
- ノードあたりの最大ポッド数: 110
限定公開クラスタ
Documents:
- 限定公開クラスタの設定 | Kubernetes Engine のドキュメント | Google Cloud
- https://cloud.google.com/sdk/gcloud/reference/container/clusters/create?hl=ja
- Example GKE Setup | Cloud NAT | Google Cloud
要点:
- ノードは内部IPアドレスのみを持つため、インターネットから隔離される
- 限定公開クラスタでは、マスターへのアクセスを制御できる
- LB経由で受信トラフィックを受けられる。また、内部LB経由でVPC内のトラフィックを受けることもできる
- 外と通信したいときは、上記の「Example GKE Setup」にあるように、Cloud NAT + Cloud Routerをセットアップする
Tips:
- (2019-12-02現在)
gcloud container clusters create
コマンドでは--enable-private-nodes --master-ipv4-cidr <CIDR>
オプションをつける
制限事項
限定公開クラスタの作成 | Kubernetes Engine ドキュメント | Google Cloud#要件、制約、制限
- エイリアスIP範囲が有効なVPCネイティブクラスタである必要がある
Horizontal Pod Autoscaler
HPA.
参考:
- https://sites.google.com/site/progrhymetechwiki/software/k8s#TOC-Horizontal-Pod-Autoscaler
- Autoscaling K8s HPA with Google HTTP/S Load-Balancer RPS EXTERNAL Stackdriver Metrics
コンテナネイティブの負荷分散
コンテナ ネイティブの負荷分散を使用する | Kubernetes Engine のドキュメント | Google Cloud
TL;DR:
- ネットワークエンドポイントグループ(NEG)を作成して、Podに均等にトラフィックを分配できる
- 従来の方式だとインスタンスグループ経由のアクセスで、iptablesを介してPodにアクセスしており、余分なネットワークオーバーヘッドが発生していた
既知の問題(2020-04-27時点):
- GKEのガベージコレクションが2分間隔なので、LBが完全に削除される前にクラスタが削除された場合、NEGを手動で削除する必要がある
- Podのreadinessフィードバックを使っていない場合、ワークロードをデプロイするときや再起動するときに、ワークロードの更新完了に要する時間よりも、新しいエンドポイントの伝播に要する時間のほうが長くなる場合がある
VPCネイティブクラスタ
VPC ネイティブ クラスタを作成する | Kubernetes Engine ドキュメント | Google Cloud
2020-05-04現在、GCPコンソールから作成する場合はデフォルトでVPCネイティブクラスタになるが、REST APIやgcloudコマンドではルートベースクラスタになるので注意。
2つのやり方がある:
- 既存のサブネットにクラスタを作成する。アドレス範囲の割り当て方は下の2つ:
- GKE管理のセカンダリ範囲割り当て
- ユーザー管理のセカンダリ範囲割り当て
- クラスタとサブネットを同時に作成する。セカンダリアドレス範囲の割り当てはGKE管理となる
セキュリティ
クラスタのセキュリティの強化 | Kubernetes Engine ドキュメント | Google Cloud
Secretリソースへのアクセスを制限する
いずれか:
- IAMで
container.secrets.*
の権限を与えない
roles/container.viewer
なら権限なしroles/container.developer
なら権限あり
- RBACで権限制御する
参考:
最小権限のGoogleサービスアカウント
- 前提として、Compute Engineのデフォルトサービスアカウントを使わないようにする
- カスタムサービスアカウントには、最低でも以下の権限が必要:
- monitoring.viewer
- monitoring.metricWriter
- logging.logWriter
How-to
アップグレード
https://cloud.google.com/kubernetes-engine/docs/how-to/upgrading-a-cluster
Tips:
- リリースチャネルを指定することで、自動アップグレードできる
kubeconfigエントリを生成
gcloud container clusters get-credentials [CLUSTER_NAME] [--project PROJECT] [--region REGION]
↑のコマンドは更に、クラスタをデフォルトのkubectlのcontextに設定する。
参考:
ノードプールを作り直す
マシンタイプやサービスアカウントを変えるときなどには、ノードプールの作り直しが発生する。
次の要領でやれば良い:
- 新しいプールを作成
- ワークロードを新しいプールに移行
- 古いプールを削除
ドキュメントでは、 異なるマシンタイプへのワークロードの移行 | Kubernetes Engine のチュートリアル | Google Cloud の手順に従う形になる。
ただし、この手順に愚直に従うとドレインした瞬間に旧プール上のPodがevictionされ、サービス停止することもあり得るので、常時稼働のワークロードであれば、cordonでノードへのスケジューリングを停止した後、Podをスケールさせて新しいプールにPodが配置された後にドレインした方がよさそう。
GKEのノードにSSH
- 高度な方法によるインスタンスへの接続 | Compute Engine ドキュメント | Google Cloud
- 限定公開クラスターのGKEノードにサクッとSSHする方法 - Qiita
- GKE で k8s クラスタの node に ssh する - Qiita
参考:
メンテナンス時間枠と除外枠の設定
メンテナンスの時間枠と除外の構成 | Kubernetes Engine ドキュメント | Google Cloud
- クラスタやノードのアップグレードが行われる時間枠を設定可能。
- (たぶん)最短4時間
Docker Hubのイメージを使うには?
公開イメージだったら普通に使える。
プライベートなイメージでも認証情報を渡せば普通に使えるんじゃないかな。
MEMO:
- 日本語の記事だとミラーしたり、GCRにpushしてる例が多い
参考:
- Google Cloud Kubernetes accessing private Docker Hub hosted images - Stack Overflow
- Images - Kubernetes
- docker hub with kubernetes in GKE
- Using Images from a Private Registry on GKE - Engineering Tomorrow’s Systems
- hawksnowlog: Google Container Engine に Dockerhub で公開しているイメージをデプロイする方法
ワークロードを特定のnodepoolで実行する
GKEのノードはnodepoolを表すラベルとして cloud.google.com/gke-nodepool: <nodepool名>
が設定されている。
これを用いて、nodeSelector、またはNode Affinityを設定する。
参考:
Topics
Logging
マルチテナント運用
ロギング
Tips:
- ログシンクを使って、テナントごとにログバケットを分割することができる
- namespaceによるフィルタを使うことになる