照例廣告放最前: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 是做什么用的,在用不到的時候還真讓人費腦筋。管理文檔里說得更詳細(xì)一點,但是仍然沒有提到是做什么用的。
在這種時候,一個好的例子往往勝過文檔的解釋。實際上,kubernetes 的官方示例里就有 Service Account 的應(yīng)用。仔細(xì)看這個例子——在 Kubernetes 中運行 Cassandra。
大家知道,在 Cassandra 這種全對稱結(jié)構(gòu)的集群里,最先啟動的種子節(jié)點是最重要的,其他節(jié)點都要加入到種子節(jié)點的集群中才能保證啟動的是一個集群而不會分裂成多個集群,Cassandra、Akka 集群都有這個要求。
然而,在這個例子中,是先啟動一個節(jié)點,然后直接提高 Replica 數(shù)量,來做到多節(jié)點的,后面的節(jié)點是怎么找到種子節(jié)點的呢?仔細(xì)看例子的文檔——
However it also adds a custom SeedProvider to Cassandra. In Cassandra, a
SeedProviderbootstraps the gossip protocol that Cassandra uses to find other nodes. TheKubernetesSeedProviderdiscovers 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é)點的。注意,這里就是在 Pod 中運行的進(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)運行的程序,進(jìn)行服務(wù)發(fā)現(xiàn)時調(diào)用 API 的帳號,帳號的 token 會直接掛載到 Pod 中,可以供程序直接使用。