Pod內(nèi)進(jìn)程訪問(wèn)k8s服務(wù)
外部服務(wù)可以通過(guò)kubeconfig訪問(wèn)k8s服務(wù)痕钢,那k8s集群內(nèi)部服務(wù)(Pos內(nèi)服務(wù))如何訪問(wèn)k8s?
kubeconfig
用configMap保存kueconfig以及ca,供服務(wù)訪問(wèn)。這個(gè)比較簡(jiǎn)單,不擴(kuò)展戈擒。
serviceaccount
sa是給運(yùn)行在Pod中的進(jìn)程用的,它為Pod里的進(jìn)程提供必要的身份證明艰毒。
sa中有token筐高、ca.crt以及namespace信息。serviceaccount controller保證了每個(gè)namespace下都有一個(gè)名為default的sa丑瞧。
通過(guò)sa我們就可以訪問(wèn)k8s服務(wù)柑土,以下是k8s.io\client-go\rest\config.go
中的方法,描述了如何利用sa進(jìn)行訪問(wèn)绊汹。
// InClusterConfig returns a config object which uses the service account
// kubernetes gives to pods. It's intended for clients that expect to be
// running inside a pod running on kubernetes. It will return an error if
// called from a process not running in a kubernetes environment.
func InClusterConfig() (*Config, error) {
host, port := os.Getenv("KUBERNETES_SERVICE_HOST"), os.Getenv("KUBERNETES_SERVICE_PORT")
if len(host) == 0 || len(port) == 0 {
return nil, fmt.Errorf("unable to load in-cluster configuration, KUBERNETES_SERVICE_HOST and KUBERNETES_SERVICE_PORT must be defined")
}
token, err := ioutil.ReadFile("/var/run/secrets/kubernetes.io/serviceaccount/" + api.ServiceAccountTokenKey)
if err != nil {
return nil, err
}
tlsClientConfig := TLSClientConfig{}
rootCAFile := "/var/run/secrets/kubernetes.io/serviceaccount/" + api.ServiceAccountRootCAKey
if _, err := certutil.NewPool(rootCAFile); err != nil {
glog.Errorf("Expected to load root CA config from %s, but got err: %v", rootCAFile, err)
} else {
tlsClientConfig.CAFile = rootCAFile
}
return &Config{
// TODO: switch to using cluster DNS.
Host: "https://" + net.JoinHostPort(host, port),
BearerToken: string(token),
TLSClientConfig: tlsClientConfig,
}, nil
}
本質(zhì)上稽屏,sa就是一個(gè)目錄/var/run/secrets/kubernetes.io/serviceaccount
,k8s創(chuàng)建容器的時(shí)候都會(huì)將default sa掛載到Pod里西乖。
關(guān)于k8s服務(wù)地址狐榔,默認(rèn)k8s都會(huì)起一個(gè)名為kubernetes的服務(wù),供集群內(nèi)服務(wù)調(diào)用获雕,并且早期的服務(wù)發(fā)現(xiàn)都是通過(guò)環(huán)境變量的方式注入到容器里面的薄腻,這些在上面的代碼都有體現(xiàn)。