内容预知
1.Ingress的相关知识
1.1 Ingress的简介
1.2 Ingress 的组成
1.3 Ingress-Nginx的工作原理
1.4 新生代Ingress-controller (Traefik)
Ingress-nginx和Ingress-Traefik的简单对比
1.5 Ingress的暴露方式
方式一:Deployment+LoadBalancer 模式的 Service
方式二:DaemonSet+HostNetwork+nodeSelector
方式三:Deployment+NodePort模式的Service
2. 部署DaemonSet+HostNetwork暴露Ingress
2.1 部署nginx-Ingress-controller
(1)下载官方nginx-Ingress的yaml配置方式
(2)如果采用nginx-0.25.0版本,需要了解的官方变动更新
2.2 DaemonSet+HostNetwork具体的部署过程
步骤一:下载安放ingress-controller pod及相关资源
步骤二: 为node02节点添加标签
步骤三:上传 nginx-ingress-controller 镜像压缩包并且进行加载
步骤四:启动 nginx-ingress-controller,并检查该pod的运行状况
编辑
步骤五:创建 ingress 规则
(1)创建一个业务pod和svc资源
进行访问测试
3.Deployment+NodePort模式的Service
3.1 部署Deployment+NodePort模式的Service
步骤一:下载相关的ingress和service-nodeport模板
步骤二:直接启动官方模板即可使用
3.2 进行Ingress Http代理访问的操作演示
3.3 Ingress HTTP 代理访问虚拟主机
(1)设置虚拟主机1资源
(2)创建虚拟主机2资源
(3) 创建ingress资源
客户机进行测试访问
3.4 Ingress HTTPS 代理访问
(1)创建ssl证书,进行secret资源存储
(2)创建 deployment、Service、Ingress Yaml 资源
3.5 ingress设置pod业务nginxBasicAuth认证
(1)生成用户密码认证文件,创建 secret 资源进行存储
(2)创建Ingress资源
(3)创建pod和service资源
3.6 Ingress中设置nginx重写
(1)重写到的资源创建
(2)重写ingress资源的编辑
进行客户机访问测试
总结
1.Ingress的相关知识
1.1 Ingress的简介
service的作用体现在两个方面,对集群内部,它不断跟踪pod的变化,更新endpoint中对应pod的对象,提供了ip不断变化的pod的服务发现机制;对集群外部,他类似负载均衡器,可以在集群内外部对pod进行访问。
在Kubernetes中,Pod的IP地址和service的ClusterIP仅可以在集群网络内部使用,对于集群外的应用是不可见的。为了使外部的应用能够访问集群内的服务,Kubernetes目前提供了以下几种方案:
●NodePort:将service暴露在节点网络上,NodePort背后就是Kube-Proxy,Kube-Proxy是沟通service网络、Pod网络和节点网络的桥梁。
测试环境使用还行,当有几十上百的服务在集群中运行时,NodePort的端口管理就是个灾难。因为每个端口只能是一种服务,默认端口范围只能是 30000-32767。
●LoadBalancer:通过设置LoadBalancer映射到云服务商提供的LoadBalancer地址。这种用法仅用于在公有云服务提供商的云平台上设置 Service 的场景。 受限于云平台,且通常在云平台部署LoadBalancer还需要额外的费用。
在service提交后,Kubernetes就会调用CloudProvider在公有云上为你创建一个负载均衡服务,并且把被代理的Pod的IP地址配置给负载均衡服务做后端。
●externalIPs:service允许为其分配外部IP,如果外部IP路由到集群中一个或多个Node上,Service会被暴露给这些externalIPs。通过外部IP进入到集群的流量,将会被路由到Service的Endpoint上。
●Ingress:只需一个或者少量的公网IP和LB,即可同时将多个HTTP服务暴露到外网,七层反向代理。
可以简单理解为service的service,它其实就是一组基于域名和URL路径,把用户的请求转发到一个或多个service的规则。
1.2 Ingress 的组成
●ingress:
ingress是一个API对象,通过yaml文件来配置,ingress对象的作用是定义请求如何转发到service的规则,可以理解为配置模板。
ingress通过http或https暴露集群内部service,给service提供外部URL、负载均衡、SSL/TLS能力以及基于域名的反向代理。ingress要依靠 ingress-controller 来具体实现以上功能。
●ingress-controller:
ingress-controller是具体实现反向代理及负载均衡的程序,对ingress定义的规则进行解析,根据配置的规则来实现请求转发。
ingress-controller并不是k8s自带的组件,实际上ingress-controller只是一个统称,用户可以选择不同的ingress-controller实现,目前,由k8s维护的ingress-controller只有google云的GCE与ingress-nginx两个,其他还有很多第三方维护的ingress-controller,具体可以参考官方文档。但是不管哪一种ingress-controller,实现的机制都大同小异,只是在具体配置上有差异。
一般来说,ingress-controller的形式都是一个pod,里面跑着daemon程序和反向代理程序。daemon负责不断监控集群的变化,根据 ingress对象生成配置并应用新配置到反向代理,比如ingress-nginx就是动态生成nginx配置,动态更新upstream,并在需要的时候reload程序应用新配置。为了方便,后面的例子都以k8s官方维护的ingress-nginx为例。
Ingress-Nginx github 地址:https://github.com/kubernetes/ingress-nginx
Ingress-Nginx 官方网站:https://kubernetes.github.io/ingress-nginx/
1.3 Ingress-Nginx的工作原理
(1)ingress-controller通过和 kubernetes APIServer 交互,动态的去感知集群中ingress规则 变化。
(2)然后读取它,按照自定义的规则,规则就是写明了哪个域名对应哪个service,生成一段 nginx配置。
(3)再写到nginx-ingress-controller的pod里,这个ingress-controller的pod里运行着一个 Nginx服务,控制器会把生成的 nginx配置写入 /etc/nginx.conf文件中。
(4)然后reload一下使配置生效。以此达到域名区分配置和动态更新的作用。
1.4 新生代Ingress-controller (Traefik)
Traefik是一个为了让部署微服务更加便捷而诞生的现代HTTP反向代理、负载均衡工具。 它支持多种后台 (Docker, Swarm, Kubernetes, Marathon, Mesos, Consul, Etcd, Zookeeper, BoltDB, Rest API, file…) 来自动化、动态的应用它的配置文件设置。
Ingress-nginx和Ingress-Traefik的简单对比
ingress-nginx
使用nginx作为前端负载均衡,通过ingress controller不断的和kubernetes api交互,实时获取后端service,pod等的变化,然后动态更新nginx配置,并刷新使配置生效,达到服务发现的目的。
Ingress-traefik:
traefik本身设计的就能够实时跟kubernetes api交互,感知后端service,pod等的变化,自动更新配置并重载。相对来说traefik更快速方便,同时支持更多的特性,使反向代理,负载均衡更直接更便捷。(GO语言编写的,原生支持K8S等云原生应用,兼容性更好,但并发能力是 ingress-nginx 的6成)
1.5 Ingress的暴露方式
方式一:Deployment+LoadBalancer 模式的 Service
如果要把ingress部署在公有云,那用这种方式比较合适。用Deployment部署ingress-controller,创建一个 type为 LoadBalancer 的 service 关联这组 pod。大部分公有云,都会为 LoadBalancer 的 service 自动创建一个负载均衡器,通常还绑定了公网地址。 只要把域名解析指向该地址,就实现了集群服务的对外暴露
eg:以阿里云为例
方式二:DaemonSet+HostNetwork+nodeSelector
用DaemonSet结合nodeselector来部署ingress-controller到特定的node上,然后使用HostNetwork直接把该pod与宿主机node的网络打通,直接使用宿主机的80/433端口就能访问服务。这时,ingress-controller所在的node机器就很类似传统架构的边缘节点,比如机房入口的nginx