一、節點配額和內核參數調整
對于公有云上的 Kubernetes 集群,規模大了之后很容器碰到配額問題,需要提前在云平臺上增大配額。這些需要增大的配額包括:
-
虛擬機個數
-
vCPU 個數
-
內網 IP 地址個數
-
公網 IP 地址個數
-
安全組條數
-
路由表條數
-
持久化存儲大小
參考gce隨著node節點的增加master節點的配置:
-
1-5 nodes: n1-standard-1
-
6-10 nodes: n1-standard-2
-
11-100 nodes: n1-standard-4
-
101-250 nodes: n1-standard-8
-
251-500 nodes: n1-standard-16
- more than 500 nodes: n1-standard-32
# max-file 表示系統級別的能夠打開的文件句柄的數量, 一般如果遇到文件句柄達到上限時,會碰到"Too many open files"或者Socket/File: Can’t open so many files等錯誤。
fs.file-max=1000000
# 配置arp cache 大小
net.ipv4.neigh.default.gc_thresh1=1024
# 存在于ARP高速緩存中的最少層數,如果少于這個數,垃圾收集器將不會運行。缺省值是128。
# 保存在 ARP 高速緩存中的最多的記錄軟限制。垃圾收集器在開始收集前,允許記錄數超過這個數字 5 秒。缺省值是 512。
net.ipv4.neigh.default.gc_thresh2=4096
# 保存在 ARP 高速緩存中的最多記錄的硬限制,一旦高速緩存中的數目高于此,垃圾收集器將馬上運行。缺省值是1024。
net.ipv4.neigh.default.gc_thresh3=8192
# 以上三個參數,當內核維護的arp表過于龐大時候,可以考慮優化
# 允許的最大跟蹤連接條目,是在內核內存中netfilter可以同時處理的“任務”(連接跟蹤條目)
net.netfilter.nf_conntrack_max=10485760
# 哈希表大小(只讀)(64位系統、8G內存默認 65536,16G翻倍,如此類推)
net.core.netdev_max_backlog=10000
# 每個網絡接口接收數據包的速率比內核處理這些包的速率快時,允許送到隊列的數據包的最大數目。
net.netfilter.nf_conntrack_tcp_timeout_established=300
net.netfilter.nf_conntrack_buckets=655360
# 關于conntrack的詳細說明:https://testerhome.com/topics/7509
# 默認值: 128 指定了每一個real user ID可創建的inotify instatnces的數量上限
fs.inotify.max_user_instances=524288
# 默認值: 8192 指定了每個inotify instance相關聯的watches的上限
fs.inotify.max_user_watches=524288
二、Etcd 數據庫
1、搭建高可用的etcd集群,集群規模增大時可以自動增加etcd節點;
目前的解決方案是使用etcd operator來搭建etcd 集群,operator是CoreOS推出的旨在簡化復雜有狀態應用管理的框架,它是一個感知應用狀態的控制器,通過擴展Kubernetes API來自動創建、管理和配置應用實例。
etcd operator 有如下特性:
- ceate/destroy: 自動部署和刪除 etcd 集群,不需要人額外干預配置。
- resize:可以動態實現 etcd 集群的擴縮容。
- backup:支持etcd集群的數據備份和集群恢復重建
- upgrade:可以實現在升級etcd集群時不中斷服務。
2、配置etcd使用ssd固態盤存儲;
3、設置 —quota-backend-bytes 增大etcd的存儲限制。默認值是 2G;
4、需要配置單獨的 Etcd 集群存儲 kube-apiserver 的 event。
四、Kube APIServer 配置
node節點數量 >= 3000, 推薦設置如下配置:
--max-requests-inflight=3000
--max-mutating-requests-inflight=1000
node節點數量在 1000 — 3000, 推薦設置如下配置:
--max-requests-inflight=1500
--max-mutating-requests-inflight=500
內存配置選項和node數量的關系,單位是MB:
--target-ram-mb=node_nums * 60
五、Pod 配置
在運行 Pod 的時候也需要注意遵循一些最佳實踐,比如:
1、為容器設置資源請求和限制,尤其是一些基礎插件服務
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
在k8s中,會根據pod不同的limit 和 requests的配置將pod劃分為不同的qos類別:
-
Guaranteed
-
Burstable
-
BestEffort
當機器可用資源不夠時,kubelet會根據qos級別劃分遷移驅逐pod。被驅逐的優先級:BestEffort > Burstable > Guaranteed
2、對關鍵應用使用 nodeAffinity、podAffinity 和 podAntiAffinity 等保護,使其調度分散到不同的node上。比如kube-dns 配置:
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- weight: 100
labelSelector:
matchExpressions:
- key: k8s-app
operator: In
values:
- kube-dns
topologyKey: kubernetes.io/hostname
3、盡量使用控制器來管理容器(如 Deployment、StatefulSet、DaemonSet、Job 等)
Kube-scheduler 配置
設置 --kube-api-qps=100 默認值是 50
Kube-controller-manager 配置
設置 --kube-api-qps=100 默認值是20
設置 --kube-api-burst=100 默認值是30
審核編輯 :李倩
-
數據庫
+關注
關注
7文章
3927瀏覽量
66234 -
數據備份
+關注
關注
0文章
59瀏覽量
12049 -
容器
+關注
關注
0文章
511瀏覽量
22456
原文標題:K8S集群優化方向!我看可以從這5個維度著手~
文章出處:【微信號:浩道linux,微信公眾號:浩道linux】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
什么是 K8S,如何使用 K8S
全面提升,阿里云Docker/Kubernetes(K8S) 日志解決方案與選型對比
K8s 從懵圈到熟練 – 集群網絡詳解
Docker不香嗎為什么還要用K8s
簡單說明k8s和Docker之間的關系
K8S集群服務訪問失敗怎么辦 K8S故障處理集錦

切換k8s上下文有多快

k8s是什么意思?kubeadm部署k8s集群(k8s部署)|PetaExpres
K8s多集群管理:為什么需要多集群、多集群的優勢是什么

k8s云原生開發要求

評論