服务器K8s K8s服务器架构详解:从入门到实践

阿木 发布于 18 小时前 5 次阅读


你是不是还在用手工方式管理几十个容器?

若是集群规模冲破100个节点这个界限之时,依靠手动去开展部署以及对故障进行排查,会致使你陷入那种极度痛苦且仿佛失去一切希望的状态之中。

容器编排的事实标准已然是Kubernetes(K8s) ,要彻底摆脱“背锅侠”的命运,关键在于牢牢掌握它所蕴含的核心原理以及实际操作的技巧。

接着,我会凭借三年于生产环境进行运维的那些经验呀,细致地去拆解、剖析K8s集群管理方面的实战干货呢。

控制平面部署要三节点起步

众多新手在搭建集群之际,为了节省费用,仅仅于主节点部署一台控制平面,这乃是最为严重的失误所在。

主节点需要在生产环境里进行部署,且数量必须至少为3个,这些主节点要分别去运行API Server,还要分别去运行控制器,并且还要分别去运行调度器。

     +--------------------+         +----------------+     |      API Server    ||      etcd      |     +--------------------+         +----------------+               |     +---------+---------+     |                   |+-----------+   +------------------+| Scheduler |   | ControllerManager|+-----------+   +------------------+         ↓ 控制指令下发 +--------------------------+|        Worker Node       |+--------------------------+| kubelet | kube-proxy | CRI ||    Pod(多个容器)         |+--------------------------+

etcd集群所需的副本数量同样是3个,并且这些副本要被部署在彼此独立的服务器之上,以此来防止与控制平面在资源方面产生争抢。

曾有某创业公司,遭遇单点故障,致使整个业务陷入瘫痪,时长竟达8小时,这般血的教训,明确告知我们,高可用配置,绝不可省。

API Server是集群的总开关

kube - apiserver是所有操作的那个唯一入口,它承受压力的能力直接决定着集群的稳定性。

可提出这样的建议,要赋予API Server配置,配置的资源量应当至少是8核16GB,并且要开启那种针对请求的限流功能。

存在一种技巧,那便是把API审计日志单独挂接到高性能的SSD盘上,不然的话,日志写入速度过慢,就会拖累整个集群。

双十一大促未进行以前,我们发觉了API呈现出响应延迟的状况,最终是借助对APF优先级以及并发数做出调整这种方式解决的。

调度器配置要懂业务优先级

默认调度器能满足大多数场景,但遇到特殊需求时必须自定义。

比如,AI训练任务是需要GPU资源的,那么,碰到给这类Pod设置专门调度策略的情况,你就得去做这件事。

在调度器当中能够进行优先级函数的配置,使得那些有着GPU需求的Pod,能够优先被调度至GPU节点。

之前,我们将在线业务与离线业务进行混合部署,借助配置节点亲和性以及资源预留,最终把服务器利用率由30%提升至65%。

控制器管理器要关注循环控制

目前的状态由控制器负责调整成期望状态,然而其工作模式呈现为无限循环。

如果某个控制器卡死,整个集群的自动化能力就瘫痪了。

我建议监控每个控制器的同步延迟,当延迟超过5分钟就要告警。

请记住,要将Deployment控制器的日志,以及StatefulSet控制器的日志,分别进行收集,能够在排查问题之际,迅速定位究竟是哪一个控制器出现了故障。

工作节点配置决定应用稳定性

在节点之上存在着的kubelet,它属于执行者,其健康状态会对Pod运行产生直接的影响。

要是每个节点都必须留够足够的系统资源,那么建议给操作系统、kubelet组件预留1核CPU、2GB内存。

容器运行时,推荐选用containerd,而非Docker,原因在于,containerd更为轻量,并且与K8s的集成更为紧密。

当我们进行测试的时候,我们发现了这样的情况,那就是在使用containerd之后,节点启动所需要的时间,足足缩减了40%,并且内存的占用,也降低了25%。

网络代理配置是性能瓶颈

流量被kube-proxy负责转发到Pod,默认的iptables模式,在集群规模超过1000个服务的情况下,会出现明显的延迟。

这个时候,一定要切换至IPVS模式,它的哈希表查找速度,相较于iptables线性遍历,快出一个数量级。

依然得留意去修改内核参数,将net.ipv4.ip_forward设置成1,把net.bridge.bridge - nf.call - iptables也设置为1。

关于网络转发延迟致使接口超时这一情况,我们曾遭遇过,在改成IPVS之后,问题便顺利得到解决了。

你在管理K8s集群时遇到过最棘手的故障是什么?

你可以在评论区域分享自身经历,为本文点赞并收藏,以便让更多从事运维工作的男性同志能够看到这些具有实际操作经验过程。