Kubernetes高可用负载均衡与集群外服务访问实践

本文来自9月26有容云Docker微信群分享整理

分享嘉宾:有容云系统工程师-陈俊

 

以下是分享正文:

 

Kubernetes在设计之初就充分考虑了针对容器的服务发现与负载均衡机制,提供了Service资源,并通过kube-proxy配合cloud provider来适应不同的应用场景。随着kubernetes用户的激增,用户场景的不断丰富,产生了一些新的负载均衡机制。

 

 

一、Kubernetes平台Service的特点

 

Service是对一组提供相同功能的Pods的抽象,并为它们提供一个统一的入口。借助Service,应用可以方便的实现服务发现与负载均衡,并实现应用的零宕机升级。Service通过标签来选取服务后端,一般配合Replication Controller或者Deployment来保证后端容器的正常运行。

 

目前 kubernetes 共有三种服务暴露的方式:

 

· LoadBlancerService

· NodePortService

· 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 等。

 

IngressController 与 kubernetes API 进行交互,实时的感知后端service、pod 等变化, IngressController 再结合下文的 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使用

ngress对微服务进行添加、移除、或更新都会被感知,并且可以自动生成它们的配置文件。指向到你服务的路由将会被直接创建出来。

 

Traefik UI界面

 

 

 

三、Kubernetes结合LVS高可用负载均衡与集群外服务访问实践

 

 

前端为两台LVS服务器,通过keepalive实现负载集群高可用以及虚拟IP,实现外部流量的四层负载,以及作为Kubernetes集群服务访问的入口。LVS负载均衡采用DR模式提高集群的处理速度。

 

后端三台服务器组成Kubernetes集群,每台节点使用hostPort 的方式部署traefik容器,traefik监听节点的80端口,前端LVS负载均衡监听后端三台Kubernetes节点的80端口将外部访问负载分担traefik。

 

然后由Traefik进行七层负载均衡,可以实现基于域名或访问目录等来实现映射与负载,将访问流量映射至Kubernetes Service并通过Service负载至最终业务POD所在的容器。

 

组网拓扑如下:

 

Deploy关键配置

 

apiVersion: extensions/v1beta1

kind: Deployment

metadata:

  name: wordpress-svc

  labels:

    app: wordpress-svc

spec:

  replicas: 3

  strategy:

    type: Recreate

  template:

    metadata:

      labels:

        app: wordpress-svc

        tier: frontend

    spec:

      containers:

      - image:"192.168.18.250:5002/library/wordpress:4.4-apache"

        name: wordpress-svc

        ports:

        - containerPort: 80

 

Service关键配置

 

apiVersion: v1

kind: Service

metadata:

  name: wordpress-svc

  labels:

    app: wordpress-svc

spec:

  ports:

  - port: 8912

    targetPort: 80

  selector:

    app: wordpress-svc

 

Ingress 关键配置

apiVersion: extensions/v1beta1

kind: Ingress

metadata:

  name: wordpress-ing

spec:

  rules:

  - host: wordpress.example.com

    http:

      paths:

      - path: /

        backend:

          serviceName: wordpress-svc

          servicePort: 8912

 

 

Kubernetes外部访问流程图

 

优势:

 

1.所有应用实现域名方式访问,相对IP+端口的访问方式,提高了访问的便捷性与可维护性。

 

2.简化应用发布的操作流程,域名与服务实现了自动更新与配置,只需定义ingress与添加外部DNS条目两步操作,即可完成应用的对外发布,减少操作流程,提高维护效率。

 

不足:

 

1.集群内部的服务转发与负载应对大规模访问流量,存在性能瓶颈,还有优化空间。

 

2.暂时无法实现LVS与Traefik的弹性伸缩与自动扩容。

 

Q&A

 

Q1:Traefik是由哪个组织开源的?目前有哪些大厂在使用?稳定性如何?

A:Traefik是github上的开源项目,目前的合作伙伴包括UCloud、Zenika、Asteris等,性能与稳定性方面官方有测试数据,详见:https://docs.traefik.cn/benchmarks

 

Q2:k8s  可以使用Vxlan  组网么?有什么案例?

A:k8s可以使用Vxlan组网,flannel网络组件就包含Vxlan模式。

 

Q3:最后还是走的sip,为什么不用nodeport去暴露,选择这种架构?

A:nodeport方式在大规模部署时端口管理难度大,容易造成端口冲突,不利于后期维护。

 

Q4Ingress 自己配合nginx 实现,难点在哪里?

Atraefik则实现了反向代理与controller的整合,自动化生成反向代理方面成熟,与kubernetes实现紧密结合,nginx在这两方面需要调试。

 

Q5请问下K8s如何调整容器内存大小,通过resource来设置,不生效是什么原因?

A:限制容器内存大小的方式,可以定义resource中的request与limit来进行请求与限制,如果不生效可以检查资源限制模板的标签选择是否正确,并通过kubectl describe limits +pod名称进行查看

 

Q6是否支持会话保持,hash 策略,hash指定字段?

A:traefik支持会话保持,hash策略目前可以通过kubernetes client ip实 现。

 

Q7:后端集群master 属于单点吧?访问的pod日志怎么处理的?

A:案例中主要关注服务访问,只搭建了k8s单节点集群用于测试。访问pod的日志可以通过收集traefik容器的日志来进行处理。

 

Q8:k8s除了对cpu和内存进行限制外,可以对磁盘限制吗?

 A: 可以,k8s可以通过pv/pvc实现对存储资源挂载与限制。

 

 

 

 

 

 

分享:Kubernetes高可用负载均衡与集群外服务访问实践

有容云-构筑企业容器云 www.youruncloud.com

温馨提示

对Docker容器技术或容器生产实施感兴趣的朋友欢迎加群讨论。我们汇集了Docker容器技术落地实施团队精英及业内技术派高人,在线为您分享Docker技术干货。我们的宗旨是为了大家拥有更专业的平台交流Docker实战技术,我们将定期邀请嘉宾做各类话题分享及回顾,共同实践研究Docker容器生态圈。

加微信群方法:

1.关注【有容云】公众号

2.留言”我要加群”

QQ群号:454565480

有容云微信二维码