ingress是k8s內(nèi)置的7層反向代理的抽象,其自帶了負(fù)載與代理尋址功能,通過對ingress controller的實(shí)現(xiàn),可以方便的將內(nèi)部資源以域名及路徑的形式暴露出去,結(jié)合service可以輕松實(shí)現(xiàn)負(fù)載均衡及高可用。
k8s部署pod,會自動生成endpoint信息(容器的IP及端口清單),service指向endpoint。

關(guān)系圖
對于外部資源(未使用k8s部署的,如外部的數(shù)據(jù)庫或應(yīng)用),也可以使用ingress+service+endpoint的模式實(shí)現(xiàn)高可用及負(fù)載均衡,我們用nginx模擬下這個(gè)場景:
分別在節(jié)點(diǎn)1,節(jié)點(diǎn)2用docker啟用nginx:
映射到主機(jī)端口為8021
docker run --name nginx81 -p 8021:80 -d -v /data/nginx81/nginx.conf:/etc/nginx/nginx.conf -v /data/nginx81/html:/usr/share/nginx/html -v /data/nginx81/conf.d:/etc/nginx/conf.d nginx:latest
然后我們創(chuàng)建一個(gè)1.html文件
html正文,兩個(gè)節(jié)點(diǎn)分別寫各自節(jié)點(diǎn)名稱,以區(qū)分。
node1:
<html><body>node1 8021 1.html</body></html>
node2:
<html><body>node2 8021 1.html</body></html>
然后我們預(yù)覽兩個(gè)地址:

節(jié)點(diǎn)1

節(jié)點(diǎn)2
通過ingress映射外部
---
kind: Endpoints
apiVersion: v1
metadata:
name: edp-test
namespace: my-system
subsets:
- addresses:
#這里可以填寫多個(gè)IP終結(jié)點(diǎn)IP,我們填寫的是node1/node2的IP及端口
- ip: 192.168.0.230
- ip: 192.168.0.137
ports:
- port: 8021
---
apiVersion: v1
kind: Service
metadata:
name: edp-test
namespace: my-system
spec:
ports:
- port: 8021
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: edp-test
namespace: my-system
spec:
rules:
- host: api.xxx.cn
http:
paths:
- path: /edp
backend:
serviceName: edp-test
servicePort: 8021

隨機(jī)到節(jié)點(diǎn)2

隨機(jī)到節(jié)點(diǎn)1
當(dāng)我們把節(jié)點(diǎn)2停止:docker stop nginx81
再次多次刷新界面,發(fā)現(xiàn)并不會再往節(jié)點(diǎn)2分配資源,說明k8s的service會自動幫我們找到有效的節(jié)點(diǎn)。
k8s的ingress+service+endpoint+pod的模式,是自帶注冊中心,負(fù)載均衡和高可用的,通過這種模式,您可以免去引入很多第三方組件,能夠快速實(shí)現(xiàn)微服務(wù)架構(gòu)。