本文介绍了ingress 实践。
官方文档:地址
- 创建service
创建3个service,实际应用中可能不止这三个。
创建ingress
1 |
|
创建后端服务1,并暴露出端口
1 | kubectl run echoheaders --image=gcr.io/google_containers/echoserver:1.4 --replicas=1 --port=8080 -n ingress-nginx |
创建后端服务2:tomcat service
1 | kubectl run tomcat --image=tomcat:docs --replicas=1 --port=8080 -n ingress-nginx |
创建后端服务3:nginx service
1 | kubectl run nginx --image=nginx --replicas=1 --port=80 -n ingress-nginx |
创建ingress rule
ingress rule 可以有多个,创建后,不需要重启nginx-controller。- controller怎么识别到ingress rule?
controller的启动参数默认指定class 为ingress。同时如果没有class的ingress rule,也会由controler负责使其生效。通过这种方式,可以实现多个controller对应实现不同的insgress rule。
我们依次创建2个rule:
RULE-1:
1
2
3
4
5
6
7
8
9
10
11
12
13
14apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: tomcat-root-ingress
annotations:
ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- http:
paths:
- path: /
backend:
serviceName: tomcat-x
servicePort: 80域名:http://192.168.37.112/
根路径访问,转发到 tomcat-x 服务的ROOT应用。
针对 / , nginx-controller自动配置了https转发:1
2
3
4
5if ($redirect_to_https) {
return 308 https://$best_http_host$request_uri;
}- controller怎么识别到ingress rule?
RULE-2:
1 | apiVersion: extensions/v1beta1 |
域名:tomcat.bar.com
路径: /docs
转发到tomcat-x的docs应用里。
创建 nginx-controller
1
2
3wget https://github.com/kubernetes/ingress-nginx/blob/nginx-0.20.0/deploy/with-rbac.yaml
kubectl apply -f with-rbac.yaml注:执行前,手工修改with-rbac.yaml,
添加hostNetwork: true。
为了本次测试,nginx-controller在一台node节点上启动,并对外提供服务。生产上一般准备3个node对外服务,或者前面放一个svc绑定slb。设置默认的default service,专门处理ingress rule没有匹配的情况。
1
- --default-backend-service=$(POD_NAMESPACE)/echoheaders-x
效果
本地电脑绑定tomcat.bar.com解析到vm ip 192.168.37.112。访问 http://tomcat.bar.com/docs — ok 仍旧是http
访问 http://tomcat.bar.com/fakeserver — 返回 default backend - 404
访问 http://192.168.37.112/ —redirect_to_http–> https://192.168.37.112/
- 证书是nginx-controller中配置的 default-fake-certificate.pem
访问 https://192.168.37.112/asdasd – Tomcat返回404