详解k8s组件Ingress边缘路由器并落地到微服务 - kubernetes
写在前面
Ingress
英文翻译 进入;进入权;进食
,更准确的讲就是入口,即外部流量进入k8s
集群必经之口。这道大门到底有什么作用?我们如何使用Ingress
?k8s
又是如何进行服务发现的呢?先看一张图:
备注:此图来源我转载的一篇博客NodePort,LoadBalancer还是Ingress?我该如何选择 - kubernetes,特此说明。
原理
虽然k8s
集群内部署的pod
、server
都有自己的IP
,但是却无法提供外网访问,以前我们可以通过监听NodePort
的方式暴露服务,但是这种方式并不灵活,生产环境也不建议使用。Ingresss
是k8s
集群中的一个API
资源对象,扮演边缘路由器(edge router)的角色,也可以理解为集群防火墙、集群网关,我们可以自定义路由规则来转发、管理、暴露服务(一组pod),非常灵活,生产环境建议使用这种方式。另外LoadBlancer
也可以暴露服务,不过这种方式需要向云平台申请负债均衡器;虽然目前很多云平台都支持,但是这种方式深度耦合了云平台,所以你懂的。
首先我们来思考用传统的web
服务器,比如Nginx
,如何处理这种场景?
Nginx
充当一个反向代理服务器拦截外部请求,读取路由规则配置,转发相应的请求到后端服务。
kubernetes
处理这种场景时,涉及到三个组件:
- 反向代理
web
服务器
负责拦截外部请求,比如Nginx
、Apache
、traefik
等等。我一般以Deployment
方式部署到kubernetes
集群中,当然也可以用DeamonSet
方式部署;这两种部署方式个人觉得有利有弊,感兴趣的请参考这篇文章,这里就不敖述了。 - Ingress controller
k8s
中的controller
有很多,比如CronJob
、DeamonSet
、Deployment
、ReplicationSet
、StatefulSet
等等,大家最熟悉的应该是Deployment
(嘿嘿,我也是),它的作用就是监控集群的变化,使集群始终保持我们期望的最终状态(yml文件)。同理,Ingress controller
的作用就是实时感知Ingress
路由规则集合的变化,再与Api Server
交互,获取Service
、Pod
在集群中的IP
等信息,然后发送给反向代理web
服务器,刷新其路由配置信息,这就是它的服务发现机制。 - Ingress
定义路由规则集合,上面已经详细介绍,这里就不再敖述了。
经过上面的剖析,知道了吧,如果我们仅仅创建Ingress
对象,只是定义了一系列路由规则集合而已,没有任何作用,不要想得太简单了,嘿嘿。
Ingress 选型
这个我花费了不少时间,最终选用的是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
,大家可以下去自行研究。
**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
非常重要:
- 当我们定义额外的路由时,比如这里的
/api/vi/identity
,必须添加这个traefik.ingress.kubernetes.io/rule-type: PathPrefixStrip
注解传递路径,否则会看不到任何效果;ingress.kubernetes.io/ssl-redirect: "false"
是否强制使用https
,其他的配置信息,请查看详情。另外,不同的Ingress
选型,请参照各自的组件说明。 - 其他命名空间下的服务发现规则为:[serviceName].[namespace]:[port],如:exceptionless-ui.geekbuying-light-addons:80(备注:端口80可以省略,其他端口不能省略),表示查找
geekbuying-light-addons
命名空间下的exceptionless-ui
服务,并匹配端口。
特性配置
traefik支持强大的annotations
配置,需要添加到kubernetes
相应资源对象的annotations
下面。至于具体配置到的哪个对象,先弄清楚三个概念:
EntryPoint(入口点)
顾名思义,这是外部网络进入traefik
的入口,我们上面就是通过监听主机端口拦截请求。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://docs.traefik.io/
https://github.com/containous/traefik
https://docs.traefik.io/user-guide/kubernetes/
https://docs.traefik.io/configuration/backends/kubernetes/
https://kubernetes.io/docs/concepts/services-networking/ingress/
https://kubernetes.io/docs/admin/authorization/rbac/
https://github.com/kubernetes/ingress-nginx/blob/master/README.md
https://kubernetes.github.io/ingress-nginx/development/
https://www.kubernetes.org.cn/1237.html
https://github.com/kubernetes/ingress-nginx
https://blog.csdn.net/hxpjava1/article/details/79459489
https://blog.csdn.net/hxpjava1/article/details/79375452
如果你觉得本篇文章对您有帮助的话,感谢您的【推荐】。
如果你对 kubernets 感兴趣的话可以关注我,我会定期的在博客分享我的学习心得。
详解k8s组件Ingress边缘路由器并落地到微服务 - kubernetes的更多相关文章
- (转)详解k8s组件Ingress边缘路由器并落地到微服务 - kubernetes
转:https://www.cnblogs.com/justmine/p/8991379.html 写在前面 Ingress 英文翻译 进入;进入权;进食,更准确的讲就是入口,即外部流量进入k8s集群 ...
- 详解k8s原生的集群监控方案(Heapster+InfluxDB+Grafana) - kubernetes
1.浅析监控方案 heapster是一个监控计算.存储.网络等集群资源的工具,以k8s内置的cAdvisor作为数据源收集集群信息,并汇总出有价值的性能数据(Metrics):cpu.内存.netwo ...
- Unity Jobsystem 详解实体组件系统ECS
原文摘选自Unity Jobsystem 详解实体组件系统ECS 简介 随着ECS的加入,Unity基本上改变了软件开发方面的大部分方法.ECS的加入预示着OOP方法的结束.随着实体组件系统ECS的到 ...
- [转]详解C#组件开发的来龙去脉
C#组件开发首先要了解组件的功能,以及组件为什么会存在.在Visual Studio .NET环境下,将会有新形式的C#组件开发. 组件的功能 微软即将发布的 Visual Studio .NET 将 ...
- Angular6 学习笔记——组件详解之组件通讯
angular6.x系列的学习笔记记录,仍在不断完善中,学习地址: https://www.angular.cn/guide/template-syntax http://www.ngfans.net ...
- 详解k8s一个完整的监控方案(Heapster+Grafana+InfluxDB) - kubernetes
1.浅析整个监控流程 heapster以k8s内置的cAdvisor作为数据源收集集群信息,并汇总出有价值的性能数据(Metrics):cpu.内存.网络流量等,然后将这些数据输出到外部存储,如Inf ...
- 详解k8s零停机滚动发布微服务 - kubernetes
1.前言 在当下微服务架构盛行的时代,用户希望应用程序时时刻刻都是可用,为了满足不断变化的新业务,需要不断升级更新应用程序,有时可能需要频繁的发布版本.实现"零停机"." ...
- 从零开始入门 K8s| 阿里技术专家详解 K8s 核心概念
作者| 阿里巴巴资深技术专家.CNCF 9个 TCO 之一 李响 一.什么是 Kubernetes Kubernetes,从官方网站上可以看到,它是一个工业级的容器编排平台.Kubernetes 这个 ...
- traefik-Ingress边缘路由器落地到微服务
1.理解Ingress 简单的说,ingress就是从kubernetes集群外访问集群的入口,将用户的URL请求转发到不同的service上.Ingress相当于nginx.apache等负载均衡方 ...
随机推荐
- Unity UGUI基础之Button
UGUI Button,可以说是真正的使用最广泛.功能最全面.几乎涵盖任何模块无所不用无所不能的组件,掌握了它的灵巧使用,你就几乎掌握了大半个UGUI! 一.Button组件: Interactabl ...
- CUDA学习,第一个kernel函数及代码讲解
前一篇CUDA学习,我们已经完成了编程环境的配置,现在我们继续深入去了解CUDA编程.本博文分为三个部分,第一部分给出一个代码示例,第二部分对代码进行讲解,第三部分根据这个例子介绍如何部署和发起一个k ...
- Android原生嵌入React Native
1.首先集成的项目目录 我使用的是直接按照react-native init Project 的格式来导入的,也就是说,我的Android项目目录是跟node_modules是在一个目录下的. 我们i ...
- tar 压缩和解压缩使用笔记
tar 压缩和解压缩使用笔记 1 文件 1.1 打包 1.1 压缩 $ tar czf myfile.txt.tar.gz ./myfile.txt 1.2 解压缩 解压缩到目录: $ mkdir o ...
- ROS_Kinetic_01 在ubuntu 16.04安装ROS Kinetic 2017.01更新
ROS_Kinetic系列学习(一),在ubuntu 16.04安装ROS Kinetic. Celebrating 9 Years of ROS! ubuntu16.04已经发布半年多了,ROS的K ...
- 利用编辑距离(Edit Distance)计算两个字符串的相似度
利用编辑距离(Edit Distance)计算两个字符串的相似度 编辑距离(Edit Distance),又称Levenshtein距离,是指两个字串之间,由一个转成另一个所需的最少编辑操作次数.许可 ...
- java中,用json格式转换遇到问题
将list转为JSONObject类,报 org/apache/commons/lang/exception/NestableRuntimeException是什么原因? 还需要导入这些包common ...
- 【单片机】基于有方GPRS的智能电梯控制系统
前一篇文章<时钟及温度的显示>中所介绍的作品,是作为一个单片机新手在暑假学了一个月的单片机之后,做的第一个综合性作品,涵盖了二极管.蜂鸣器.数码管.液晶屏.按键.时钟芯片.温度传感器的控制 ...
- LeetCode之“树”:Path Sum && Path Sum II
Path Sum 题目链接 题目要求: Given a binary tree and a sum, determine if the tree has a root-to-leaf path suc ...
- 【Android 应用开发】Android中的回调Callback
回调就是外部设置一个方法给一个对象, 这个对象可以执行外部设置的方法, 通常这个方法是定义在接口中的抽象方法, 外部设置的时候直接设置这个接口对象即可. 例如给安卓添加按钮点击事件, 我们创建了OnC ...