今天做了好多事,搬砖,出门吃饭,还有就是为了做毕设读了读kubernetes下的一个子项目,kubernetes/deployment-manager(下称dm)有关调用kubectl部署内容到kubernetes集群部分的代码。这里写一下自己的阅读记录吧~

读完dm的design.md,会发现在实现部署到kubernetes集群上时,dm专门抽象出了一个service,叫做resourcifier来专门处理来自manager的请求。其实逻辑非常简练,先看看resourcifier的代码。

var configurations = []Route{
	{"ListConfigurations", "/configurations/{type}", "GET", listConfigurationsHandlerFunc, ""},
	{"GetConfiguration", "/configurations/{type}/{name}", "GET", getConfigurationHandlerFunc, ""},
	{"CreateConfiguration", "/configurations", "POST", createConfigurationHandlerFunc, "JSON"},
	{"DeleteConfiguration", "/configurations", "DELETE", deleteConfigurationHandlerFunc, "JSON"},
	{"PutConfiguration", "/configurations", "PUT", putConfigurationHandlerFunc, "JSON"},
}

func getConfigurator() *configurator.Configurator {
	kubernetesConfig := &util.KubernetesConfig{
		KubePath:       *kubePath,
		KubeService:    *kubeService,
		KubeServer:     *kubeServer,
		KubeInsecure:   *kubeInsecure,
		KubeConfig:     *kubeConfig,
		KubeCertAuth:   *kubeCertAuth,
		KubeClientCert: *kubeClientCert,
		KubeClientKey:  *kubeClientKey,
		KubeToken:      *kubeToken,
		KubeUsername:   *kubeUsername,
		KubePassword:   *kubePassword,
	}
	return configurator.NewConfigurator(util.NewKubernetesKubectl(kubernetesConfig))
}

在init的时候会创建出一个configurator,这个configurator其实只是简单地封装了kubernetes的kubectl。其中的KubePath,是通过命令行参数传进来的,写好在Dockerfile中的。然后通过注册REST的API,来向manager提供服务。resourcifier做的事情到这里就结束了,下面看看manager中是怎么跟resourcifier交互的。

func newManager(cp common.CredentialProvider) manager.Manager {
	registryProvider := registry.NewDefaultRegistryProvider(cp)
	resolver := manager.NewTypeResolver(registryProvider)
	expander := manager.NewExpander(getServiceURL(*expanderURL, *expanderName), resolver)
	deployer := manager.NewDeployer(getServiceURL(*deployerURL, *deployerName))
	r := repository.NewMapBasedRepository()
	service := registry.NewInmemRegistryService()
	credentialProvider := cp
	return manager.NewManager(expander, deployer, r, registryProvider, service, credentialProvider)
}

type Deployer interface {
	GetConfiguration(cached *common.Configuration) (*common.Configuration, error)
	CreateConfiguration(configuration *common.Configuration) (*common.Configuration, error)
	DeleteConfiguration(configuration *common.Configuration) (*common.Configuration, error)
	PutConfiguration(configuration *common.Configuration) (*common.Configuration, error)
}

func NewDeployer(url string) Deployer {
	return &deployer{url, 15}
}

其中负责与resourcifier进行交互的是deployer,不造为什么谷歌写代码都爱用xxxxer。deployer被初始化的时候,会先去找resourcifier的url,在kubernetes上,找的方法是用DNS来找Service。代码里还写了很多其他方法,但是如果按照readme中的启动方法启动的话是会通过DNS来找的。找到之后就会创建一个实现了Deployer接口的结构,然后就可以用这个结构来与resourcifier进行交互。

代码逻辑其实很简单啦,这样做有什么好处呢,微服务吧,manager和resourcifier跑在两个容器里,通过REST API交互,看了之后发现对毕设还是很有帮助的。在扩展方面,如果之后不是单纯支持kubernetes集群,可以添加少部分manager代码,新写一个resourcifier,应该就可以实现了,挺方便扩展的。

评论