大規模集群
Kubernetes v1.6+ 單集群最大支持 5000 個節點,也就是說 Kubernetes 最新穩定版的單個集群支持
- 不超過 5000 個節點 
- 不超過 150000 個 Pod 
- 不超過 300000 個容器 
- 每臺 Node 上不超過 100 個 Pod 
公有云配額
對於公有云上的 Kubernetes 集群,規模大了之後很容易碰到配額問題,需要提前在雲平臺上增大配額。這些需要增大的配額包括
- 虛擬機個數 
- vCPU 個數 
- 內網 IP 地址個數 
- 公網 IP 地址個數 
- 安全組條數 
- 路由表條數 
- 持久化存儲大小 
Etcd 存儲
除了常規的 Etcd 高可用集群配置、使用 SSD 存儲等,還需要爲 Events 配置單獨的 Etcd 集群。即部署兩套獨立的 Etcd 集群,並配置 kube-apiserver
--etcd-servers="http://etcd1:2379,http://etcd2:2379,http://etcd3:2379" \
--etcd-servers-overrides="/events#http://etcd4:2379,http://etcd5:2379,http://etcd6:2379"另外,Etcd 默認存儲限制爲 2GB,可以通過 --quota-backend-bytes 選項增大。
Master 節點大小
可以參考 AWS 配置 Master 節點的大小:
- 1-5 nodes: m3.medium 
- 6-10 nodes: m3.large 
- 11-100 nodes: m3.xlarge 
- 101-250 nodes: m3.2xlarge 
- 251-500 nodes: c4.4xlarge 
- more than 500 nodes: c4.8xlarge 
爲擴展分配更多資源
Kubernetes 集群內的擴展也需要分配更多的資源,包括爲這些 Pod 分配更大的 CPU 和內存以及增大容器副本數量等。當 Node 本身的容量太小時,還需要增大 Node 本身的 CPU 和內存(特別是在公有云平臺上)。
以下擴展服務需要增大 CPU 和內存:
以下擴展服務需要增大副本數:
另外,爲了保證多個副本分散調度到不同的 Node 上,需要爲容器配置 AntiAffinity。比如,對 kube-dns,可以增加如下的配置:
affinity:
 podAntiAffinity:
   requiredDuringSchedulingIgnoredDuringExecution:
   - weight: 100
     labelSelector:
       matchExpressions:
       - key: k8s-app
         operator: In
         values:
         - kube-dns
     topologyKey: kubernetes.io/hostnameKube-apiserver 配置
- 設置 - --max-requests-inflight=3000
- 設置 - --max-mutating-requests-inflight=1000
Kube-scheduler 配置
- 設置 - --kube-api-qps=100
Kube-controller-manager 配置
- 設置 - --kube-api-qps=100
- 設置 - --kube-api-burst=100
Kubelet 配置
- 設置 - --image-pull-progress-deadline=30m
- 設置 - --serialize-image-pulls=false(需要 Docker 使用 overlay2 )
- Kubelet 單節點允許運行的最大 Pod 數: - --max-pods=110(默認是 110,可以根據實際需要設置)
Docker 配置
- 設置 - max-concurrent-downloads=10
- 使用 SSD 存儲 - graph=/ssd-storage-path
- 預加載 pause 鏡像,比如 - docker image save -o /opt/preloaded_docker_images.tar和- docker image load -i /opt/preloaded_docker_images.tar
節點配置
增大內核選項配置 /etc/sysctl.conf:
fs.file-max=1000000
net.ipv4.ip_forward=1
net.netfilter.nf_conntrack_max=10485760
net.netfilter.nf_conntrack_tcp_timeout_established=300
net.netfilter.nf_conntrack_buckets=655360
net.core.netdev_max_backlog=10000
net.ipv4.neigh.default.gc_thresh1=1024
net.ipv4.neigh.default.gc_thresh2=4096
net.ipv4.neigh.default.gc_thresh3=8192
net.netfilter.nf_conntrack_max=10485760
net.netfilter.nf_conntrack_tcp_timeout_established=300
net.netfilter.nf_conntrack_buckets=655360
net.core.netdev_max_backlog=10000
fs.inotify.max_user_instances=524288
fs.inotify.max_user_watches=524288應用配置
在運行 Pod 的時候也需要注意遵循一些最佳實踐,比如
- 爲容器設置資源請求和限制 - spec.containers[].resources.limits.cpu
- spec.containers[].resources.limits.memory
- spec.containers[].resources.requests.cpu
- spec.containers[].resources.requests.memory
- spec.containers[].resources.limits.ephemeral-storage
- spec.containers[].resources.requests.ephemeral-storage
 
- 對關鍵應用使用 PodDisruptionBudget、nodeAffinity、podAffinity 和 podAntiAffinity 等保護。 
- 儘量使用控制器來管理容器(如 Deployment、StatefulSet、DaemonSet、Job 等)。 
- 開啓 Watch Bookmarks 優化 Watch 性能(1.17 GA),客戶端凱伊在 Watch 請求中增加 - allowWatchBookmarks=true來開啓這個特性。
- 減少鏡像體積,P2P 鏡像分發,預緩存熱點鏡像。 
- 更多內容參考這裏。 
必要的擴展
監控、告警以及可視化(如 Prometheus 和 Grafana)至關重要,推薦部署並開啓。
參考文檔
Last updated
