Scaling Kubernetes to Over 4k Nodes and 200k Pods

Scaling Kubernetes to Over 4k Nodes and 200k Pods

PayPalはApache MesosからKubernetesへ移行しようとしていて、ただパフォーマンスチューニングでは大変苦労したことを記事にしてくれました。
Apache Mesosでは簡単に1万Nodeまでスケールアウトしましたが、Kubernetesでなかなか負荷テストが通らなかったそうです。色々やった結果は4000止まり。
ちなみに負荷テストツールはk-benchを利用していました。

テスト環境:
ーGCP
ーWorker Nodeスペック:4CPU、最大40Pod
ー規模:3つMaster Node、3つNodeのetcdクラスター、4100 Worker Node、20万Pod

API Serverのボトルネック ーー 504 gatewayタイムアウト
max-mutating-requests-inflight と max-requests-inflightを調整しないとAPIの利用率ガバナ制限にひっかかることがわかった

Controller Managerのボトルネック
こちらもいつくかの利用率制限があるので、下記3つ調整を行った
kube-api-qps -- The number of queries the controller manager could make to the API server in a given second.
kube-api-burst -- The controller manager burst, which is additional concurrent calls above kube-api-qps.
concurrent-deployment-syncs -- Concurrency in the synchronization call for objects like deployment, replicaset, etc.

Scheduler
etcdの性能に引っ張られていて、throughput rateが100にした。なお、leader electionも調整した。

etcd
diskの性能は一番のボトルネックらしいので、gcpのlocal ssdにした。
なお、raftロギングについてwrite-ahead logging と 毎回fsync(!)のため、write barrierを無効にした。
デファウトのMVCC DB サイズは 2 GBで全然足りないため、20万Podのために、8GBにした。
最後にetcd serverをshardingしたことで、やっとまあまあなパフォーマンスが得られた。

参考のためのk8s cluster概念図