Ingress
英文翻译 进入;进入权;进食
,更准确的讲就是入口,即外部流量进入k8s
集群必经之口。这道大门到底有什么做用?咱们如何使用Ingress
?k8s
又是如何进行服务发现的呢?先看一张图:html
虽然k8s
集群内部署的pod
、server
都有本身的IP
,可是却没法提供外网访问,之前咱们能够经过监听NodePort
的方式暴露服务,可是这种方式并不灵活,生产环境也不建议使用。Ingresss
是k8s
集群中的一个API
资源对象,扮演边缘路由器(edge router)的角色,也能够理解为集群防火墙、集群网关,咱们能够自定义路由规则来转发、管理、暴露服务(一组pod),很是灵活,生产环境建议使用这种方式。另外LoadBlancer
也能够暴露服务,不过这种方式须要向云平台申请负债均衡器;虽然目前不少云平台都支持,可是这种方式深度耦合了云平台,因此你懂的。前端
首先咱们来思考用传统的web
服务器,好比Nginx
,如何处理这种场景?Nginx
充当一个反向代理服务器拦截外部请求,读取路由规则配置,转发相应的请求到后端服务。nginx
kubernetes
处理这种场景时,涉及到三个组件:git
web
服务器Nginx
、Apache
、traefik
等等。我通常以Deployment
方式部署到kubernetes
集群中,固然也能够用DeamonSet
方式部署;这两种部署方式我的以为有利有弊,感兴趣的请参考这篇文章,这里就不敖述了。k8s
中的controller
有不少,好比CronJob
、DeamonSet
、Deployment
、ReplicationSet
、StatefulSet
等等,你们最熟悉的应该是Deployment
(嘿嘿,我也是),它的做用就是监控集群的变化,使集群始终保持咱们指望的最终状态(yml文件)。同理,Ingress controller
的做用就是实时感知Ingress
路由规则集合的变化,再与Api Server
交互,获取Service
、Pod
在集群中的 IP
等信息,而后发送给反向代理web
服务器,刷新其路由配置信息,这就是它的服务发现机制。通过上面的剖析,知道了吧,若是咱们仅仅建立Ingress
对象,只是定义了一系列路由规则集合而已,没有任何做用,不要想得太简单了,嘿嘿。github
这个我花费了很多时间,最终选用的是Traefik
,它是一个用Golang开发的轻量级的Http反向代理和负载均衡器,虽然相比于Nginx
,它是后起之秀,可是它自然拥抱kubernetes
,直接与集群k8s的Api Server
通讯,反应很是迅速,实时感知集群中Ingress
定义的路由规则集合和后端Service
、Pod
的变化,自动热更新Traefik
后端配置,根本不用建立Ingress controller
对象,同时还提供了友好的控制面板和监控界面,不只能够方便地查看Traefik
根据Ingress
生成的路由配置信息,还能够查看统计的一些性能指标数据,如:总响应时间、平均响应时间、不一样的响应码返回的总次数等,Traefik
部署请参考官网用户示例Kubernetes Ingress Controller。不只如此,Traefik
还支持丰富的annotations
配置,可配置众多出色的特性,例如:自动熔断、负载均衡策略、黑名单、白名单;还支持许多后端存储,如:zookeeper、eureka、consul、rancher、docker等,它会自动感知这些统一配置中心的变化,热更新本身的路由配置,因此Traefik
对于微服务来讲简直就是一神器啊,嘿嘿。那么Traefik
性能又如何呢?容器化部署,还担忧性能,不要这么搞笑,好吗。而Nginx
在拥抱kubernetes
这方面比较后知后觉,详情请参考官方网站和开源项目ingress-nginx ;另外微软开源的微服务示例项目 eShopOnContainers 采用了ingress-nginx
,你们能够下去自行研究。web
Traefik :算法
Ingress
暴露微服务apiVersion: extensions/v1beta1 kind: Ingress metadata: labels: app: light component: frontend name: light-edge-router namespace: geekbuying-light annotations: kubernetes.io/ingress.class: "traefik" ingress.kubernetes.io/ssl-redirect: "false" traefik.frontend.rule.type: "PathPrefixStrip" traefik.ingress.kubernetes.io/frontend-entry-points: "http,https" traefik.ingress.kubernetes.io/priority: "3" spec: rules: - host: <hostdomain literal> http: paths: - path: /api/v1/light backend: serviceName: aggregation-light-api servicePort: 80 - path: /api/v1/identity backend: serviceName: identity-api servicePort: 80
很是重要:docker
/api/vi/identity
,必须添加这个traefik.ingress.kubernetes.io/rule-type: PathPrefixStrip
注解传递路径,不然会看不到任何效果;ingress.kubernetes.io/ssl-redirect: "false"
是否强制使用https
,其余的配置信息,请查看详情。另外,不一样的Ingress
选型,请参照各自的组件说明。geekbuying-light-addons
命名空间下的exceptionless-ui
服务,并匹配端口。traefik支持强大的annotations
配置,须要添加到kubernetes
相应资源对象的annotations
下面。至于具体配置到的哪一个对象,先弄清楚三个概念:后端
EntryPoint(入口点)
顾名思义,这是外部网络进入traefik
的入口,咱们上面就是经过监听主机端口拦截请求。api
FrontEnd(前端)traefik
拦截请求后,会转发给FrontEnd
。前端定义EntryPoint
映射到BackEnd
的路由规则集,字段包括Host
, Path
, Headers
等,匹配请求后,默认经过加权轮询负载算法路由到一个可用的BackEnd
,而后进入指定的微服务,这就是服务发现。
备注:这些路由规则能够来自不一样的后端存储,如
Kubernetes、zookeeper、eureka、consul
等,Kubernetes
使用的Ingress
资源对象定义路由规则集。建议你们自行去官网学习Kubernetes Ingress Backend。
BackEnd(后端)
一组http
服务集,kubernetes
中对应一个service
对象下的一组pod
地址。对于后端的服务发现,可配置负载均衡策略、熔断器等特性。
一个后端service
对象的配置例子:
apiVersion: v1 kind: Service metadata: annotations: traefik.backend.circuitbreaker: NetworkErrorRatio() > 0.5 traefik.backend.loadbalancer.method: drr labels: app: light component: identity name: identity-api namespace: geekbuying-light spec: ports: - port: 80 selector: app: light component: identity type: webapi
控制面板:
前端优先级、后端熔断器和负载均衡策略:
监控界面:
综上所述,首先部署拥抱k8s的反向代理服务器(treafik、nginx
等)拦截请求,而后拦截的请求会根据Ingress
定义的路由规则集,转发到集群内部对应的Service
。
原文:https://www.cnblogs.com/justmine/p/8991379.html