组件总览
kubernetes 提供了完整的云原生解决方案,包括了云原生应用的编排、存储、网络、安全等各个方面。在云原生环境中,我们只需要关注应用的编排,而将存储、网络、安全等交给 kubernetes 来管理
对于自建或托管的 kubernetes 集群,想要使用完整的 kubernetes 能力,需要将 kubernetes 与云厂商的 API 进行集成。这就需要用到一些额外的组件来完成
组件总览
不同的组件提供了不同的功能,都是为了将 kubernetes 与云厂商的 API 进行集成以完成 kubernetes 的完整能力
- Cloud Controller Manager (CCM): 将 Kubernetes 与云厂商 API 解耦,包含
ServiceController
(为Service type=LoadBalancer
创建云 LB)、NodeController
、RouteController
等。 - Container Storage Interface (CSI): 动态制备与挂载云存储(如云盘)。
- Ingress Controller: 监听
Ingress
/Gateway
,创建并更新云负载均衡的监听、转发规则等(与Service type=LoadBalancer
的 CCM 链路不同)。 - Cluster Autoscaler (CA): 当出现 Pending Pod 时按需调用云 API 扩/缩节点数。
术语:in-tree 与 out-of-tree
-
in-tree(树内)
- 云厂商相关逻辑直接编译在 Kubernetes 核心组件中(主要是
kube-controller-manager
的内部云控制循环)。 - 通过
--cloud-provider=<provider>
使用内置实现,升级与发布节奏受 Kubernetes 本身约束,耦合度高,正被逐步淘汰,不建议新集群使用。
- 云厂商相关逻辑直接编译在 Kubernetes 核心组件中(主要是
-
out-of-tree(树外,也称 external)
- 将云厂商逻辑从核心代码中解耦,作为独立进程运行的 Cloud Controller Manager(CCM)。
- 集群组件需设置为外置模式:
kube-controller-manager
与kubelet
使用--cloud-provider=external
。 - 初始化行为:节点会带有污点
node.cloudprovider.kubernetes.io/uninitialized:NoSchedule
,由外置 CCM 完成二次初始化并移除污点;云相关 API 由 CCM 统一调用,可能受到速率限制,需要容量规划。 - 优点:解耦核心发布、独立升级、更易维护与安全加固,是官方推荐路径。
更多细节与示例,见官方文档:运行云管理控制器(CCM)。
自建集群 vs 托管集群
-
自建集群
- 需切换到外置云提供商模式:在
kube-controller-manager
与各节点kubelet
配置--cloud-provider=external
。 - 部署并配置对应云厂商的 CCM、CSI、Ingress Controller、Cluster Autoscaler 等。
- 为组件提供凭据(推荐主机绑定云角色,否则使用 AK/SK Secret)与最小权限策略。
- 需切换到外置云提供商模式:在
-
托管集群(如阿里云 ACK)
- 云厂商已托管 CCM/CSI/Ingress Controller 等控制面组件,用户直接声明
Service
/PVC
/Ingress
即可触发云资源创建。
- 云厂商已托管 CCM/CSI/Ingress Controller 等控制面组件,用户直接声明
快速开始
- 按官方文档将集群切到
external
模式并理解初始化污点行为。 - 按云厂商 CCM 指南部署
cloud-controller-manager
,提供 Region、VPC/VSwitch、安全组、凭据等配置。 - 验证
Service type=LoadBalancer
能自动创建云负载均衡并写入status.loadBalancer.ingress
。 - 按需部署存储 CSI、Ingress Controller 与 Cluster Autoscaler。