Kubernetes
  • 序言
  • 基礎入門
    • Kubernetes 簡介
    • Kubernetes 基本概念
    • Kubernetes 101
    • Kubernetes 201
    • Kubernetes 集群
  • 核心原理
    • 核心原理
    • 架構原理
    • 設計理念
    • 核心組件
      • etcd
      • kube-apiserver
      • kube-scheduler
      • kube-controller-manager
      • kubelet
      • kube-proxy
      • kube-dns
      • Federation
      • kubeadm
      • hyperkube
      • kubectl
    • 資源對象
      • Autoscaling
      • ConfigMap
      • CronJob
      • CustomResourceDefinition
      • DaemonSet
      • Deployment
      • Ingress
      • Job
      • LocalVolume
      • Namespace
      • NetworkPolicy
      • Node
      • PersistentVolume
      • Pod
      • PodPreset
      • ReplicaSet
      • Resource Quota
      • Secret
      • SecurityContext
      • Service
      • ServiceAccount
      • StatefulSet
      • Volume
  • 部署配置
    • 部署指南
    • kubectl 安裝
    • 單機部署
    • 特性開關
    • 最佳配置
    • 版本支持
    • 集群部署
      • kubeadm
      • kops
      • Kubespray
      • Azure
      • Windows
      • LinuxKit
      • kubeasz
    • 附加組件
      • Addon-manager
      • DNS
      • Dashboard
      • 監控
      • 日誌
      • Metrics
      • GPU
      • Cluster Autoscaler
      • ip-masq-agent
    • Kubernetes-The-Hard-Way
      • 準備部署環境
      • 安裝必要工具
      • 創建計算資源
      • 配置創建證書
      • 配置生成配置
      • 配置生成密鑰
      • 部署 Etcd 群集
      • 部署控制節點
      • 部署計算節點
      • 配置 Kubectl
      • 配置網絡路由
      • 部署 DNS 擴展
      • 煙霧測試
      • 刪除集群
  • 插件擴展
    • API 擴展
      • Aggregation
      • CustomResourceDefinition
    • 訪問控制
      • 認證
      • RBAC 授權
      • 准入控制
    • Scheduler 擴展
    • 網絡插件
      • CNI
      • Flannel
      • Calico
      • Weave
      • Cilium
      • OVN
      • Contiv
      • SR-IOV
      • Romana
      • OpenContrail
      • Kuryr
    • 運行時插件 CRI
      • CRI-tools
      • Frakti
    • 存儲插件
      • 容器存儲接口 CSI
      • FlexVolume
      • glusterfs
    • 網絡策略
    • Ingress Controller
      • Ingress + Letsencrypt
      • minikube Ingress
      • Traefik Ingress
      • Keepalived-VIP
    • Cloud Provider 擴展
    • Device 插件
  • 服務治理
    • 服務治理
      • 一般準則
      • 滾動升級
      • Helm
      • Operator
      • Service Mesh
      • Linkerd
      • Linkerd2
    • Istio
      • 安裝
      • 流量管理
      • 安全管理
      • 策略管理
      • 度量管理
      • 排錯
      • 社區
    • Devops
      • Draft
      • Jenkins X
      • Spinnaker
      • Kompose
      • Skaffold
      • Argo
      • Flux GitOps
  • 實踐案例
    • 實踐概覽
    • 資源控制
    • 集群高可用
    • 應用高可用
    • 調試
    • 端口映射
    • 端口轉發
    • 用戶管理
    • GPU
    • HugePage
    • 安全
    • 審計
    • 備份恢復
    • 證書輪換
    • 大規模集群
    • 大數據與機器學習
      • Spark
      • Tensorflow
    • Serverless
  • 排錯指南
    • 排錯概覽
    • 集群排錯
    • Pod 排錯
    • 網絡排錯
    • PV 排錯
      • AzureDisk
      • AzureFile
    • Windows 排錯
    • 雲平臺排錯
      • Azure
    • 排錯工具
  • 社區貢獻
    • 開發指南
    • 單元測試和集成測試
    • 社區貢獻
  • 附錄
    • 生態圈
    • 學習資源
    • 國內鏡像
    • 如何貢獻
    • 參考文檔
Powered by GitBook
On this page
  • 公有云配額
  • Etcd 存儲
  • Master 節點大小
  • 爲擴展分配更多資源
  • Kube-apiserver 配置
  • Kube-scheduler 配置
  • Kube-controller-manager 配置
  • Kubelet 配置
  • Docker 配置
  • 節點配置
  • 應用配置
  • 必要的擴展
  • 參考文檔
  1. 實踐案例

大規模集群

Previous證書輪換Next大數據與機器學習

Last updated 1 year ago

Kubernetes v1.6+ 單集群最大支持 5000 個節點,也就是說 Kubernetes 最新穩定版的單個集群支持

  • 不超過 5000 個節點

  • 不超過 150000 個 Pod

  • 不超過 300000 個容器

  • 每臺 Node 上不超過 100 個 Pod

公有云配額

對於公有云上的 Kubernetes 集群,規模大了之後很容易碰到配額問題,需要提前在雲平臺上增大配額。這些需要增大的配額包括

  • 虛擬機個數

  • vCPU 個數

  • 內網 IP 地址個數

  • 公網 IP 地址個數

  • 安全組條數

  • 路由表條數

  • 持久化存儲大小

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 和內存:

以下擴展服務需要增大副本數:

affinity:
 podAntiAffinity:
   requiredDuringSchedulingIgnoredDuringExecution:
   - weight: 100
     labelSelector:
       matchExpressions:
       - key: k8s-app
         operator: In
         values:
         - kube-dns
     topologyKey: kubernetes.io/hostname

Kube-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 等)。

  • 減少鏡像體積,P2P 鏡像分發,預緩存熱點鏡像。

必要的擴展

監控、告警以及可視化(如 Prometheus 和 Grafana)至關重要,推薦部署並開啓。

參考文檔

另外,爲了保證多個副本分散調度到不同的 Node 上,需要爲容器配置 。比如,對 kube-dns,可以增加如下的配置:

開啓 優化 Watch 性能(1.17 GA),客戶端凱伊在 Watch 請求中增加 allowWatchBookmarks=true 來開啓這個特性。

更多內容參考。

Etcd 高可用集群
DNS (kube-dns or CoreDNS)
Kibana
FluentD with ElasticSearch Plugin
FluentD with GCP Plugin
elasticsearch
DNS (kube-dns or CoreDNS)
AntiAffinity
Watch Bookmarks
這裏
如何擴展單個Prometheus實現近萬Kubernetes集群監控
Building Large Clusters
Scaling Kubernetes to 2,500 Nodes
Scaling Kubernetes for 25M users
How Does Alibaba Ensure the Performance of System Components in a 10,000-node Kubernetes Cluster
Architecting Kubernetes clusters — choosing a cluster size
Bayer Crop Science seeds the future with 15000-node GKE clusters