[内容版权归有容云所有.仅供学习使用]
微信链接:http://mp.weixin.qq.com/s/vhs96KC4l3p8jHOXkrQrxg
本文来自9月26有容云Docker微信群分享整理
分享嘉宾:有容云系统工程师-陈俊
Kubernetes在设计之初就充分考虑了针对容器的服务发现与负载均衡机制,提供了Service资源,并通过kube-proxy配合cloud provider来适应不同的应用场景。随着kubernetes用户的激增,用户场景的不断丰富,产生了一些新的负载均衡机制。
一、Kubernetes平台Service的特点
Service是对一组提供相同功能的Pods的抽象,并为它们提供一个统一的入口。借助Service,应用可以方便的实现服务发现与负载均衡,并实现应用的零宕机升级。Service通过标签来选取服务后端,一般配合Replication Controller或者Deployment来保证后端容器的正常运行。
目前 kubernetes共有三种服务暴露的方式:
· LoadBlancer Service
· NodePort Service
· Ingress
LoadBlancer Service是kubernetes深度结合云平台的一个组件;当使LoadBlancer Service暴露服务时,实际上是通过向底层云平台申请创建一个负载均衡器来向外暴露服务;目前LoadBlancer Service支持的云平台已经相对完善,比如国外的GCE、DigitalOcean,国内的 阿里云,私有云OpenStack等等,由于LoadBlancer Service深度结合了云平台,所以只能在一些云平台上来使用。
NodePort Service,实质上就是通过在集群的每个node上暴露一个端口,然后将这个端口映射到某个具体的service来实现的,虽然每个node的端口有很多(默认的取值范围是30000-32767),但是由于安全性和易用性(服务多了就乱了,还有端口冲突问题)实际使用可能并不多。
Ingress可以实现使用nginx等开源的反向代理负载均衡器实现对外暴露服务,可以理解Ingress就是用于配置域名转发,在nginx中就类似upstream,它与ingress-controller结合使用,通过ingress-controller监控到pod及service的变化,动态地将ingress中的转发信息写到诸如nginx、apache、haproxy等组件中实现方向代理和负载均衡。
二、Kubernetes平台Ingress介绍
Ingress 是一个规则的集合,它允许集群外的流量通过一定的规则到达集群内的Service。如下图:
Ingress三个组件:
反向代理负载均衡器
Ingress Controller
Ingress
反向代理负载均衡器,即常见的负载均衡软件,如 nginx、Haproxy 等。
Ingress Controller 与kubernetes API进行交互,实时的感知后端service、pod等变化,Ingress Controller再结合下文的Ingress生成配置,然后更新反向代理负载均衡器,并刷新其配置,实现动态服务发现与更新。
Ingress是规则集合;定义了域名与Kubernetes的service的对应关系;这个规则将与Ingress Controller 结合,Ingress Controller将其动态写入到负载均衡器配置中,从而实现整体的服务发现和负载均衡。
Traefik
Træfɪk 是一个为了让部署微服务更加便捷而诞生的现代HTTP反向代理、负载均衡工具。它支持多种后台来自动化、动态的应用它的配置文件设置。
特性
它非常快
无需安装其他依赖,通过Go语言编写的单一可执行文件
支持 Rest API
多种后台支持:Docker, Swarm, Kubernetes, Marathon, Mesos, Consul, Etcd
后台监控, 可以监听后台变化进而自动化应用新的配置文件设置
配置文件热更新。无需重启进程
正常结束http连接
后端断路器
轮询,rebalancer负载均衡
Rest Metrics
支持最小化 官方 docker镜像
后台支持SSL
前台支持SSL(包括SNI)
清爽的AngularJS前端页面
支持Websocket
支持HTTP/2
网络错误重试
支持Let’s Encrypt (自动更新HTTPS证书)
高可用集群模式
Traefik 工作原理
Traefik 可以与Kubernetes的API进行交互,每当Kubernetes使用Ingress对微服务进行添加、移除、或更新都会被感知,并且可以自动生成它们的配置文件。 指向到你服务的路由将会被直接创建出来。
Traefik UI界面
三、Kubernetes结合LVS高可用负载均衡与集群外服务访问实践
前端为两台LVS服务器,通过keepalive实现负载集群高可用以及虚拟IP,实现外部流量的四层负载,以及作为Kubernetes集群服务访问的入口。LVS负载均衡采用DR模式提高集群的处理速度。
后端三台服务器组成Kubernetes集群,每台节点使用hostPort的方式部署traefik容器,traefik监听节点的80端口,前端LVS负载均衡监听后端三台Kubernetes节点的80端口将外部访问负载分担至traefik。
然后由Traefik进行七层负载均衡,可以实现基于域名或访问目录等来实现映射与负载,将访问流量映射至Kubernetes Service并通过Service负载至最终业务POD所在的容器。
组网拓扑如下:
Kubernetes外部访问流程图
优势:
1.所有应用实现域名方式访问,相对IP+端口的访问方式,提高了访问的便捷性与可维护性。
2.简化应用发布的操作流程,域名与服务实现了自动更新与配置,只需定义ingress与添加外部DNS条目两步操作,即可完成应用的对外发布,减少操作流程,提高维护效率。
不足:
1.集群内部的服务转发与负载应对大规模访问流量,存在性能瓶颈,还有优化空间。
2.暂时无法实现LVS与Traefik的弹性伸缩与自动扩容。
分享结束啦,感谢分享嘉宾@陈俊 有容云系统工程师
现在可以互动了。大家可以提问,也可以质疑讨论,但不许说脏话,不能互相攻击。如有违规请自觉发红包,红包不得小于10元,不发红包者将踢出群。
Q:Traefik是由哪个组织开源的?目前有哪些大厂在使用?稳定性如何?
A: Traefik是github上的开源项目,目前的合作伙伴包括UCloud、Zenika、Asteris等,性能与稳定性方面官方有测试数据,详见:https://docs.traefik.cn/benchmarks
请问下K8s如何调整容器内存大小,通过resource来设置,不生效是什么原因
Q:k8s 可以使用Vxlan 组网么?有什么案例?
A: k8s可以使用Vxlan组网,flannel网络组件就包含Vxlan模式。
Q: 最后还是走的sip,为什么不用nodeport去暴露,选择这种架构?
A: nodeport方式在大规模部署时端口管理难度大,容易造成端口冲突,不利于后期维护。
Q:Ingress自己配合nginx实现,难点在哪里?
A:traefik则实现了反向代理与controller的整合,自动化生成反向代理方面成熟,与kubernetes实现紧密结合,nginx在这两方面需要调试。
Q:是否支持会话保持,hash策略,hash指定字段?
A:traefik支持会话保持,hash策略目前可以通过kubernetes client ip实现。
Q: 后端集群master属于单点吧?访问的pod日志怎么处理的?
A:案例中主要关注服务访问,只搭建了k8s单节点集群用于测试。访问pod的日志可以通过收集traefik容器的日志来进行处理。
Q:请问下K8s如何调整容器内存大小,通过resource来设置,不生效是什么原因?
A:限制容器内存大小的方式,可以定义resource中的request与limit来进行请求与限制,如果不生效可以检查资源限制模板的标签选择是否正确,并通过kubectl describe limits +pod名称进行查看
感谢分享嘉宾@陈俊 有容云系统工程师,由于时间关系我们今晚就进行到这里,再次感谢分享嘉宾,也谢谢大家,各位晚安。稍后在群内没有回答的问题,我们稍后会统一回答,和今晚的分享内容一起整理发布到公众号和有容云网站,欢迎大家关注。
明晚8点30,有容云后端开发工程师李强 将在“有容云Docker技术交流1群、2群、3群”,为大家带来" Kubernetes的主机和容器的监控方案"的微信群线上分享,届时将会有20分钟的互动答疑时间,欢迎准时收听PS:没有加入这3个群的小伙伴,可以加小助手,拉入群。
有容云分享嘉宾介绍:陈俊 有容云系统工程师 有着多年的数据中心服务器、网络、虚拟化等云计算技术相关工作经验,现主要负责k8s部署、网络、监控等相关的项目实施工作。 加微信群方法: 1.关注【有容云】公众号 2.留言”我要加群” QQ群号:454565480 有容云微信二维码