website/content/zh/docs/concepts/architecture/cloud-controller.md

249 lines
8.4 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters!

This file contains invisible Unicode characters that may be processed differently from what appears below. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to reveal hidden characters.

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

title: 云控制器管理器的基本概念
## 云控制器管理器
云控制器管理器CCM这个概念创建的初衷是为了让特定的云服务供应商代码和Kubernetes核心相互独立演化。云控制器管理器与其他主要组件如Kubernetes控制器管理器API服务器和调度程序同时运行。云控制器管理器也可以作为Kubernetes的插件启动这种情况下CCM运行在Kubernetes系统之上。
云控制器管理器基于插件机制设计允许新的云服务供应商通过插件轻松地与Kubernetes集成。目前已经有在Kubernetes上加入新的云服务供应商计划并为云服务供应商提供从原先的旧模式迁移到新CCM模式的方案。
本文讨论了云控制器管理器背后的概念,并提供了相关功能的详细信息。
下面这张图描述了没有云控制器管理器的Kubernetes集群架构
![无云控制器管理器的 K8s 集群架构](/images/docs/pre-ccm-arch.png)
## 设计
在上图中Kubernetes和云服务供应商通过几个不同的组件进行了集成分别是
* Kubelet
* Kubernetes 控制管理器
* Kubernetes API服务器
而CCM整合了前三个组件中的所有依赖于云的逻辑用来创建与云的单点集成。新架构如下图所示
![有云控制器管理器的 K8s 集群架构](/images/docs/post-ccm-arch.png)
## CCM的组件
CCM突破了Kubernetes控制器管理器KCM的一些功能并将其作为一个独立的进程运行。具体而言它打破了KCM中与云相关的控制器。KCM具有以下依赖于云的控制器引擎
* 节点控制器
* 卷控制器
* 路由控制器
* 服务控制器
在1.8版本中当前运行中的CCM从上面的列表中运行以下控制器
* 节点控制器
* 路由控制器
* 服务控制器
另外,它运行另一个名为 PersistentVolumeLabels Controller 的控制器。这个控制器负责对在GCP和AWS云里创建的PersistentVolumes的域ZoneRegion标签进行设置。
**注意**卷控制器被特意设计为CCM之外的一部分。由于其中涉及到的复杂性和对现有供应商特定卷的逻辑抽象因此决定了卷控制器不会被移动到CCM之中。
原本计划使用CCM来支持卷的目的是为了引入FlexVolume卷来支持可插拔卷。然而官方正在计划使用更具备竞争力的CSI来取代FlexVolume卷。
考虑到这些正在进行中的变化我们决定暂时停止当前工作直至CSI准备就绪。
云服务供应商工作组wg-cloud-provider正在开展相关工作以实现通过CCM支持PersistentVolume的功能。详细信息请参见[kubernetes/kubernetes52371](https://github.com/kubernetes/kubernetes/pull/52371)。
## CCM功能
CCM从Kubernetes组件中继承了与云服务供应商相关的功能。本节基于被CCM继承其功能的组件展开描述。
### 1. Kubernetes 控制器管理器
CCM的大部分功能都来自KCM。 如上一节所述CCM运行以下控制引擎
* 节点控制器
* 路由控制器
* 服务控制器
* PersistentVolumeLabels控制器
#### 节点控制器
节点控制器负责通过从云服务供应商获得有关在集群中运行的节点的信息来初始化节点。节点控制器执行以下功能:
1.使用云特定域Zone/区Region标签初始化节点。
1.使用特定于云的实例详细信息初始化节点,例如类型和大小。
1.获取节点的网络地址和主机名。
1.如果节点无响应检查该节点是否已从云中删除。如果该节点已从云中删除则删除Kubernetes节点对象。
#### 路由控制器
路由控制器负责为云配置正确的路由以便Kubernetes集群中不同节点上的容器可以相互通信。路由控制器仅适用于Google Compute Engine平台。
#### 服务控制器
服务控制器负责监听服务的创建、更新和删除事件。根据Kubernetes中各个服务的当前状态它将配置云负载平衡器如ELB或Google LB以反映Kubernetes中的服务状态。此外它还确保云负载均衡器的服务后端保持最新。
#### PersistentVolumeLabels 控制器
PersistentVolumeLabels控制器在AWS的EBS卷、GCE的PD卷创建时申请标签这使得用户不再需要手动设置这些卷标签。
这些标签对于pod的调度工作是非常重要的因为这些卷只能在它们所在的域Zone/区Region内工作因此所有使用这些卷的pod都必须要在同一个域/区中才能保证进行调度正常进行。
PersistentVolumeLabels控制器是专门为CCM创建的; 也就是说在CCM创建之前它是不存在的。这样做是为了将Kubernetes API服务器它是一个许可控制器中的PV标签逻辑移动到CCM。 它不在KCM上运行。
### 2. Kubelet
Node控制器包含kubelet中依赖于云的功能。在系统引入CCM组件之前是由kubelet采用包含云特定信息的方式对节点进行初始化如IP地址、区Region/域Zone标签和实例类型信息引入CCM之后这部分的初始化操作就从kubelet转移到了CCM中。
在引入CCM后的新的模型中kubelet采用不包含云特定信息的方式初始化一个节点。但是它会为新创建的节点添加一个污点使得该节点不可被立即调度直到CCM使用包含云的特定信息初始化节点后才会删除该污点使得该节点可被调度。
### 3. Kubernetes API服务器
PersistentVolumeLabels控制器将Kubernetes API服务器的依赖于云的功能移至CCM如前面部分所述。
## 插件机制
云控制器管理器使用Go接口与外部对接从而实现功能扩展。具体来说它使用了[这里](https://github.com/kubernetes/kubernetes/blob/master/pkg/cloudprovider/cloud.go)定义的CloudProvider接口。
上面强调的四个共享控制器的实现以及一些辅助设施scaffolding和共享的云服务供应商接口将被保留在Kubernetes核心当中。但云服务供应商特有的实现将会建立在核心之外并实现核心中定义的接口。
有关开发插件的更多信息,请参阅
[开发云控制器管理器](/docs/tasks/administrators-cluster/developing-cloud-controller-manager/)。
## 授权
本节分解了CCM对各种API对象的访问以执行其操作。
### 节点控制器
节点控制器仅适用于节点对象。它需要完全访问权限来获取、列出、创建、更新、修补、监视和删除节点对象。
v1/Node:
- Get
- List
- Create
- Update
- Patch
- Watch
### 路由控制器
路由控制器监听节点对象的创建并配置合适的路由。它需要对节点对象的访问权限。
v1/Node:
- Get
### 服务控制器
服务控制器侦听服务对象创建、更新和删除事件,然后对这些服务的端点进行恰当的配置。
要访问服务,它需要罗列和监控权限。要更新服务,它需要修补和更新权限。
要为服务设置端点,需要访问创建、列表、获取、监视和更新。
v1/Service:
- List
- Get
- Watch
- Patch
- Update
### PersistentVolumeLabels 控制器
PersistentVolumeLabels控制器监听PersistentVolumePV创建事件并更新它们。该控制器需要访问列表、查看、获取和更新PV的权限。
v1/PersistentVolume:
- Get
- List
- Watch
- Update
### 其它
CCM核心的实现需要创建事件的权限为了确保安全操作需要创建ServiceAccounts的权限。
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。
* [Digital Ocean]()
* [Oracle]()
* [Azure]()
* [GCE]()
* [AWS]()
## 群集管理
[这里](/docs/tasks/administer-cluster/running-cloud-controller/#cloud-controller-manager)提供了配置和运行CCM的完整说明。