endpoint 是k8s集群中一個資源對象熙揍,存儲在etcd里面,用來記錄一個service對應的所有pod的訪問地址堪旧。service配置selector endpoint controller 才會自動創(chuàng)建對應的endpoint 對象奖亚,否則是不會生產(chǎn)endpoint 對象
k8s集群中創(chuàng)建一個名為test的service,就h會生成一個同名的endpoint 對象析砸,endpoint對象就是關聯(lián)pod的ip 地址和端口 (使用kubectl describe svc mongodb -n namespace-name, 查看當前的service 下面有一個pod 的)
一個service由一組后端的pod組成,這些后端的pod通過service endpoint暴露出來陨囊,如果有一個新的pod創(chuàng)建創(chuàng)建出來夹攒,且podd的標簽名稱(label:pod)跟service里面的標簽(label selector 的label)一致會自動加入到service的endpoints 里面,如果pod對象終止后压语,pod 會自動從edponts 中移除编检。在集群中任意節(jié)點 可以使用curl請求service <CLUSTER-IP>:<PORT>
endpoints: 實際上servce服務后端的pod端點集合
service 不僅可以代理pod 還可以代理任意其它的后端比如運行在k8s集群外部的服務 比如mysql mongodb (如果需要從k8s里面鏈接外部服務(mysql)需要定義同名的service和endpoint)
在實際生成環(huán)境中,像mysql mongodb這種IO密集行應用允懂,性能問題會顯得非常突出,所以在實際應用中粥航,一般不會把這種有狀態(tài)的應用(mysql 等)放入k8s里面生百,而是使用單獨的服務來部署躁锡,而像web這種無狀態(tài)的應用更適合放在k8s里面 里面k8s的自動伸縮,和負載均衡置侍,故障自動恢復 等強大功能
如果在應用程序中直接使用存儲應用的ip 地址映之,考慮如果后期的ip變化了,我們要手動修改應用的配置蜡坊,如果是一倆個服務還好杠输,如果是多服務的話 我們就要一個一個去替換,萬一哪個服務沒有改到 那就秕衙。蠢甲。。据忘。鹦牛!
當然使用configmap也可以解決我說的上述問題,只需要將端點存儲在Configmap里面勇吊,并將其作為環(huán)境變量用于代碼中讀取,但是如果端點發(fā)生變化汉规,我們可能要重新所有的應用的容器
我們需要能夠在k8s里面像使用同一個命名空間下面的服務那種直接使用service name 名稱c,我們可以使用k8s的靜態(tài)服務來解決礼殊,如果后期需要將有狀態(tài)服務添加到k8s里面驹吮,則代碼不需要任何修改。
此時 我們可以使用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的名稱相同晶伦, 且在一個命名空間下面
有一個注意點碟狞,菜鳥的我 爬了好久,一定要注意service.spec.ports[0] 添加一個跟service 的名稱一樣(但是不是必須的婚陪,保持一樣當然是最好的)
使用kubectl apply -f ./xxx.yaml 分別分別服務
分布成功后 使用 kubectl describe svc mongodb -n name-space-name 查詢svc的信息
可以看到service跟endpoint成功掛載一起了族沃,表面外面服務成功掛載到k8s里面了,在應用中配置鏈接的地方使用mongodb://mongodb:30017 鏈接數(shù)據(jù)