K8S-使用endpoint引用外部服務(wù)

endpoint 是k8s集群中一個(gè)資源對象,存儲(chǔ)在etcd里面,用來記錄一個(gè)service對應(yīng)的所有pod的訪問地址。service配置selector endpoint controller 才會(huì)自動(dòng)創(chuàng)建對應(yīng)的endpoint 對象,否則是不會(huì)生產(chǎn)endpoint 對象

k8s集群中創(chuàng)建一個(gè)名為test的service,就h會(huì)生成一個(gè)同名的endpoint 對象,endpoint對象就是關(guān)聯(lián)pod的ip 地址和端口 (使用kubectl describe svc mongodb -n namespace-name, 查看當(dāng)前的service 下面有一個(gè)pod 的)

一個(gè)service由一組后端的pod組成,這些后端的pod通過service endpoint暴露出來,如果有一個(gè)新的pod創(chuàng)建創(chuàng)建出來,且podd的標(biāo)簽名稱(label:pod)跟service里面的標(biāo)簽(label selector 的label)一致會(huì)自動(dòng)加入到service的endpoints 里面,如果pod對象終止后,pod 會(huì)自動(dòng)從edponts 中移除。在集群中任意節(jié)點(diǎn) 可以使用curl請求service <CLUSTER-IP>:<PORT>

endpoints: 實(shí)際上servce服務(wù)后端的pod端點(diǎn)集合

service 不僅可以代理pod 還可以代理任意其它的后端比如運(yùn)行在k8s集群外部的服務(wù) 比如mysql mongodb (如果需要從k8s里面鏈接外部服務(wù)(mysql)需要定義同名的service和endpoint)

在實(shí)際生成環(huán)境中,像mysql mongodb這種IO密集行應(yīng)用,性能問題會(huì)顯得非常突出,所以在實(shí)際應(yīng)用中,一般不會(huì)把這種有狀態(tài)的應(yīng)用(mysql 等)放入k8s里面,而是使用單獨(dú)的服務(wù)來部署,而像web這種無狀態(tài)的應(yīng)用更適合放在k8s里面 里面k8s的自動(dòng)伸縮,和負(fù)載均衡,故障自動(dòng)恢復(fù) 等強(qiáng)大功能

如果在應(yīng)用程序中直接使用存儲(chǔ)應(yīng)用的ip 地址,考慮如果后期的ip變化了,我們要手動(dòng)修改應(yīng)用的配置,如果是一倆個(gè)服務(wù)還好,如果是多服務(wù)的話 我們就要一個(gè)一個(gè)去替換,萬一哪個(gè)服務(wù)沒有改到 那就。。。。!

當(dāng)然使用configmap也可以解決我說的上述問題,只需要將端點(diǎn)存儲(chǔ)在Configmap里面,并將其作為環(huán)境變量用于代碼中讀取,但是如果端點(diǎn)發(fā)生變化,我們可能要重新所有的應(yīng)用的容器

我們需要能夠在k8s里面像使用同一個(gè)命名空間下面的服務(wù)那種直接使用service name 名稱c,我們可以使用k8s的靜態(tài)服務(wù)來解決,如果后期需要將有狀態(tài)服務(wù)添加到k8s里面,則代碼不需要任何修改。

此時(shí) 我們可以使用service 和endpont k8s里面的資源

開始擼碼(以mogodb為例)代碼可以直接拷貝使用

  • 創(chuàng)建service (mongodb-service-exten)
kind: Service
apiVersion: v1
metadata:
  name: mongodb
  namespace: name
spec:
  ports:
  - port: 30017
    name: mongodb
    targetPort: 30017
  • 創(chuàng)建 endpoint(mongodb-endpoint)
kind: Endpoints
apiVersion: v1
metadata: 
  name: mongodb
  namespace: tms-test
subsets:
- addresses:
  - ip: xxx.xxx.xx.xxx
  ports:
   - port: 30017
     name: mongod

service 和endpoint的名稱相同, 且在一個(gè)命名空間下面

有一個(gè)注意點(diǎn),菜鳥的我 爬了好久,一定要注意service.spec.ports[0] 添加一個(gè)跟service 的名稱一樣(但是不是必須的,保持一樣當(dāng)然是最好的)
使用kubectl apply -f ./xxx.yaml 分別分別服務(wù)

分布成功后 使用 kubectl describe svc mongodb -n name-space-name 查詢svc的信息

image

可以看到service跟endpoint成功掛載一起了,表面外面服務(wù)成功掛載到k8s里面了,在應(yīng)用中配置鏈接的地方使用mongodb://mongodb:30017 鏈接數(shù)據(jù)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容