Kubernetes - 集羣內容器訪問集羣外服務

GitHub地址:github.com/QingyaFan/c…mysql

企業內部通常存在不少的微服務,在逐步容器化的過程當中,會有部分服務在集羣外部,未完成容器化,好比數據庫,而部分已經完成容器化的依賴於這些服務的服務,過渡過程當中,須要集羣內部的容器訪問集羣外部的服務。git

爲了在容器化過程當中,讓服務不中斷,就須要讓Kubernetes集羣內部的容器能訪問集羣外部的服務,怎麼作到呢,在每一個應用的配置文件中使用外部IP或者外部rds名字嗎?這樣作,在外部的應用容器化後,還須要修改以前依賴於該應用的應用的配置文件,從新打包容器,這顯然不是一個好的方案。咱們的訴求是,在全部應用容器化過程當中,全部應用均可以無縫集成,ExternalName類型的Service和EndPoint均可以知足咱們的要求,下面咱們分別看一下。github

ExternalName 類型的 Service

在Docker環境中,因爲Docker Engine自帶 DNS Server,咱們使用容器名來訪問其它容器,由於容器是不穩定的,當容器宕掉,再從新啓動相同鏡像的容器,IP地址會改變,因此咱們不使用IP訪問其它容器;一樣的,在Kubernetes集羣中,因爲咱們使用 kube-DNS,咱們經常使用Service名稱來訪問某個服務,Service資源對象能保證其背後的容器副本始終是最新的IP。sql

所以,咱們能夠利用這個特性,對Service名稱和外部服務地址作一個映射,使之訪問Service名稱既是訪問外部服務。例以下面的例子是將 svc1xxx.xxx.xxx.xxx 作了對等關係。數據庫

kind: Service
apiVersion: v1
metadata:
 name: svc1
 namespace: default
spec:
 type: ExternalName
 externalName: somedomain.org
複製代碼

設置 Service 的 EndPoint

在Kubernetes集羣中,同一個微服務的不一樣副本會對集羣內或集羣外(取決於服務對外暴露類型)暴露統一的服務名稱,一個服務背後是多個 EndPointEndPoint解決映射到某個容器的問題,在 EndPoint 中不只能夠指定集羣內容器的IP,還能夠指定集羣外的IP,咱們能夠利用這個特性使用集羣外部的服務。api

EndPoint 方式的缺點是隻能指定IP,不能使用網址,好比網址,好比RDS的地址,這種狀況下只能使用ExternalName來解決。dom

apiVersion: v1
kind: Service
metadata:
 name: mysql-production
spec:
 ports:
 - port: 3306
---
kind: Endpoints
apiVersion: v1
metadata:
 name: mysql-production
 namespace: default
subsets:
 - addresses:
 - ip: 192.168.1.25
 ports:
 - port: 3306
複製代碼

總結

本文介紹了集羣內部訪問外部服務的兩種方法,ExternalName 類型的服務適用於外部服務使用域名的方式,缺點是不能指定端口;而EndPoint的方式適合於外部服務是IP的狀況,可是能夠指定端口。根據須要使用吧!微服務

相關文章
相關標籤/搜索