federation--kubernetes集群联邦的实现
kubernetes默认的模式,是以处于同zone同cloud provider的单cluster形式,对外提供服务。
但是,有一些场景不是单一cluster模式适用的,比如提供全球服务时的低延迟、故障隔离(避免单节点故障)、高扩容(单节点内有一定限制)、以及为了数据安全而采用的混合云部署策略。这个时候,就需要用到federation了。
federation在 https://github.com/kubernetes/federation可以查看,属于一个独立于kubernetes的项目。从架构上来看,它属于kubernetes的上面一层。启用kubefed不会影响和改变cluster内部的任何工作。
单一的cluster对外提供服务的entrypoint是唯一的,所有的服务请求都由api server进来。然后,才有api server同controller manager交互、并与worker node通信等一系列后续操作。那么,federation这一层,所采用的结构其实是类似的。首先,有一个fcp的概念。fcp, federation control panel,它由三部分构成:federation api server、federation control manager和kubefed(CLI工具)。
// cmd / kubefed / app / kubefed.go
这里指定了两个镜像,etcd和fcp
// cmd / genfeddocs
针对不同的对象生成文档,对象类型包括:federation api server、federation control manager和kubefed。目前作用没有细究。
// cmd / fcp
server.go里面定义一个server的标准类型,api server、control manager server都基于这个类型来实例化。
type HyperKubestruct {
Name string// The executable name, used for help and soft-link invocation
Long string// A long description of the binary. It will be world wrapped before output.
servers []Server
baseFlags *pflag.FlagSet
out io.Writer
helpFlagVal bool
makeSymlinksFlagVal bool
}
基于HyperKube类型实例化fcp,再把api server和control manager server都添加到fcp.servers 里,同时把fcp添加到该server的hk里。这样,fcp和server的关系就是双向的,通过一个都能找到另一个。
dns server目前只支持coredns、azuredns和aws route53。