关于 Kubernetes 动态资源分配(DRA)
DRA(Dynamic Resource Allocation) 的引入,标志着 Kubernetes 从“容器管理”向“资源智能管理”的重大演进。它不仅解决了现有资源管理模型的痛点,还为未来异构硬件和复杂工作负载提供了原生支持。在接下来的文章中,本文将深入探讨 DRA 的设计背景、核心架构与关键 KEP 细节,帮助开发者全面理解这一革命性框架。
DRA(Dynamic Resource Allocation) 的引入,标志着 Kubernetes 从“容器管理”向“资源智能管理”的重大演进。它不仅解决了现有资源管理模型的痛点,还为未来异构硬件和复杂工作负载提供了原生支持。在接下来的文章中,本文将深入探讨 DRA 的设计背景、核心架构与关键 KEP 细节,帮助开发者全面理解这一革命性框架。
Kubernetes 提供了 CRD(CustomResourceDefinitions) 这种扩展方式满足了用户增强 Kubernetes 功能的需求,我们熟悉的 Kubernetes Operator 也是基于这一机制而实现。
本文想讨论的是我们要在什么时候使用 CRD 以及为什么要使用 CRD。
集群网络系统是 Kubernetes 的核心部分,其中 Pod 之间的通信的部分 Kubernetes 没有自己实现,而是交给了外部组件进行处理。Kubernetes 对这部分网络模型的要求是:节点上的 Pod 可以不通过 NAT 和其他任何节点上的 Pod 通信。这就需要一个跨主机的容器网络。
本篇笔记前半部分记录了 VXLAN 技术。VXLAN 全称是 Virtual eXtensible Local Area Network
,虚拟可扩展的局域网。它是一种 Overlay 技术,通过三层网络来搭建的二层网络。在笔记的后半部分,通过学习 Flannel 的源码手动搭建跨主机容器网络示例。
笔记中 vxlan 内容学习自 cizixs 的两篇博客,一篇介绍协议原理,一篇结合实践。文章写的很详细,而且深入浅出适合学习,建议读者在 vxlan 部分直接看原文。
Traefik 从 2.0 版本开始支持 TCP route,我也使用 Traefik 作为 kubernetes 集群的 Ingress,但是在使用过程中,发现 Traefik 为 MySQL 创建的 TCP route 无法正常工作,经过排查搜索后发现了官方人员关于这个疑惑的解答,以下截取片段:
But be careful: not all protocols based on TCP and using TLS supports the SNI routing or the passthrough. It requires the protocol supporting SNI (for instance MySQL doesn't) and doing a TLS handshake (if it is a STARTTLS, then it does not work).
虽然找到了问题是由于 MySQL 不支持,但也勾起了我的好奇心,什么是 SNI?Traefik 为什么要使用 HostSNI
创建 TCP route 呢?为什么 MySQL 不支持 SNI 呢?于是带着这些问题,我开始寻找答案。
当我们使用 Kubernetes 部署应用后,会发现如果用户增长速度超过预期,以至于计算资源不够时,你会怎么做呢?Kubernetes 给出的解决方案就是:自动伸缩(auto-scaling),通过自动伸缩组件之间的配合,可以 7*24 小时的监控着你的集群,动态变化负载,以适应你的用户需求。
存储一直是容器运行的关键部分,Kubernetes 为此做了很多努力,从一开始的 Pod Volumes、PV(Persistent Volumes) 与 PVC(Persistent Volume Claim),到 StorageClass 与 Dynamic Provisioning,再到现在 “out-of-tree” 的 CSI(Container Storage Interface),Kubernetes 社区一直在演进存储的实现。
前面基础的就不讲了,我们从 StorageClass 与 Dynamic Provisioning 开始了解。