k8s~跨namespace的service相互訪問

在k8s裏,你能夠經過服務名去訪問相同namespace裏的服務,而後服務能夠解析到對應的pod,從而再由pod轉到對應的容器裏,咱們能夠認爲這個過程有兩個port的概念,service port 就是服務的port,在k8s配置文件裏用port表示,還有一個是pod和容器的port,用targetPort表示,其中pod和容器的port你能夠認爲它是一個。mysql

多namespace的service場景

咱們一般會把mysql,redis,rabbitmq,mongodb這些公用組件放在一個namespace裏,或者每一個公用組件都有本身的namespace,而你的業務組件會統一放在本身的namespace裏,這時就涉及到了跨namespace的數據通信問題。redis

k8s的服務名DNS解析

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

/ # 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的沒必要要通訊。sql

noots:5

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

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

同一集羣跨namespace訪問

若是你要鏈接namespace是redis的,服務名是redis-master的服務,你能夠這樣去配置你的鏈接:網絡

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

它採用了服務名+命名空間的格式,若是是相同的namespace,能夠直接使用服務名來解析。性能

相關文章
相關標籤/搜索