user.default.svc.cluster.local是集群内部service的dns地址,集群外部想访问集群里面的service,可以通过LoadBalaner和NodePort。
LoadBalaner可以获得一个公网ip;NodePort在宿主机上开一个端口,访问这个端口会把报文实际的转发到集群内的service里。
但不是所有的k8s集群都可以获得公网ip,这个要看供应商是否支持,比如microk8s就拿不到公网ip,如果使用的阿里云或AWS, 公网ip资源是需要付费的。
![](https://i-blog.csdnimg.cn/blog_migrate/6caa13a422ecc4153e88253eae2baf88.png)
如果通过LoadBalaner的方式,对外提供user和order服务,需要2个LoadBalaner,对应2个外网IP,
在DNS做域名解析的时候,一个域名只能对应一个ip,但这里有2个公网ip,所以这种情况怎么解决呢?
![](https://i-blog.csdnimg.cn/blog_migrate/99efabfeacbd682a4a8777c0f0aac078.png)
ingress本身也是k8s的一个service,根据subpath路由到user或order service,
![](https://i-blog.csdnimg.cn/blog_migrate/1ce0938fdc1019b90dafe1f01f31080d.png)
启动order和user pod,
![](https://i-blog.csdnimg.cn/blog_migrate/3901e4ce769d97cb83ec1472afc6cbd1.png)
对应着2个service,通过selector找到对应的pod,
![](https://i-blog.csdnimg.cn/blog_migrate/56f45b6ea0558a27958f68fc7da5d567.png)
在u1 pod中访问user service,user是service名称,default是默认的命名空间。
![](https://i-blog.csdnimg.cn/blog_migrate/846c618fafe298f74812e25b626679b9.png)
![](https://i-blog.csdnimg.cn/blog_migrate/a8112c70892fb873b5ec1bfc938769e6.png)
创建一个ingress-nginx,这个service没有外网ip,因为是在本机启动的,如果在云服务商的k8s集群上会有一个公网ip。
好在有一个port可以访问这个ingress,让ingress service和user service和order service建立一个关联。
可以按照path进行服务的转发,
![](https://i-blog.csdnimg.cn/blog_migrate/123c6bfbbfd662c645b353f6d9659768.png)
host是www.l6p.io这个是外部http请求在header中的host内容,其实就是网站的域名,
![](https://i-blog.csdnimg.cn/blog_migrate/76fd8d51b10211e72decdb1befce676c.png)
这个是nginx ingress的一个注释,接受到外部的请求比如是api/user/v1,但是转发给user service或order service,按照根目录进行转发,去掉请求中的子目录,
![](https://i-blog.csdnimg.cn/blog_migrate/6ba9186debd9801e48ab8fe0fa9846cd.png)
比如在pod中curl http://user.default,这里其实访问的是根目录,路径中并没有api/user/v1,这个注解就是要求nginx在进行转发的时候把路径后面的去掉。
![](https://i-blog.csdnimg.cn/blog_migrate/afd419fb4b17f969ef8438275ff12e83.png)
在使用之前,先把假定的域名指向ingress service,没有外网ip,但有一个宿主机上的port,在hosts文件中配置
![](https://i-blog.csdnimg.cn/blog_migrate/780d320ac15e00148630aaf6a575419a.png)
查看LoadBalancer端口是32680,
![](https://i-blog.csdnimg.cn/blog_migrate/bc9b2b208cd7873f67bc8aad67ae04e7.png)
通过浏览器进行访问,
![](https://i-blog.csdnimg.cn/blog_migrate/a6eaacd7727b22cd68271830faf09c00.png)
其实ingress nginx pod中启动了一个nginx服务,
![](https://i-blog.csdnimg.cn/blog_migrate/8a9b0751669f5e581c2ac459fe2de8e6.png)
![](https://i-blog.csdnimg.cn/blog_migrate/8a387e247bd95b38eadb44c6cb9f205e.png)
![](https://i-blog.csdnimg.cn/blog_migrate/d5624b212a6b6e2b660de77fdf97c834.png)
通过yaml文件创建ingress资源的时候其实就是在ingress的pod里面的nginx里面配置了路由关系,动态的加入了 order和user这样的配置,再通过nginx反向代理的方式进行请求的转发。