照例廣告放最前:Hyper 作為一家新的、小的、有夢想的、不做“Copy-to-China”的創業公司,我們歡迎想創新的、有想法的、有技術的小伙伴加盟,并且我們允許遠程辦公。
Kubernetes 中的 Service Account 是個比較難以理解的概念,什么是 Service Account,到底是做什么的?文檔中如是說——
A service account provides an identity for processes that run in a Pod. (服務帳號為 Pod 中的進程提供了一個 id)
不過,這個 Pod 中的進程的 id 是做什么用的,在用不到的時候還真讓人費腦筋。管理文檔里說得更詳細一點,但是仍然沒有提到是做什么用的。
在這種時候,一個好的例子往往勝過文檔的解釋。實際上,kubernetes 的官方示例里就有 Service Account 的應用。仔細看這個例子——在 Kubernetes 中運行 Cassandra。
大家知道,在 Cassandra 這種全對稱結構的集群里,最先啟動的種子節點是最重要的,其他節點都要加入到種子節點的集群中才能保證啟動的是一個集群而不會分裂成多個集群,Cassandra、Akka 集群都有這個要求。
然而,在這個例子中,是先啟動一個節點,然后直接提高 Replica 數量,來做到多節點的,后面的節點是怎么找到種子節點的呢?仔細看例子的文檔——
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
,由它調用 Kubernetes 的 API 來獲得集群中已經存在的節點的。注意,這里就是在 Pod 中運行的進程調用 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,來獲得服務發現的信息。
綜上,Service Account 是 Kubernetes 用于集群內運行的程序,進行服務發現時調用 API 的帳號,帳號的 token 會直接掛載到 Pod 中,可以供程序直接使用。