--- title: 云控制器管理器的基础概念 content_template: templates/concept weight: 30 --- {{% capture overview %}} 云控制器管理器(cloud controller manager,CCM)这个概念 (不要与二进制文件混淆)创建的初衷是为了让特定的云服务供应商代码和 Kubernetes 核心相互独立演化。云控制器管理器与其他主要组件(如 Kubernetes 控制器管理器,API 服务器和调度程序)一起运行。它也可以作为 Kubernetes 的插件启动,在这种情况下,它会运行在 Kubernetes 之上。 云控制器管理器基于插件机制设计,允许新的云服务供应商通过插件轻松地与 Kubernetes 集成。目前已经有在 Kubernetes 上加入新的云服务供应商计划,并为云服务供应商提供从原先的旧模式迁移到新 CCM 模式的方案。 本文讨论了云控制器管理器背后的概念,并提供了相关功能的详细信息。 这是没有云控制器管理器的 Kubernetes 集群的架构: ![没有云控制器管理器的 Kubernetes 架构](/images/docs/pre-ccm-arch.png) {{% /capture %}} {{% capture body %}} ## 设计 在上图中,Kubernetes 和云服务供应商通过几个不同的组件进行了集成,分别是: * Kubelet * Kubernetes 控制管理器 * Kubernetes API 服务器 CCM 整合了前三个组件中的所有依赖于云的逻辑,以创建与云的单一集成点。CCM 的新架构如下所示: ![含有云控制器管理器的 Kubernetes 架构](/images/docs/post-ccm-arch.png) ## CCM 的组成部分 CCM 打破了 Kubernetes 控制器管理器(KCM)的一些功能,并将其作为一个单独的进程运行。具体来说,它打破了 KCM 中依赖于云的控制器。KCM 具有以下依赖于云的控制器: * 节点控制器 * 卷控制器 * 路由控制器 * 服务控制器 在 1.9 版本中,CCM 运行前述列表中的以下控制器: * 节点控制器 * 路由控制器 * 服务控制器 {{< note >}} 注意卷控制器不属于 CCM,由于其中涉及到的复杂性和对现有供应商特定卷的逻辑抽象,因此决定了卷控制器不会被移动到 CCM 之中。 {{< /note >}} 使用 CCM 支持 volume 的最初计划是使用 Flex volume 来支持可插拔卷,但是现在正在计划一项名为 CSI 的项目以取代 Flex。 考虑到这些正在进行中的变化,在 CSI 准备就绪之前,我们决定停止当前的工作。 ## CCM 的功能 CCM 从依赖于云提供商的 Kubernetes 组件继承其功能,本节基于这些组件组织。 ### 1. Kubernetes 控制器管理器 CCM 的大多数功能都来自 KCM,如上一节所述,CCM 运行以下控制器。 * 节点控制器 * 路由控制器 * 服务控制器 #### 节点控制器 节点控制器负责通过从云提供商获取有关在集群中运行的节点的信息来初始化节点,节点控制器执行以下功能: 1. 使用特定于云的域(zone)/区(region)标签初始化节点; 2. 使用特定于云的实例详细信息初始化节点,例如,类型和大小; 3. 获取节点的网络地址和主机名; 4. 如果节点无响应,请检查云以查看该节点是否已从云中删除。如果已从云中删除该节点,请删除 Kubernetes 节点对象。 #### 路由控制器 Route 控制器负责适当地配置云中的路由,以便 Kubernetes 集群中不同节点上的容器可以相互通信。route 控制器仅适用于 Google Compute Engine 群集。 #### 服务控制器 服务控制器负责监听服务的创建、更新和删除事件。根据 Kubernetes 中各个服务的当前状态,它配置云负载均衡器(如 ELB, Google LB 或者 Oracle Cloud Infrastructure LB)以反映 Kubernetes 中的服务状态。此外,它还确保云负载均衡器的服务后端是最新的。 ### 2. Kubelet 节点控制器包含 kubelet 中依赖于云的功能,在引入 CCM 之前,kubelet 负责使用特定于云的详细信息(如 IP 地址,域/区标签和实例类型信息)初始化节点。CCM 的引入已将此初始化操作从 kubelet 转移到 CCM 中。 在这个新模型中,kubelet 初始化一个没有特定于云的信息的节点。但是,它会为新创建的节点添加污点,使节点不可调度,直到 CCM 使用特定于云的信息初始化节点后,才会清除这种污点,便得该节点可被调度。 ## 插件机制 云控制器管理器使用 Go 接口允许插入任何云的实现。具体来说,它使用[此处](https://github.com/kubernetes/cloud-provider/blob/9b77dc1c384685cb732b3025ed5689dd597a5971/cloud.go#L42-L62)定义的 CloudProvider 接口。 上面强调的四个共享控制器的实现,以及一些辅助设施(scaffolding)和共享的 cloudprovider 接口,将被保留在 Kubernetes 核心中。但特定于云提供商的实现将在核心之外构建,并实现核心中定义的接口。 有关开发插件的更多信息,请参阅[开发云控制器管理器](/docs/tasks/administer-cluster/developing-cloud-controller-manager/)。 ## 授权 本节分解了 CCM 执行其操作时各种 API 对象所需的访问权限。 ### 节点控制器 Node 控制器仅适用于 Node 对象,它需要完全访问权限来获取、列出、创建、更新、修补、监视和删除 Node 对象。 v1/Node: - Get - List - Create - Update - Patch - Watch - Delete ### 路由控制器 路由控制器侦听 Node 对象创建并适当地配置路由,它需要访问 Node 对象。 v1/Node: - Get ### 服务控制器 服务控制器侦听 Service 对象创建、更新和删除事件,然后适当地为这些服务配置端点。 要访问服务,它需要列表和监视访问权限。要更新服务,它需要修补和更新访问权限。 要为服务设置端点,需要访问 create、list、get、watch 和 update。 v1/Service: - List - Get - Watch - Patch - Update ### 其它 CCM 核心的实现需要访问权限以创建事件,并且为了确保安全操作,它需要访问权限以创建服务账户。 v1/Event: - Create - Patch - Update v1/ServiceAccount: - Create 针对 CCM 的 RBAC ClusterRole 看起来像这样: ```yaml apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: cloud-controller-manager rules: - apiGroups: - "" resources: - events verbs: - create - patch - update - apiGroups: - "" resources: - nodes verbs: - '*' - apiGroups: - "" resources: - nodes/status verbs: - patch - apiGroups: - "" resources: - services verbs: - list - patch - update - watch - apiGroups: - "" resources: - serviceaccounts verbs: - create - apiGroups: - "" resources: - persistentvolumes verbs: - get - list - update - watch - apiGroups: - "" resources: - endpoints verbs: - create - get - list - watch - update ``` ## 供应商实施 以下云服务提供商已实现了 CCM: * [AWS](https://github.com/kubernetes/cloud-provider-aws) * [Azure](https://github.com/kubernetes/cloud-provider-azure) * [BaiduCloud](https://github.com/baidu/cloud-provider-baiducloud) * [Digital Ocean](https://github.com/digitalocean/digitalocean-cloud-controller-manager) * [GCP](https://github.com/kubernetes/cloud-provider-gcp) * [Linode](https://github.com/linode/linode-cloud-controller-manager) * [OpenStack](https://github.com/kubernetes/cloud-provider-openstack) * [Oracle](https://github.com/oracle/oci-cloud-controller-manager) ## 群集管理 [这里](/docs/tasks/administer-cluster/running-cloud-controller/#cloud-controller-manager)提供了有关配置和运行 CCM 的完整说明。 {{% /capture %}}