当前位置: 首页 > 科技观察

如何优化Kubernetes集群?看看这五个维度

时间:2023-03-14 10:08:41 科技观察

1.节点配额和内核参数的调整对于公有云上的Kubernetes集群,当规模较大时,很多容器都会遇到配额问题,需要在云平台上增加配额提前。这些需要增加的配额包括:虚拟机数量、vCPU数量、内网IP地址数量、公网IP地址数量、安全组数量、路由表数量、持久化存储数量,参考gce为node节点数增加,master节点数配置:1-5个节点:n1-standard-16-10个节点:n1-standard-211-100个节点:n1-standard-4101-250个节点:n1-standard-8251-500个节点:n1-standard-16500个以上节点:n1-standard-32参考阿里云配置:#max-file表示系统级可以打开的文件句柄数。一般如果文件句柄达到上限,会遇到“Toomanyopenfiles”或者Socket/File:Can'topensomanyfiles等错误。fs.file-max=1000000#Configurearpcachesizenet.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可以同时处理的任务thekernelmemory”(Connectiontrackingentry)net.netfilter.nf_conntrack_max=10485760#Hashtablesize(read-only)(64位系统,8G内存默认为65536,16G双打,以此类推)net.core.netdev_max_backlog=10000#每个网络当接口接收数据包的速度超过内核处理速度时允许排队的最大数据包数。net.netfilter.nf_conntrack_tcp_timeout_established=300net.netfilter.nf_conntrack_buckets=655360#关于conntrack的详细说明:https://testerhome.com/topics/7509#默认值:128指定每个realuserID可以创建的inotifyinstatnces个数上limitfs.inotify.max_user_instances=524288#默认值:8192指定每个inotify实例关联watch的上限fs.inotify.max_user_watches=524288二、etcd数据库1、搭建一个高可用的etcd集群。当集群规模增大时,可以自动增加etcd节点;目前的解决方案是使用etcdoperator搭建etcd集群。Operator是CoreOS推出的一个框架,用于简化复杂有状态应用程序的管理。它是一个感知应用程序状态并自动扩展KubernetesAPI的控制器。创建、管理和配置应用程序实例。etcdoperator具有以下特性:ceate/destroy:自动部署和删除etcd集群,无需额外的人工干预。resize:可以动态实现etcd集群的扩缩容。backup:支持etcd集群的数据备份和集群恢复重建。upgrade:可实现etcd集群升级时服务不中断。2.配置etcd使用SSD存储;3.设置--quota-backend-bytes增加etcd的存储限制。默认值为2G;4.需要配置一个单独的Etcd集群来存储kube-apiserver事件。4、KubeAPIServer配置节点数>=3000,推荐配置如下:--max-requests-inflight=3000--max-mutating-requests-inflight=1000。节点数在1000到3000之间,推荐配置如下:--max-requests-inflight=1500--max-mutating-requests-inflight=500内存配置选项与节点数的关系,unitisMB:--target-ram-mb=node_nums*605.Pod配置Pod运行Pod你还需要遵循一些最佳实践,比如:1.为容器设置资源请求和限制,尤其是一些基础插件服务spec.containers[].resources.limits.cpuspec.containers[].resources.limits.memoryspec.containers[].resources.requests.cpuspec.containers[].resources.requests.memoryspec.containers[].resources.limits.ephemeral-storagespec.containers[].resources.requests.ephemeral-storage在k8s中会根据pod的不同limit和requests配置将pod分为不同的qos类别:GuaranteedBurstableBestEffort当机器可用资源不够时,kubelet会根据qosl迁移和驱逐pod等级划分。被驱逐的优先级:BestEffort>Burstable>Guaranteed2。对关键应用使用nodeAffinity、podAffinity、podAntiAffinity等保护,将其调度分发到不同节点。例如kube-dns配置:affinity:podAntiAffinity:requiredDuringSchedulingIgnoredDuringExecution:-weight:100labelSelector:matchExpressions:-key:k8s-appoperator:Invalues:-kube-dnstopologyKey:kubernetes.io/hostname3.尝试使用controller来管理容器(如Deployment,StatefulSet,DaemonSet,Job等)kube-scheduler配置设置—kube-api-qps=100默认值为50kube-controller-manager配置设置—kube-api-qps=100默认值为20设置—kube-api-burst=100默认值为30