公有云上各厂家都提供了不同的容器平台,VMware也有以cluster api为核心的tkg产品,以自家实现的cluster api vsphere provider 为基础,可以在vsphere上随时创建K8s cluster。实际上,裸机也有同样的技术,那就是cluster api metal3 provider。

当我们的机房里来了一批服务器后,

首先,我们要求机房管理人员把机器安装到机柜里,插上电源,并且根据现在的机房vlan拓扑,插入网线,然后根据机器使用说明,初始化IPMI接口。最后,机房管理人员把这些机器的IPMI信息交付给我们,从这里开始,我们就可以远程管理这些机器,并为其部署K8s。

  • IPMI:远程机器管理接口,更新的版本为redfish

在openstack生态里,有一个子项目ironic,它可以用来对裸机部署OS,这个项目虽然是redhat维护,但同时也有多家服务器厂商为它提供“驱动”,这里的驱动就是能够帮忙远程管理机器的接口,虽然IPMI是主流,但也有不少其他服务器厂商有特定的接口,基本上市面上的所有接口,ironic都能兼容,即使不兼容,它也提供方法让用户自己实现。

而在ironic之上,另外一个项目,baremetal-operator,它对ironic进行了封装,把所有ironic提供的功能通过K8s Custom Resource暴露给用户,而最核心的资源就是BareMetalHost,用户只需要定义bmh,就可以通过kubectl来对机器远程部署OS,很显然,这里bmh定义里最重要的输入就是IPMI信息。

再往上,就有cluster api metal3 provider,它实现了bare metal上的cluster api provider,官方架构图:

可以看到,与Machine对于的资源是Metal3Machine,而BareMetalHost才是Metal3Machine的具体实现。需要注意的是,这里bmh和cluster api是解耦的,所以它们是互相独立创建,Metal3Machine会寻找当前cluster里符合条件的bmh,并与之关联;在删除资源的时候,删除cluster也不会删除bmh。

当然,metal3里为了实现cluster api provider的contract,做了比较多的事情,这里面包括

  • Node Image的准备,事实上,所有K8s provision系统都需要准备node image,只不过其他系统里image是给VM用,这里的image是直接安装在物理服务器上的

  • Control plane loadbalancer的选取,tkg里用了kube-vip或者商用的avi loadbalancer,公有云都有自己的LB方案,metal3选用的则是keepalived

  • CNI,metal3用了calico,不过只要熟悉cluster api提供的kubeadmconfigtemplate就很容易把它替换成其他产品

  • Runtime,metal3用了cri-o,因为runtime是直接包含在node image中,所以想要更换,并不容易,但也不是没有办法,如果熟悉了node image的制作过程,我们也可以制作自己的node image,从而替换runtime

值得注意的是,安装metal3并不需要下载源码,clusterctl两条命令就够了。不过,baremetal-operator如前所述,是独立的组件,需要单独安装,并且需要clone它的源码,安装的过程可能并不会很轻松。

虽然过程艰难,但有了这一套技术,我们就可以在自家机房实现一个完整的容器云平台。无论是每个机柜对应一个workload cluster集群,还是跨机架创建workload cluster,只要安排好网络拓扑,保证management cluster的稳定性,就能对上层提供一个相对稳定的集群环境。


original refer