外部访问kubernetes内部的pod通常有 LoadBlancer Service、NodePort Service、Ingress三种方式。
LoadBlancer Service 需要结合云平台来使用。
NodePort Service 是将pod的端口映射成cluster节点的端口(30000~32767)使用比较简单,但是对于应用较多的集群,不易管理。
Ingress 通过反向代理的方式来对外暴露服务。
一、什么是ingress
ingress的访问规则如下:
internet
|
[ Ingress ]
--|-----|--
[ Services ]
ingress可以帮助service提供外部可以访问的url、并可以提供基于虚拟主机的反向代理。
但是ingress本身只能实现反向代理规则的配置,需要结合ingress controller才能完整的实现外部网络访问的。
二、什么是ingress controller
ingress controller是一个daemon,以pod的形式部署,通过apiserver监控ingress endpoint的更新,以实现ingress规则。
通常ingress controller上层会有一个NodePort类型的service作为统一入口。
三、ingress controller选型
官方推荐的ingress controller
- Ambassador
- Voyager
- Contour
- Citrix
- F5
- Gloo
- HAproxy
- Traffic
- Kong
- nginx
由于个人对nginx比较熟悉,所以选择了nginx-ingress-controller。
四、安装ingress-controller
通过执行一下命令来创建ingress controller
https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/mandatory.yaml
如果主机不能连接外网,则需要nginx-ingress-controller:0.24.1的镜像。
可以在集群中看到刚刚安装的controller
> kubectl get po
nginx-ingress-controller-5694ccb578-g5xz5 1/1 Running 0 23d
> kubectl get svc
service/ingress-nginx NodePort 10.108.146.145 <none> 80:30012/TCP,443:30013/TCP 23d
五、配置ingress规则
ingress的yml定义文件如下:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: ingress-myapp
namespace: dev
annotations:
kubernetes.io/ingress.class: "nginx"
spec:
rules:
- host: test.ingress.com
http:
paths:
- path: /
backend:
serviceName: crm-portal
servicePort: 8091
解析:
- rules中,host指定一个虚拟主机,访问时在hosts文件中配置一个虚拟主机域名与cluster中任意主机
- path指定路径进行转发,可以有多个路径,转发至不同的service。
- serviceName和servicePort指定要转发的pod对应的svc。
参考:
https://kubernetes.io/docs/concepts/services-networking/ingress-controllers/
https://kubernetes.io/docs/concepts/services-networking/ingress/
https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/annotations/