k8s的对外服务ingress

1、service的作用体现在两个方面

(1)集群内部:不断跟踪pod的变化,更新deployment中的pod对象,基于pod的ip地址不断变化的一种服务发现机制
(2)集群外部:类似于负载均衡器,把流量ip+端口,不涉及转发url(http/https),把请求转发到pod当中

2、service

nodeport

容器端口——service端口——nodeport

设定了nodeport,每个节点都会有一个端口被打开(30000-32767)

ip+端口:节点ip+30000-32767,实现负载均衡

loadbalancer

云平台上的一种service服务,云平台提供负载均衡ip地址

extrenal

域名映射

3、ingress:基于域名进行映射,把url(http/https)请求转发到service,再由service把请求转发到每个pod

①ingress:只要一个或者少量的公网ip/LB,可以把多个http请求暴露到外网,七层反向代理
②ingress:是service的service,是一组基于域名和url路径,把一个或者多个请求转发到service的规则
④先是七层代理(ingress)——再是四层代理(server)——pod(nginx)

4、ingress的组成

(1)ingress是一个api对象,通过yaml文件来进行配置

(2)ingress的作用:定义请求如何转发到service的规则,配置模版

(3)ingress通过http和https暴露集群内部的service,给service提供一个外部的url、负载均衡、ssl/tls(https)的能力,实现基于域名的负载均衡

ingress-controller

具体的实现反向代理和负载均衡的程序,对ingress定义的规则进行解析,根据ingress的配置规则进行请求的转发

ingress-controller不是k8s自带的组件功能,ingress-controller是一个统称

③ingress-controller:nginx ingress controller、traefik(开源)

ingress-controller的运行方式:pod形式运行在节点上

5、ingress资源的定义项

(1)定义外部流量的路由规则
(2)定义服务的暴露方式:主机名、访问的路径(url)和其他的选项
(3)负载均衡(ingress-controller实现)

6、下载nginx ingress controller

wget https://gitee.com/mirrors/ingress-nginx/raw/nginx-0.30.0/deploy/static/mandatory.yaml

k8s的对外服务ingress_第1张图片

7、ingress暴露服务的方式

(1)deployment+LoadBalance模式,ingress部署在公有云
①ingress的配置文件里面会有一个type,type键值对形式type:LoadBalance
②公有云平台会为LoadBalance的service创建一个负载均衡器,绑定一个公网地址,通过域名指向这个公网地址,就可以实现集群对外暴露
(2)daemonSet+hostnetwork+nodeselector(七层代理upstream)
①daemonset:在每个节点都会创建一个pod
②hostnetwork:pod共享节点主机的网络命名空间,pod中的容器直接使用节点主机的ip+端口,pod中的容器可以直接访问主机上的网络资源
③nodeselector:根据标签选择部署的节点,nginx-ingress-controller部署的节点

缺点:直接利用节点主机的网络和端口,一个node只能部署一个ingress-controller的pod,适合大并发的生产环境

优点:性能最好

k8s的对外服务ingress_第2张图片

(3)deployment+NodePort(七层+四层)

k8s的对外服务ingress_第3张图片

8、部署daemonSet+hostnetwork+nodeselector

(1)修改配置文件mandatory.yaml

k8s的对外服务ingress_第4张图片

k8s的对外服务ingress_第5张图片

(2)每个节点上传控制器的镜像
tar -xf ingree.contro-0.30.0.tar.gz
docker load -i ingree.contro-0.30.0.tar

(3)节点设置标签
kubectl label nodes node2 ingress=true

k8s的对外服务ingress_第6张图片

netstat -antp | grep nginx

k8s的对外服务ingress_第7张图片

8181端口:nginx-controller默认配置的一个bachend,反向代理的端口

所有的请求当中,只要是不符合ingress配置的请求会转发到8181,相当于一个error的页面

(4)创建PVC、pod、service、ingress规则

k8s的对外服务ingress_第8张图片

k8s的对外服务ingress_第9张图片

k8s的对外服务ingress_第10张图片

(5)配置映射

k8s的对外服务ingress_第11张图片

(6)测试访问

k8s的对外服务ingress_第12张图片

k8s的对外服务ingress_第13张图片

k8s的对外服务ingress_第14张图片

8、deployment+NodePort(七层+四层)

k8s的对外服务ingress_第15张图片

(1)修改配置文件vim mandatory.yaml

k8s的对外服务ingress_第16张图片

k8s的对外服务ingress_第17张图片

k8s的对外服务ingress_第18张图片

(2)下载nodeport模版文件:
wget https://gitee.com/mirrors/ingress-nginx/raw/nginx-0.30.0/deploy/static/provider/baremetal/service-nodeport.yaml

k8s的对外服务ingress_第19张图片

k8s的对外服务ingress_第20张图片

k8s的对外服务ingress_第21张图片

①nodeport在每一节点上都暴露32110和32336的端口

k8s的对外服务ingress_第22张图片

3创建PVC、pod、service、ingress规则

k8s的对外服务ingress_第23张图片

k8s的对外服务ingress_第24张图片

k8s的对外服务ingress_第25张图片

k8s的对外服务ingress_第26张图片

(4)配置映射

k8s的对外服务ingress_第27张图片

(5)访问测试

k8s的对外服务ingress_第28张图片

(6)deployment+NodePort总结
①nodeport由ingress的service创建的,不是deployment的service创建的
②nodeport适用于小集群
③ingress根据标签匹配ingress-nodeport,ingress-nodeport再根据标签匹配service,service再匹配deployment
④每个节点都有一个controller,controller接收到解析后的请求ip和端口
(7)ingress暴露服务的方式:核心的控制组件nginx-ingress-controller
①host——ingress的配置找到pod——controller转发请求到pod
②nodeport——controller——ingress——service转发请求到pod
③nodeport暴露端口的方式是最简单的方法,但是nodeport多了一层nat地址转换
并发量大的对性能会有一定的影响,内部都会用nodeport

9、通过虚拟主机的方式实现http代理

(1)通过ingress方式实现:一个ingress可以访问不同的主机
(2)创建pod和service

k8s的对外服务ingress_第29张图片

k8s的对外服务ingress_第30张图片

k8s的对外服务ingress_第31张图片

3创建ingress

k8s的对外服务ingress_第32张图片

k8s的对外服务ingress_第33张图片

k8s的对外服务ingress_第34张图片

k8s的对外服务ingress_第35张图片

4配置映射

k8s的对外服务ingress_第36张图片

k8s的对外服务ingress_第37张图片

k8s的对外服务ingress_第38张图片

10、总结:
(1)ingress的核心组件:nginx-ingress-controller、traefik,都是开源的ingress-controller
(2)ingress的三种工作方式(重点)

deployment+loadbalancer:

需要云平台提供一个负载均衡的公网地址,公有云上配置

daemonset+hostnetwork+nodeselector:指定节点部署controller

①缺点:和宿主机共享网络,只能是一个controller的pod,多个端口会造成冲突

②hostnetwork会和宿主机共享网络

deployment+nodeport:最常见、最常用、最简单的方式

①集中一个nodeport端口,所有的ingress的请求都会转发到nodeport,再由service把流量转发到pod

(3)一个ingress的nodeport可以实现访问多个虚拟主机(和nginx一样)

你可能感兴趣的:(kubernetes,容器,云原生)