Large Cluster
最后更新于
最后更新于
Kubernetes v1.6 and above can support a single cluster of up to 5000 nodes. This means the latest stable version of Kubernetes can accommodate:
Up to 5000 nodes
Up to 150000 Pods
Up to 300000 containers
No more than 100 Pods per Node
For Kubernetes clusters hosted on public clouds, it's quite common to run into quota issues as the scale increases. It's necessary to request higher quotas from the cloud platform in advance. The quotas that may need to be increased include:
Number of virtual machines
Number of vCPUs
Number of private IP addresses
Number of public IP addresses
Number of security group entries
Number of route table entries
Size of persistent storage
In addition to the standard configuration and using SSD for storage, a separate Etcd cluster for Events is also needed. That is, deploy two separate Etcd clusters and configure kube-apiserver with:
Additionally, the default Etcd storage limit is 2GB, which can be increased with the --quota-backend-bytes
option.
For sizing master nodes, one can refer to AWS's configuration:
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
Scaling within a Kubernetes cluster also requires allocating more resources, including assigning more CPU and memory for the Pods, and increasing the number of container replicas. When the Node's own capacity is too small, it's also necessary to increase the CPU and memory of the Node itself (especially in public cloud platforms).
The following add-on services need more CPU and memory:
The following add-on services need to increase their replica count:
Set --max-requests-inflight=3000
Set --max-mutating-requests-inflight=1000
Set --kube-api-qps=100
Set --kube-api-qps=100
Set --kube-api-burst=100
Set --image-pull-progress-deadline=30m
Set --serialize-image-pulls=false
(requires Docker to use overlay2)
Maximum number of Pods allowed on a single Kubelet node: --max-pods=110
(the default is 110 but can be set according to actual needs)
Set max-concurrent-downloads=10
Use SSD for storage graph=/ssd-storage-path
Preload the pause image, e.g., docker image save -o /opt/preloaded_docker_images.tar
and docker image load -i /opt/preloaded_docker_images.tar
Increase kernel option settings in /etc/sysctl.conf
:
When running Pods, it's also important to follow some best practices such as:
Setting resource requests and limits for containers
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
Protecting critical applications with PodDisruptionBudget, nodeAffinity, podAffinity, and podAntiAffinity.
Preferably managing containers with controllers (such as Deployment, StatefulSet, DaemonSet, Job, etc.).
Reduce image sizes, use P2P for image distribution, pre-cache popular images.
Monitoring, alerting, and visualization tools like Prometheus and Grafana are vital. It's recommended to deploy and enable them.
Moreover, to ensure multiple replicas are scheduled across different Nodes, configure for the containers. For instance, for kube-dns, you can add the following configuration:
Enable to optimize Watch performance (1.17 GA), clients can add allowWatchBookmarks=true
to Watch requests to enable this feature.
More content can be found .