ingress是k8s内置的7层反向代理的抽象,其自带了负载与代理寻址功能,通过对ingress controller的实现,可以方便的将内部资源以域名及路径的形式暴露出去,结合service可以轻松实现负载均衡及高可用。
k8s部署pod,会自动生成endpoint信息(容器的IP及端口清单),service指向endpoint。
对于外部资源(未使用k8s部署的,如外部的数据库或应用),也可以使用ingress+service+endpoint的模式实现高可用及负载均衡,我们用nginx模拟下这个场景:
分别在节点1,节点2用docker启用nginx:
映射到主机端口为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
然后我们创建一个1.html文件
html正文,两个节点分别写各自节点名称,以区分。
node1:
<html><body>node1 8021 1.html</body></html>
node2:
<html><body>node2 8021 1.html</body></html>
然后我们预览两个地址:
通过ingress映射外部
---
kind: Endpoints
apiVersion: v1
metadata:
name: edp-test
namespace: my-system
subsets:
- addresses:
#这里可以填写多个IP终结点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
当我们把节点2停止:docker stop nginx81
再次多次刷新界面,发现并不会再往节点2分配资源,说明k8s的service会自动帮我们找到有效的节点。
k8s的ingress+service+endpoint+pod的模式,是自带注册中心,负载均衡和高可用的,通过这种模式,您可以免去引入很多第三方组件,能够快速实现微服务架构。