Spring Cloud Kubernetes 移除 Eureka 中間件

Spring Cloud Kubernetes 移除 Eureka 中間件

Kubernetes 通過 Kube-proxy 組件柬脸、Service 對象實現(xiàn)了 Pod 的服務發(fā)現(xiàn)、負載均衡問題毙驯,在 Spring Cloud 體系中是通過 Eureka倒堕、Nacos 等中間件來實現(xiàn)的,既然我們的微服務是基于 Kubernetes 來部署的爆价,那這部分功能就可以下沉到基礎設施層垦巴,由 Kubernetes 來提供。

在 Spring-Cloud-Dependencies 中已經(jīng)引入了 Kubernetes 客戶端操作的相關包铭段,來解決微服務在 K8s 體系中服務發(fā)現(xiàn) Discovery(Service) 和配置中心 Config(ConfigMap) 的問題骤宣。

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-kubernetes-dependencies</artifactId>
    <version>${spring-cloud-kubernetes.version}</version>
    <type>pom</type>
    <scope>import</scope>
</dependency>

下面還以 https://github.com/14032/cloud 這個 Demo 程序為例,來看下服務中如何使用 K8s 的服務發(fā)現(xiàn)功能來替代掉 Eureka序愚。

在 Kubernetes 的實現(xiàn)版本中憔披,首先去除掉 Eureka、Ribbon 客戶端的依賴爸吮。

引入 Spring Cloud Kubernetes 相關依賴做適配芬膝,Spring Cloud Kubernetes 本身引入了 Fabbric8 的 Kubernetes Client 作為客戶端來操作 Kubernetes API Server。

<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-kubernetes</artifactId>
</dependency>
<!--<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-kubernetes-loadbalancer</artifactId>
</dependency>-->
<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-kubernetes-ribbon</artifactId>
</dependency>

上面提供了兩種負載均衡實現(xiàn)拗胜,ribbon 和 loadbalancer 選擇一個即可蔗候,再看下配置文件如下:

spring:
  cloud:
    kubernetes:
      discovery:
        service-name: ${spring.application.name}
        all-namespaces: true
      ribbon:
        enabled: true
        mode: service
        cluster-domain: cluster.local

spring.cloud.kubernetes.ribbon.mode 提供了兩種模式:servicepod

這兩種模式埂软,其實也就對應了 Kubernetes 的兩個 API 接口:

  • /api/v1/namespaces/cloud/endpoints
  • /api/v1/namespaces/cloud/services
@Bean
@ConditionalOnMissingBean
public ServerList<?> ribbonServerList(KubernetesClient client, IClientConfig config,...) {
KubernetesServerList serverList;
  if (properties.getMode() == KubernetesRibbonMode.SERVICE) {
    serverList = new KubernetesServicesServerList(client, properties);
  }
  else {
    serverList = new KubernetesEndpointsServerList(client, properties);
  }
  return serverList;
}

如果選用 service 模式锈遥,Ribbon 的客戶端負載均衡也就不在有效纫事,而是使用 Kubernetes Service 本身具有的基于 DNS 的負載均衡功能。例如:auth-server.cloud.svc.cluster.local:9096所灸,這種方式也不會再出現(xiàn)使用Eureka (服務端緩存丽惶、客戶端心跳、客戶端更新頻率)時因服務更新而導致的服務間短暫調(diào)用失敗問題爬立。

因為只有處于就緒狀態(tài)(readliness)的服務才會出現(xiàn)在 Service 的 Endpoints 站點列表中钾唬。pod 模式,就是去獲取 Service 代理的 Endpoints 站點侠驯,由 Ribbon 來提供負載均衡功能抡秆。

下面再看下 Spring Cloud Kubernetes 是如何獲取 K8s 集群服務列表的?答案就是:Fabbric8吟策。

Fabbric8 通過默認的 Kubernetes API Server 的代理 Service 域名來訪問 API Server儒士。

從 Pod 中訪問 API

當你從 Pod 中訪問 API 時,定位和驗證 apiserver 會有些許不同檩坚。
在 Pod 中定位 apiserver 的推薦方式是通過 kubernetes.default.svc 這個 DNS 名稱着撩,該名稱將會解析為服務 IP,然后服務 IP 將會路由到 apiserver匾委。
向 apiserver 進行身份驗證的推薦方法是使用 服務帳戶 憑據(jù)拖叙。 通過 kube-system,Pod 與服務帳戶相關聯(lián)赂乐,并且該服務帳戶的憑證(token) 被放置在該 Pod 中每個容器的文件系統(tǒng)中薯鳍,位于 /var/run/secrets/kubernetes.io/serviceaccount/token

DEFAULT_MASTER_URL = "https://kubernetes.default.svc"

default 空間下沪猴,名稱為 kubernetes 的 Service 的 Endpoints 即為 Master 節(jié)點上 6443 端口的服務辐啄,下圖可以看到 6443 端口既是 kube-apiserver 組件。

經(jīng)過上面的改造后运嗜,我們就可以重新構建鏡像將微服務部署到 Kubernetes 集群中,當服務啟動悯舟,相互訪問的時候担租,會出現(xiàn)如下錯誤,Message: Forbidden!Configured service account doesn't have access Pod 內(nèi)沒有權限去訪問 apiserver抵怎,如果你了解過 Kubernetes 基于角色的權限控制 (RBAC)的功能奋救,你會立即想到要給 Pod 重新綁定一個 ServiceAccount 來授權操作 kube-apiserver 接口。

2021-07-25 17:42:21.000 ERROR 1 [   scheduling-1] [o.s.c.k.d.KubernetesCatalogWatch       ] - Error watching Kubernetes Services
io.fabric8.kubernetes.client.KubernetesClientException: Failure executing: GET at: https://10.96.0.1/api/v1/endpoints. Message: Forbidden!Configured service account doesn't have access. Service account may have been revoked. endpoints is forbidden: User "system:serviceaccount:cloud:default" cannot list resource "endpoints" in API group "" at the cluster scope.
        at io.fabric8.kubernetes.client.dsl.base.OperationSupport.requestFailure(OperationSupport.java:589)
        at io.fabric8.kubernetes.client.dsl.base.OperationSupport.assertResponseCode(OperationSupport.java:526)
        at io.fabric8.kubernetes.client.dsl.base.OperationSupport.handleResponse(OperationSupport.java:492)

參考文檔:spring-cloud-kubernetes/docs/current/reference/html/#service-account

我這里直接給了 Kubernetes 默認的集群只讀角色 view反惕,更細粒度的可參看官方文檔尝艘。

apiVersion: v1
kind: ServiceAccount
metadata:
  name: cloud-account
  namespace: cloud
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: cloud-account
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: view
subjects:
  - kind: ServiceAccount
    name: cloud-account
    namespace: cloud

然后再為微服務的每個 Pod 綁定此賬號,這樣容器里的應用就可以使用這個 ServiceAccount 來訪問 API Server 了姿染。

spec:  
  serviceAccountName: cloud-account

這樣基于 kubernetes 平臺部署的微服務背亥,就不再需要引入 Eureka 中間件來解決服務發(fā)現(xiàn)/注冊的功能,而是在基礎設施層替代原有的應用層面的技術組件。

同樣的狡汉,配置中心也可以下沉到基礎設施層娄徊,由 kubernetes 中的 ConfigMap 對象來提供。

網(wǎng)關層盾戴,前面有介紹寄锐,Ingress 并不能勝任 API 網(wǎng)關的角色。

如果引入 Istio 服務網(wǎng)格尖啡,Istio 將會接管 Kube-proxy 的代理能力橄仆,以及 Kubernetes 中 Service 服務發(fā)現(xiàn)的能力。Istio 控制平面會和 Kubernetes 的 API 對接衅斩,將集群內(nèi)部所有的服務沿癞、站點信息下發(fā)到每一個 Sidecar 代理中。

也即 Pod 中的所有請求被 Envoy 代理攔截后矛渴,直接根據(jù)本地的服務列表信息進行路由負載轉發(fā)椎扬。

這時 Spring Cloud Feign、Discovery具温、Ribbon 等都可以移除蚕涤,服務之間直接以服務名稱(svc 域名)進行訪問。

~ END ~

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末铣猩,一起剝皮案震驚了整個濱河市揖铜,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌达皿,老刑警劉巖天吓,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異峦椰,居然都是意外死亡龄寞,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進店門汤功,熙熙樓的掌柜王于貴愁眉苦臉地迎上來物邑,“玉大人,你說我怎么就攤上這事滔金∩猓” “怎么了?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵餐茵,是天一觀的道長科阎。 經(jīng)常有香客問我,道長忿族,這世上最難降的妖魔是什么锣笨? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任蝌矛,我火速辦了婚禮,結果婚禮上票唆,老公的妹妹穿的比我還像新娘朴读。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著绰更,像睡著了一般堕澄。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天,我揣著相機與錄音,去河邊找鬼惩琉。 笑死,一個胖子當著我的面吹牛夺荒,可吹牛的內(nèi)容都是我干的瞒渠。 我是一名探鬼主播,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼技扼,長吁一口氣:“原來是場噩夢啊……” “哼伍玖!你這毒婦竟也來了?” 一聲冷哼從身側響起剿吻,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤窍箍,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后丽旅,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體椰棘,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年榄笙,在試婚紗的時候發(fā)現(xiàn)自己被綠了邪狞。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡办斑,死狀恐怖外恕,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情乡翅,我是刑警寧澤,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布罪郊,位于F島的核電站蠕蚜,受9級特大地震影響,放射性物質發(fā)生泄漏悔橄。R本人自食惡果不足惜靶累,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一腺毫、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧挣柬,春花似錦潮酒、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至侧到,卻和暖如春勃教,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背匠抗。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工故源, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人汞贸。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓绳军,卻偏偏與公主長得像,于是被迫代替她去往敵國和親矢腻。 傳聞我的和親對象是個殘疾皇子门驾,可洞房花燭夜當晚...
    茶點故事閱讀 42,762評論 2 345

推薦閱讀更多精彩內(nèi)容