照例廣告放最前:Hyper 作為一家新的择克、小的恬总、有夢想的、不做“Copy-to-China”的創(chuàng)業(yè)公司肚邢,我們歡迎想創(chuàng)新的壹堰、有想法的、有技術(shù)的小伙伴加盟道偷,并且我們允許遠(yuǎn)程辦公缀旁。
Kubernetes 中的 Service Account 是個比較難以理解的概念,什么是 Service Account勺鸦,到底是做什么的并巍?文檔中如是說——
A service account provides an identity for processes that run in a Pod. (服務(wù)帳號為 Pod 中的進(jìn)程提供了一個 id)
不過,這個 Pod 中的進(jìn)程的 id 是做什么用的换途,在用不到的時候還真讓人費(fèi)腦筋懊渡。管理文檔里說得更詳細(xì)一點(diǎn)刽射,但是仍然沒有提到是做什么用的。
在這種時候剃执,一個好的例子往往勝過文檔的解釋誓禁。實(shí)際上,kubernetes 的官方示例里就有 Service Account 的應(yīng)用肾档。仔細(xì)看這個例子——在 Kubernetes 中運(yùn)行 Cassandra摹恰。
大家知道,在 Cassandra 這種全對稱結(jié)構(gòu)的集群里怒见,最先啟動的種子節(jié)點(diǎn)是最重要的俗慈,其他節(jié)點(diǎn)都要加入到種子節(jié)點(diǎn)的集群中才能保證啟動的是一個集群而不會分裂成多個集群,Cassandra遣耍、Akka 集群都有這個要求闺阱。
然而,在這個例子中舵变,是先啟動一個節(jié)點(diǎn)酣溃,然后直接提高 Replica 數(shù)量,來做到多節(jié)點(diǎn)的纪隙,后面的節(jié)點(diǎn)是怎么找到種子節(jié)點(diǎn)的呢赊豌?仔細(xì)看例子的文檔——
However it also adds a custom SeedProvider to Cassandra. In Cassandra, a
SeedProvider
bootstraps the gossip protocol that Cassandra uses to find other nodes. TheKubernetesSeedProvider
discovers the Kubernetes API Server using the built in Kubernetes discovery service, and then uses the Kubernetes API to find new nodes
這里提到了,image 中的 Cassandra 有一個特殊的 KubernetesSeedProvider
瘫拣,由它調(diào)用 Kubernetes 的 API 來獲得集群中已經(jīng)存在的節(jié)點(diǎn)的亿絮。注意告喊,這里就是在 Pod 中運(yùn)行的進(jìn)程調(diào)用 Kubernetes API 的地方麸拄,也就是 Service Account 工作的地方。
代碼之前黔姜,了無秘密拢切,看這段代碼
public List<InetAddress> getSeeds() {
List<InetAddress> list = new ArrayList<InetAddress>();
String host = "https://kubernetes.default.cluster.local";
String serviceName = getEnvOrDefault("CASSANDRA_SERVICE", "cassandra");
String podNamespace = getEnvOrDefault("POD_NAMESPACE", "default");
String path = String.format("/api/v1/namespaces/%s/endpoints/", podNamespace);
try {
String token = getServiceAccountToken();
這里,給出了訪問的 endpoints API秆吵,并且要從本地取出 Service Account 的 Token淮椰,來獲得服務(wù)發(fā)現(xiàn)的信息。
綜上纳寂,Service Account 是 Kubernetes 用于集群內(nèi)運(yùn)行的程序主穗,進(jìn)行服務(wù)發(fā)現(xiàn)時調(diào)用 API 的帳號,帳號的 token 會直接掛載到 Pod 中毙芜,可以供程序直接使用忽媒。