云控制器管理器(Cloud Controller Manager)
Kubernetes v1.11 [beta]云基础设施技术使您能够在公共、私有和混合云上运行 Kubernetes。Kubernetes 秉承自动化、API 驱动的基础设施理念,避免组件之间的紧密耦合。
云控制器管理器是 Kubernetes 控制平面组件,它嵌入了云特定的控制逻辑。云控制器管理器使您可以将集群连接到云提供商的 API,并将与该云平台交互的组件与仅与集群交互的组件分离。
通过解耦 Kubernetes 与底层云基础设施之间的互操作性逻辑,云控制器管理器组件使云提供商能够以与主 Kubernetes 项目不同的速度发布功能。
云控制器管理器采用插件机制构建,允许不同的云提供商将其平台与 Kubernetes 集成。
设计
云控制器管理器在控制平面中作为一组复制的进程(通常,这些是 Pod 中的容器)运行。每个云控制器管理器在一个进程中实现多个 控制器。
说明
您也可以将云控制器管理器作为 Kubernetes 插件运行,而不是作为控制平面的一部分。云控制器管理器功能
云控制器管理器中的控制器包括
节点控制器
节点控制器负责在您的云基础设施中创建新服务器时更新 节点对象。节点控制器从云提供商的 API 获取有关在您的租户中运行的主机的信息。节点控制器执行以下功能
- 使用从云提供商 API 获取的服务器的唯一标识符更新节点对象。
- 使用云特定的信息(例如节点部署到的区域以及它拥有的资源(CPU、内存等))注释和标记节点对象。
- 获取节点的 hostname 和网络地址。
- 验证节点的健康状况。如果节点变得无响应,此控制器会检查您的云提供商的 API,以查看服务器是否已停用/删除/终止。如果节点已从云中删除,则控制器会从您的 Kubernetes 集群中删除节点对象。
一些云提供商的实现会将此拆分为节点控制器和单独的节点生命周期控制器。
路由控制器
路由控制器负责适当地配置云中的路由,以便 Kubernetes 集群中不同节点上的容器可以相互通信。
根据云提供商的不同,路由控制器可能还会为 Pod 网络分配 IP 地址块。
服务控制器
服务与云基础设施组件(例如托管负载均衡器、IP 地址、网络数据包过滤和目标健康检查)集成。当您声明需要这些组件的服务资源时,服务控制器会与您的云提供商的 API 交互以设置负载均衡器和其他基础设施组件。
授权
本节分解了云控制器管理器为了执行其操作而需要在各种 API 对象上拥有的访问权限。
节点控制器
节点控制器仅使用节点对象。它需要完全访问权限才能读取和修改节点对象。
v1/Node:
- get
- list
- create
- update
- patch
- watch
- delete
路由控制器
路由控制器侦听节点对象的创建并适当地配置路由。它需要对节点对象具有 Get 访问权限。
v1/Node:
- get
服务控制器
服务控制器监视服务对象的 创建、更新和删除事件,然后适当地为这些服务配置负载均衡器。
为了访问服务,它需要 list 和 watch 访问权限。为了更新服务,它需要对 status 子资源具有 patch 和 update 访问权限。
v1/Service:
- list
- get
- watch
- patch
- update
其他
云控制器管理器的核心实现需要访问创建 Event 对象,并且为了确保安全运行,它需要访问创建 ServiceAccount。
v1/Event:
- create
- patch
- update
v1/ServiceAccount:
- create
云控制器管理器的 RBAC ClusterRole 如下所示
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
- watch
- apiGroups:
- ""
resources:
- services/status
verbs:
- patch
- update
- apiGroups:
- ""
resources:
- serviceaccounts
verbs:
- create
- apiGroups:
- ""
resources:
- persistentvolumes
verbs:
- get
- list
- update
- watch
接下来
云控制器管理器管理 提供了有关运行和管理云控制器管理器的说明。
要将 HA 控制平面升级为使用云控制器管理器,请参阅 迁移复制控制平面以使用云控制器管理器。
想知道如何实现自己的云控制器管理器,或扩展现有项目吗?
- 云控制器管理器使用 Go 接口,特别是
cloud.go中定义的CloudProvider接口,来自 kubernetes/cloud-provider,以允许来自任何云的实现被插入。 - 本文档中重点介绍的共享控制器(节点、路由和服务)的实现,以及共享 cloudprovider 接口以及一些脚手架,是 Kubernetes 核心的一部分。特定于云提供商的实现不在 Kubernetes 核心之外,并实现
CloudProvider接口。 - 有关开发插件的更多信息,请参阅 开发云控制器管理器。
- 云控制器管理器使用 Go 接口,特别是