由于云驱动的开发和发布的步调与 Kubernetes 项目不同,将服务提供商专用代码抽象到
``
二进制中有助于云服务厂商在 Kubernetes 核心代码之外独立进行开发。
cloud-controller-manager
可以被链接到任何满足
[cloudprovider.Interface]
约束的云服务提供商。为了兼容旧版本,Kubernetes 核心项目中提供的
[cloud-controller-manager]
使用和 kube-controller-manager
相同的云服务类库。
已经在 Kubernetes 核心项目中支持的云服务提供商预计将通过使用 in-tree 的 cloud-controller-manager
过渡为非 Kubernetes 核心代码。
每个云服务都有一套各自的需求用于系统平台的集成,这不应与运行kube-controller-manager
的需求有太大差异。作为经验法则,你需要:
你需要对集群配置做适当的修改以成功地运行云管理控制器:
kube-apiserver
和 kube-controller-manager
指定 --cloud-provider
标志。kubelet
必须使用 --cloud-provider=external
运行。请记住,设置集群使用云管理控制器将用多种方式更改集群行为:
--cloud-provider=external
的 kubelet 将被添加一个 node.cloudprovider.kubernetes.io/uninitialized
NoSchedule
)。云管理控制器可以实现:
如果当前 Kubernetes 内核支持你使用的云服务,并且想要采用云管理控制器,请参见
[kubernetes 内核中的云管理控制器]。
对于不在 Kubernetes 核心代码库中的云管理控制器,你可以在云服务厂商或 SIG 领导者的源中找到对应的项目。
对于已经存在于 Kubernetes 内核中的提供商,你可以在集群中将 in-tree 云管理控制器作为守护进程运行。请使用如下指南:
运行云管理控制器会有一些可能的限制。虽然以后的版本将处理这些限制,但是知道这些生产负载的限制很重要。
云管理控制器未实现 kube-controller-manager
中的任何 volume 控制器,因为和 volume 的集成还需要与 kubelet 协作。由于我们引入了 CSI 并对弹性 volume 插件添加了更强大的支持,云管理控制器将添加必要的支持,以使云服务同 volume 更好的集成。请在 [这里] 了解更多关于 out-of-tree CSI volume 插件的信息。
在以前为云服务提供商提供的架构中,我们依赖 kubelet 的本地元数据服务来获取关于它本身的节点信息。通过这个新的架构,现在我们完全依赖云管理控制器来获取所有节点的信息。对于非常大的集群,你需要考虑可能的瓶颈,例如资源需求和 API 速率限制。
云管理控制器的目标是将云服务特性的开发从 Kubernetes 核心项目中解耦。
不幸的是,Kubernetes 项目的许多方面都假设云服务提供商的特性同项目紧密结合。
因此,这种新架构的采用可能导致某些场景下,当一个请求需要从云服务提供商获取信息时,
在该请求没有完成的情况下云管理控制器不能返回那些信息。
Kubelet 中的 TLS 引导特性是一个很好的例子。
目前,TLS 引导认为 kubelet 有能力从云提供商(或本地元数据服务)获取所有的地址类型(私有、公用等),
但在被初始化之前,云管理控制器不能设置节点地址类型,而这需要 kubelet 拥有
TLS 证书以和 API 服务器通信。
随着整个动议的演进,将来的发行版中将作出改变来解决这些问题。
要构建和开发你自己的云管理控制器,请阅读
[开发云管理控制器]
文档。