为Yandex.Cloud引入Kubernetes CCM(云控制器管理器)



作为Yandex.Cloud CSI驱动程序 的最新版本的延续,我们将为此云发布另一个开源项目-Cloud Controller ManagerCCM不仅对于整个群集都是必需的,而且对于CSI驱动程序本身也是必需的。有关其用途和某些实现功能的详细信息已删减。

介绍


为什么是这样?


促使我们为Yandex.Cloud开发CCM的动机 CSI驱动程序公告中已经描述的动机完全一致我们为来自不同云提供商的许多Kubernetes集群提供服务,为此我们使用一个工具。它实现了“绕过”这些提供程序的托管解决方案的众多便利设施。是的,我们有一个相当具体的案例和需求,但是由于它们而创建的开发对其他用户也很有用。

一般而言,CCM是什么?


通常,我们从外部群集准备环境,例如,使用Terraform。但是有时需要从群集管理周围的云环境提供了这样的机会,并且CCM实现了它

尤其是,Cloud Controller Manager提供了五种基本的交互类型:

  1. 实例 -在Kubernetes(Node)中的节点对象与云提供商中的虚拟机之间实现1:1的连接为此,我们:
    • 填写spec.providerID对象中的字段Node例如,对于OpenStack CCM,此字段具有以下格式:openstack:///d58a78bf-21b0-4682-9dc6-2132406d2bb0您可以看到云提供商的名称和对象的服务器的唯一UUID(OpenStack中的虚拟机);
    • nodeInfo Node . , instance type AWS;
    • . , Node NotReady, , providerID. — Node, ;
  2. Zones – failure domain Node, Pod’ ;
  3. LoadBalancerService LoadBalancer , . , Yandex.Cloud NetworkLoadBalancer TargetGroup ;
  4. Route – , .. Kubernetes pod IP- pod’. (VXLAN, GENEVE) :

  5. Volume – PV, PVC SC. CCM, Container Storage Interface (CSI). CSI , , CSI-.

以前,所有与云交互的代码主要位于该地址的Kubernetes项目Git存储库中k8s.io/kubernetes/pkg/cloudprovider/providers,但是由于使用大型代码库带来的不便,他们决定拒绝这样做。所有旧的实现都移到了单独的存储库中为了方便进一步的支持和开发,所有通用组件也都移到了单独的存储库中

与CSI一样,许多大型云服务提供商已经开发了自己的CCM,供Kubernetes中的云使用。如果供应商没有CCM,但是所有必需的功能都可以通过API获得,那么您可以自己实现CCM。

要编写您的CCM实施,只需实施必要的Go接口即可

那就是我们得到的

实作


你怎么来的


一年前 ,我们以完成的(!)CCM for Yandex.Cloud 开始(甚至是使用)开发

但是,在此实现中,我们缺少:

  • 通过JWT IAM令牌进行身份验证;
  • 服务控制器支持。

根据Telegram 作者(dlisin)的同意,我们分叉了yandex-cloud-controller-manager并添加了缺少的功能。

主要特点


CCM当前支持以下接口:

  • 实例 ;
  • 区域 ;
  • LoadBalancer

将来,当Yandex.Cloud开始使用VPC的高级功能时,我们将添加Routes接口

负载平衡器是主要挑战


最初,我们尝试与其他CCM实现一样,创建一对,LoadBalancerTargetGroup为每个创建Service一个type LoadBalancer但是,Yandex.Cloud表现出一个有趣的局限性:不能TargetGroups与相交Targets(对SubnetID- IpAddress)一起使用。



因此,建立CCM内推出了控制器,改变对象时,Node关于每个虚拟机上的所有接口,组他们收集信息属于某些NetworkID上创建TargetGroupNetworkID,并确保它的电流。随后,在创建Service具有类型的对象时,LoadBalanacer我们只需将先前创建的对象附加TargetGroup到新对象上即可NetworkLoadBalanacer

如何开始使用?


CCM支持Kubernetes 1.15及更高版本。在集群中,对于其操作,要求将标志--cloud-provider=external设置true为kube-apiserver,kube-controller-manager,kube-scheduler和所有kubelet'ov的值。README

中描述了安装本身的所有必要步骤安装归结为通过清单在Kubernetes中创建对象。 要使用CCM,您还需要:



  • 在清单中指定 Yandex.Cloud目录的标识符(folder-id);
  • 与Yandex.Cloud API交互的服务帐户。在清单中,Secret您必须将授权密钥转移到服务帐户。该文档介绍了如何创建服务帐户并获取密钥。

如果您遇到任何问题, 我们将很高兴收到反馈和问题!

摘要


在过去的两周中,我们一直在五个Kubernetes集群中使用已实施的CCM,并计划在下个月将其数量扩展到20个。当前不建议在大型和关键K8s安装中使用CCM。

与CSI一样,如果Yandex开发人员承担该项目的开发和支持,我们将非常高兴-我们准备根据他们的要求转移存储库,以便为我们处理更多专门的任务。

聚苯乙烯


另请参阅我们的博客:


All Articles