k8s使用ingress暴露服务
docker中使用端口映射可以访问容器中的服务,k8s中的pod可以通过service的NodePort方式暴露服务,然而端口不能够定制,对于生产环境中还需要自己配置反向代理来搞定。
Ingress从官方的定义来看就是允许访问集群服务的规则的集合。可以通过配置提供服务外部可达的url,负载均衡,terminate SSL等等。用户对api server发起ingress资源的请求,ingress controller是负责来实现ingress规则的,通常是一个负载均衡器。
通过一个简单的操作看看怎么使用ingress
minikube环境
通过minkube可以很方便的在本地部署k8s环境,我的环境是:
- minikube: 0.26.0
- k8s: 1.10.0
部署服务
用tomcat做个测试,编写一个deploy_tomcat.yaml文件:
1 | apiVersion: apps/v1 |
创建deployment:
1 | $ kubectl create -f deploy_tomcat.yaml -o wide |
查看创建的pod:1
default tomcat-659f98bc89-4lzxh 1/1 Running 1 3h 172.17.0.3 minikube
看到tomcat已经运行,tomcat的镜像默认会开启8080
端口,测试一下:
1 | $ minikube ssh curl 172.17.0.3:8080 |
说明tomcat正常运行了,那给tomcat创建一个service,编写文件service_tomcat.yaml1
2
3
4
5
6
7
8
9
10
11
12kind: Service
apiVersion: v1
metadata:
name: my-tomcat
namespace: default
spec:
selector:
app: tomcat
ports:
- protocol: TCP
port: 8989
targetPort: 8080
创建service:1
2
3$ kubectl create -f service_tomcat.yaml
$ kubectl get svc -o wide
my-tomcat ClusterIP 10.108.155.32 <none> 8989/TCP 4h app=tomcat
创建ingress
上一步中创建了service,但是service中没有配置NodePort,所以无法直接通过service进行访问,也就是说k8s没有将服务暴露出来,在minikube环境中需要确认ingress功能已经开启:1
2
3
4$ minikube addons list
...
- ingress: enabled
...
如果没有开启可以手动enable:1
$ minikube addons enable ingress
开启以后,编写ingress_tomcat.yaml1
2
3
4
5
6
7
8
9
10
11
12kind: Ingress
metadata:
name: tomcat
namespace: default
spec:
rules:
- host: tomcat.k8s.ingress
http:
paths:
- backend:
serviceName: my-tomcat
servicePort: 8989
创建ingress:1
kubectl create -f ingress_tomcat.yaml
查看ingress:1
tomcat tomcat.k8s.ingress 192.168.99.100 80 4h
这里设置的host是tomcat.k8s.ingress
,其后端就是上一步中创建的服务my-tomcat
,端口也正是service的端口8989
,也就是说能正常解析我们配置的tomcat.k8s.ingress
后就能请求到tomcat服务了。
这里需要手动自己配置下,将tomcat.k8s.ingress
添加到hosts
,保证能够正确解析,然后打开浏览器输入tomcat.k8s.ingress
,就能看到tomcat的服务页面了。