我们知道我们的应用程序部署在容器中之后,外部需要访问它,那么怎么来实现呢,就是通过一个叫service的服务提供的IP地址+端口号,如果集群外部的服务器想要访问呢,那就是IP(node节点的IP)+nodeport,但是这样会有问题,就是当我们的service很多的时候,那么节点的端口号就会被大量的占用,可能会影响其他应用程序,那么这个时候就出现了ingress。类似提供一个反向代理的功能。
反向代理和正向代理的区别:
正向代理是将客户端的信息隐藏掉。不会让服务器获得客户端的一些信息。
反向代理是将服务器端的信息隐藏掉。
它就是为了解决上面的节点端口号不够的问题,它的实现原理是:通过ingress定义不同的service对应不同的域名,也就是域名和service进行关联,而service和pod之间的关联没有改变,外部访问的话,直接通过域名+service的端口号就可以访问。
支持https和http两种方式:
像下面这个图这样:
上图就是整个ingress工作流程。
在环境中如何使用呢?
需要通过yaml文件进行定义ingress到service的映射关系。
ingress-https.yml
apiVersion: extensions/vibeta1
kind: Ingress
metadata:
name: ingress-https
namespace: dev
spec:
tls:# http协议是没有这个参数的。
- hosts:
- nginx.itheima.com
- tomcat.itheima.com
secretName: tls-secret #指定密钥,这个密钥需要通过证书生成。
rules:
- hosts: nginx.itheima.com #指定域名
http:
paths:
- path: /
backend:
serviceName: nginx-service #域名对应的service
servicePort: 80 #服务对应的端口号
- hosts: tomcat.itheima.com #指定域名
http:
paths:
- path: /
backend:
serviceName: tomcat-service #域名对应的service
servicePort: 8080 #服务对应的端口号
有了上面的yaml文件之后,直接在后台命令行执行:
kubectl create -f ingress-https.yml
创建成功之后,可以通过:
kubectl get ingress -n dev
然后可以通过下面命令查看详细信息:
kubectl describe ingress ingress名称 -n dev
外部访问的话,是通过:
https://nginx.itheima.com:service端口号 https://tomcat.itheima.com:service端口号
即可访问。
注意:上面的service端口号是通过,kubectl get svc -n dev 查看的PORT(S)这一列中,比如:80:32240/TCP,443:31335/TCP,这里面的31335.