k8s 跨namespace的service相互訪問


from:https://www.cnblogs.com/lori/p/12054069.html 

在k8s里,你可以通過服務名去訪問相同namespace里的服務,然后服務可以解析到對應的pod,從而再由pod轉到對應的容器里,我們可以認為這個過程有兩個port的概念,service port 就是服務的port,在k8s配置文件里用port表示,還有一個是pod和容器的port,用targetPort表示,其中pod和容器的port你可以認為它是一個。

多namespace的service場景

我們通常會把mysql,redis,rabbitmq,mongodb這些公用組件放在一個namespace里,或者每個公用組件都有自己的namespace,而你的業務組件會統一放在自己的namespace里,這時就涉及到了跨namespace的數據通訊問題。

k8s的服務名DNS解析

Kubernetes 目前使用的kube-dns來實現集群內部的service dns記錄解析。默認情況下/etc/resolv.conf里,它的內容是統一的格式。

/ # more /etc/resolv.conf nameserver 172.19.0.10 search saas.svc.cluster.local svc.cluster.local cluster.local options ndots:5 

search doamin列表默認情況下,它只包含本地域名。這可以通過在search關鍵字后面列出所需的域搜索路徑來添加。kubernetes為每個容器配置默認是${namespace}.svc.cluster.local svc.cluster.local cluster.local。在一次dns域名查詢時,將會嘗試使用每個search doamin依次搜索少於ndots點(默認值為1)的解析器查詢,直到找到匹配項。對於具有多個子域的環境,建議調整選項ndots:n,以避免man-in-the-middle攻擊和root-dns-servers的不必要通信。

noots:5

這個我們可以把它理解成服務名dns解析的層次,例如{服務名}是一級,而{服務名}.{命名空間}為二層,{服務名}.{命名空間}.svc.cluster.local是第三層,上面的配置一共有5層,同時也開啟了5層,這樣做可以保證最大限度的找到你的服務,但對於解析的性能是有影響的。

請注意,如果搜索域對應的服務器不是本地的,那么這個查詢過程可能會很慢,並且會產生大量的網絡流量。如果其中一個搜索域域沒有可用的服務器,則查詢將超時。

同一集群跨namespace訪問

如果你要連接namespace是redis的,服務名是redis-master的服務,你可以這樣去配置你的連接:

spring: profiles: redis-prod redis: host: redis-master.redis port: 6379 password: 123456 database: 1 

它采用了服務名+命名空間的格式,如果是相同的namespace,可以直接使用服務名來解析。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM