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