在K8S中,同一個命名空間(namespace)下的服務(wù)之間調(diào)用,之間通過服務(wù)名(service name)調(diào)用即可。不過在更多時候,我們可能會將一些服務(wù)單獨隔離在一個命名空間中(比如我們將中間件服務(wù)統(tǒng)一放在 middleware 命名空間中,將業(yè)務(wù)服務(wù)放在 business 命名空間中)。
遇到這種情況,我們就需要跨命名空間訪問,K8S 對service 提供了四種不同的類型,針對這個問題我們選用 ExternalName 類型的 service 即可。
k8s service 分為四種類型,分別為:
ClusterIp(默認(rèn)類型,每個Node分配一個集群內(nèi)部的Ip,內(nèi)部可以互相訪問,外部無法訪問集群內(nèi)部)
NodePort(基于ClusterIp,另外在每個Node上開放一個端口,可以從所有的位置訪問這個地址)
LoadBalance(基于NodePort,并且有云服務(wù)商在外部創(chuàng)建了一個負(fù)載均衡層,將流量導(dǎo)入到對應(yīng)Port。要收費的,一般由云服務(wù)商提供,比如阿里云、AWS等均提供這種服務(wù))
ExternalName(將外部地址經(jīng)過集群內(nèi)部的再一次封裝,實際上就是集群DNS服務(wù)器將CNAME解析到了外部地址上,實現(xiàn)了集群內(nèi)部訪問)
本文使用 ExternalName 實現(xiàn)我們的需求:
1、首先創(chuàng)建一個 ExternalName 類型的 service
2、然后通過 {SERVICE_NAME}.{NAMESPACE_NAME}.svc.cluster.local 這樣的格式,訪問目標(biāo) namespace 下的服務(wù)。
以文初所述的 middleware 和 business 為例:
middleware 命名空間下有一個服務(wù) middleware01,middleware01 自己對外的 service_name 為 svc-middleware01
business 命名空間下有一個服務(wù) app01,app01 自己對外的 service_name 為 svc-app01
在 business 命名空間下創(chuàng)建一個 service,名稱為 svc-middleware01-external,設(shè)定 service 的 type: ExternalName、externaleName: middleware01.middleware.svc.cluster.local
那么,在 app01 中訪問 middleware01 服務(wù)中的 xxxApi 地址則為:http://svc-middleware01-external.middleware.svc.cluster.local:{PORT}/xxxApi
最最后,我想告訴你的是:這個 svc-middleware01-external 你可以當(dāng)做多此一舉,完全可以直接使用 {SERVICE_NAME}.{NAMESPACE_NAME}.svc.cluster.local 跨命名空間訪問。
之所以做這一步,是因為一般來說其他命名空間的服務(wù)在當(dāng)前我們自己命名空間中,我們希望名稱統(tǒng)一。這樣如果我們多個服務(wù)都使用同一個外部命名空間的服務(wù)時如果外部命名空間的服務(wù)名變更了,我們只需要修改一個地方即可。
下面再給一個同命名空間下 Stateful Set 通過內(nèi)部 host 名稱訪問的例子(命名空間為 demo):
1、創(chuàng)建了一個名稱為 eureka-server 的 Statefule Set,數(shù)量設(shè)置3個副本,K8s 會自從創(chuàng)建3個Pod eureka-server-0、eureka-server-1、eureka-server-2。
2、創(chuàng)建一個 Headless 類型的 Service,名稱為 svc-eureka-server。
3、則同命名空間下訪問這3個 eureka-server Pod 的 host 如下:
1 http://eureka-server-0.svc-eureka-server:8761/eureka/
2 http://eureka-server-1.svc-eureka-server:8761/eureka/
3 http://eureka-server-2.svc-eureka-server:8761/eureka/
或者文章來源:http://www.zghlxwxcb.cn/news/detail-628555.html
1 http://eureka-server-0.svc-eureka-server.demo.svc.cluster.local:8761/eureka/
2 http://eureka-server-1.svc-eureka-server.demo.svc.cluster.local:8761/eureka/
3 http://eureka-server-2.svc-eureka-server.demo.svc.cluster.local:8761/eureka/
以上兩種格式差異,主要是第二種方式后面多了一段 demo.svc.cluster.local,結(jié)合上文提到的內(nèi)容,給出結(jié)論為 “同一個命名空間中,訪問最后那一段 demo.svc.cluster.local 可以省略”。文章來源地址http://www.zghlxwxcb.cn/news/detail-628555.html
到了這里,關(guān)于K8S 跨 namespace 訪問服務(wù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!