您好,登錄后才能下訂單哦!
本文小編為大家詳細介紹“不同k8s集群間服務怎么相互訪問”,內容詳細,步驟清晰,細節處理妥當,希望這篇“不同k8s集群間服務怎么相互訪問”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。
不同工程團隊有各自的 k8s 開發集群, 負責的服務部署在各自的集群上
但是這些服務之間存在調用關系(單項或者雙向的)
不同 k8s 集群之間內網是聯通的
其中一個集群要作為流量入口,面向用戶
實現服務跨集群訪問
服務之間只能通過內網調用
統一的外部流量接入控制
跨集群訪問,應該是一個比較普遍的需求,市面上有很多各種各樣的方案。比如:
跨集群的注冊發現服務 比如使用 nacos 作為跨集群的注冊發現中間件,所有在不同集群里的服務都注冊到 nacos 上,由 nacos 來進行服務的注冊發現以及負載均衡。
配置集群內網SLB 每一個集群各自配置一個自己的內網 SLB 地址,通過 ingress 的 path 配置不同的路由轉發。
使用ExternalName Service 在 請求發起方集群 配置 跨集群服務 在 本集群的 service,type 為 ExternalName 的headless service。
方案 | 優點 | 缺點 |
---|---|---|
跨集群的注冊發現服務 | 無需額外運維要求 | 要求所有服務使用同一套注冊發現服務,限制比較強,且注冊發現服務不一定滿足不同技術棧的團隊,比如 nacos 就沒有官方支持的 go sdk |
配置集群內網SLB | 對調用方友好,無需在調用方做額外運維配置,只需要正常業務代碼內調用即可 | 對集群運維要求較高,需要有一定的運維知識,且如果沒有現成的 SLB 組件,還需要自建,成本較高 |
使用ExternalName Service | 適用范圍最廣,使用最靈活,可以在任何階段進行配置改造,對跨集群服務支持的調用方式兼容性好(支持 ClusterIP, NodePort 以及域名調用) | 對本方集群運維能力要求高 |
以上三種方案,都可以實現跨集群的服務調用。然而,方案三卻是目前最符合現狀且能推進下去的。所以,下面就方案三展開來說。
方案三用到了 k8s 的 ExternalName Service(這里不展開講這是什么,感興趣可以點擊查看)。主要講怎么用。下面分幾個場景來講解:
假設:k8s2 集群有個服務 s2, 對外以 Ingress 方式提供服務,訪問地址是: abc.com 調用方集群創建一個 service :
apiVersion: v1 kind: Service metadata: name: k8s2-s2 namespace: prod spec: type: ExternalName externalName: abc.com ports: - name: http port: 80 protocol: TCP targetPort: 80
那么, 在調用方集群內的服務,就可以通過本集群的服務名(k8s2-s2.prod.svc.cluster.local
)去訪問跨集群的服務。
假設:k8s3 集群有個服務 s3, 對外以 NodePort 方式提供服務,訪問地址是:192.168.0.199:30099 按照場景 1 的配置生成一個 service,可以用么?
apiVersion: v1 kind: Service metadata: name: k8s3-s3 namespace: prod spec: type: ExternalName externalName: 192.168.0.199 ports: - name: http port: 80 protocol: TCP targetPort: 30099
可以用,但是有問題。在 nginx 的日志里會瘋狂打印一個錯誤:找不到 192.168.0.199 這個域名對應的 ip。原因是,在集群看來, externalName 字段是一個域名,是需要做 dns 解析成 ip 的。如果我們直接填一個 ip 的字段,雖然能用,但是會瘋狂輸出日志,沖掉正常 nginx 請求的日志。
那既然這樣,改成域名調用唄。那么問題來了,對方給我一個 ip,我上哪去變一個域名呢?修改 hosts,準確的說,修改 k8s coredns 服務的 hosts:
# kubectl -n kube-system edit cm coredns apiVersion: v1 data: Corefile: | .:53 { ... hosts { 192.168.0.199 s3.k8s3 fallthrough } ... } kind: ConfigMap metadata: name: coredns namespace: kube-system
然后修改 service
apiVersion: v1 kind: Service metadata: name: k8s3-s3 namespace: prod spec: type: ExternalName externalName: s3.k8s3 ports: - name: http port: 80 protocol: TCP targetPort: 30099
此時,在調用方集群內的服務,就可以通過本集群的服務名(k8s3-s3.prod.svc.cluster.local
)去訪問跨集群的服務。
讀到這里,這篇“不同k8s集群間服務怎么相互訪問”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。