Ingress-http配置
Ingress简介
ingress就是从外部访问k8s集群的入口,将用户的URL请求转发到不同的service上。ingress相当于nginx反向代理服务器,它包括的规则定义就是URL的路由信息;它的实现需要部署Ingress controller
(比如 traefik ingress-nginx 等),Ingress controller
通过apiserver监听ingress和service的变化,并根据规则配置负载均衡并提供访问入口,达到服务发现的作用。
-
未配置ingress:
集群外部 -> NodePort -> K8S Service
-
配置ingress:
集群外部 -> Ingress -> K8S Service
-
注意:ingress 本身也需要部署
Ingress controller
时使用以下几种方式让外部访问- 使用
NodePort
方式 - 使用
hostPort
方式 - 使用LoadBalancer地址方式
- 使用
-
以下讲解基于
Traefik
,如果想要了解ingress-nginx
的原理与实践,推荐阅读博客烂泥行天下的相关文章
部署 Traefik
Traefik 提供了一个简单好用 Ingress controller
,下文侧重讲解 ingress部署和测试例子。
安装 traefik ingress-controller
1 | kubectl create -f /etc/ansible/manifests/ingress/traefik/traefik-ingress.yaml |
-
注意需要配置
RBAC
授权 -
注意
trafik pod
中80
端口为 traefik ingress-controller的服务端口,8080
端口为 traefik 的管理WEB界面;为后续配置方便指定80
端口暴露NodePort
端口为23456
(对应于在hosts配置中NODE_PORT_RANGE
范围内可用端口)
验证 traefik ingress-controller
1 | # kubectl get deploy -n kube-system traefik-ingress-controller |
-
可以看到
traefik-ingress-service
服务端口80
暴露的nodePort确实为23456
测试 ingress
-
首先创建测试用K8S应用,并且该应用服务不用nodePort暴露,而是用ingress方式让外部访问
1 | kubectl run test-hello --image=nginx:alpine --expose --port=80 |
-
然后为这个应用创建 ingress,
kubectl create -f /etc/ansible/manifests/ingress/test-hello.ing.yaml
1 | # test-hello.ing.yaml内容 |
-
集群内部尝试访问:
curl -H Host:hello.97hjh.cn 10.68.69.170(traefik-ingress-service的服务地址)
能够看到欢迎页面Welcome to nginx!
; -
在集群外部尝试访问(假定集群一个NodeIP为 10.0.0.10):
curl -H Host:hello.97hjh.cn 10.0.0.10:23456
,也能够看到欢迎页面Welcome to nginx!
,说明ingress测试成功
为 traefik WEB 管理页面创建 ingress 规则
kubectl create -f /etc/ansible/manifests/ingress/traefik/traefik-ui.ing.yaml
1 | # traefik-ui.ing.yaml内容 |
-
在集群外部可以使用
curl -H Host:traefik-ui.97hjh.cn 10.0.0.10:23456
尝试访问WEB管理页面,返回<a href="/dashboard/">Found</a>.
说明 traefik-ui的ingress配置生效了。 -
在客户端主机也可以通过修改本机
hosts
文件,如上例子,增加两条记录:
1 | 10.0.0.10 hello.97hjh.cn |
打开浏览器输入域名 http://hello.97hjh.cn:23456
和 http://traefik-ui.97hjh.cn:23456
就可以访问k8s的应用服务了。如图所示:
hello.97hjh.cn
traefik-ui.97hjh.cn
可选1: 使用LoadBalancer
服务类型来暴露ingress,自有环境(非公有云)可以参考metallb文档
1 | # 修改traefik-ingress 使用 LoadBalancer服务 |
这时可以修改客户端本机 hosts
文件:(如上例10.0.0.12)
1 | 10.0.0.12 hello.97hjh.cn |
打开浏览器输入域名 http://hello.97hjh.cn
和 http://traefik-ui.97hjh.cn
可以正常访问。
可选2: 部署ingress-service
的负载均衡
-
利用 nginx/haproxy 等集群,可以做代理转发以去掉
23456
这个端口。如果你的集群根据本项目部署了高可用方案,那么可以利用LB
节点haproxy 来做,当然如果生产环境K8S应用已经部署非常多,建议还是使用独立的nginx/haproxy
集群。
具体参考配置转发 ingress nodePort,如上配置访问集群MASTER_IP
的80
端口时,由haproxy代理转发到实际的node节点暴露的nodePort端口上了。这时可以修改客户端本机 hosts
文件如下:(假定 MASTER_IP=10.0.0.11)
1 | 10.0.0.11 hello.97hjh.cn |
打开浏览器输入域名 http://hello.97hjh.cn
和 http://traefik-ui.97hjh.cn
可以正常访问。