traefik 是一个前端负载均衡器,对于微服务架构尤其是 kubernetes 等编排工具具有良好的支持;同 nginx 等相比,traefik 能够自动感知后端容器变化,从而实现自动服务发现;今天小试了一下,在此记录一下使用过程
一、Kubernetes 服务暴露介绍
从 kubernetes 1.2 版本开始,kubernetes提供了 Ingress 对象来实现对外暴露服务;到目前为止 kubernetes 总共有三种暴露服务的方式:
- LoadBlancer Service
- NodePort Service
- Ingress
1.1、LoadBlancer Service
LoadBlancer Service 是 kubernetes 深度结合云平台的一个组件;当使用 LoadBlancer Service 暴露服务时,实际上是通过向底层云平台申请创建一个负载均衡器 来向外暴露服务;目前 LoadBlancer Service 支持的云平台已经相对完善,比如国外的 GCE、DigitalOcean,国内的 阿里云,私有云 Openstack 等等,由于 LoadBlancer Service 深度结合了云平台,所以只能在一些云平台上来使用
1.2、NodePort Service
NodePort Service 顾名思义,实质上就是通过在集群的每个 node 上暴露一个端口,然后将这个端口映射到某个具体的 service 来实现的,虽然每个 node 的端口有很多(0~65535),但是由于安全性和易用性(服务多了就乱了,还有端口冲突问题)实际使用可能并不多
1.3、Ingress
Ingress 这个东西是 1.2 后才出现的,通过 Ingress 用户可以实现使用 nginx 等开源的反向代理负载均衡器实现对外暴露服务,以下详细说一下 Ingress,毕竟 traefik 用的就是 Ingress
使用 Ingress 时一般会有三个组件:
- 反向代理负载均衡器
- Ingress Controller
- Ingress
1.3.1、反向代理负载均衡器
反向代理负载均衡器很简单,说白了就是 nginx、apache 什么的;在集群中反向代理负载均衡器可以自由部署,可以使用 Replication Controller、Deployment、DaemonSet 等等,不过个人喜欢以 DaemonSet 的方式部署,感觉比较方便
1.3.2、Ingress Controller
Ingress Controller 实质上可以理解为是个监视器,Ingress Controller 通过不断地跟 kubernetes API 打交道,实时的感知后端 service、pod 等变化,比如新增和减少 pod,service 增加与减少等;当得到这些变化信息后,Ingress Controller 再结合下文的 Ingress 生成配置,然后更新反向代理负载均衡器,并刷新其配置,达到服务发现的作用
1.3.3、Ingress
Ingress 简单理解就是个规则定义;比如说某个域名对应某个 service,即当某个域名的请求进来时转发给某个 service;这个规则将与 Ingress Controller 结合,然后 Ingress Controller 将其动态写入到负载均衡器配置中,从而实现整体的服务发现和负载均衡
有点懵逼,那就看图
从上图中可以很清晰的看到,实际上请求进来还是被负载均衡器拦截,比如 nginx,然后 Ingress Controller 通过跟 Ingress 交互得知某个域名对应哪个 service,再通过跟 kubernetes API 交互得知 service 地址等信息;综合以后生成配置文件实时写入负载均衡器,然后负载均衡器 reload 该规则便可实现服务发现,即动态映射
了解了以上内容以后,这也就很好的说明了我为什么喜欢把负载均衡器部署为 Daemon Set;因为无论如何请求首先是被负载均衡器拦截的,所以在每个 node 上都部署一下,同时 hostport 方式监听 80 端口;那么就解决了其他方式部署不确定 负载均衡器在哪的问题,同时访问每个 node 的 80 都能正确解析请求;如果前端再 放个 nginx 就又实现了一层负载均衡
二、Traefik 使用
由于微服务架构以及 Docker 技术和 kubernetes 编排工具最近几年才开始逐渐流行,所以一开始的反向代理服务器比如 nginx、apache 并未提供其支持,毕竟他们也不是先知;所以才会出现 Ingress Controller 这种东西来做 kubernetes 和前端负载均衡器如 nginx 之间做衔接; 即 Ingress Controller 的存在就是为了能跟 kubernetes 交互,又能写 nginx 配置,还能 reload 它,这是一种折中方案 ;而最近开始出现的 traefik 天生就是提供了对 kubernetes 的支持, 也就是说 traefik 本身就能跟 kubernetes API 交互,感知后端变化,因此可以得知: 在使用 traefik 时,Ingress Controller 已经无卵用了,所以整体架构如下
2.1、部署 Traefik
已经从大体上搞懂了 Ingress 和 traefik,那么部署起来就很简单
2.1.1、部署 Daemon Set
首先以 Daemon Set 的方式在每个 node 上启动一个 traefik,并使用 hostPort 的方式让其监听每个 node 的 80 端口(有没有感觉这就是个 NodePort? 不过区别就是这个 Port 后面有负载均衡器 –>手动微笑)
kubectl create -f traefik.ds.yanl # Daemon set 文件如下 apiVersion: extensions/v1beta1 kind: DaemonSet metadata: name: traefik-ingress-lb namespace: kube-system labels: k8s-app: traefik-ingress-lb spec: template: metadata: labels: k8s-app: traefik-ingress-lb name: traefik-ingress-lb spec: terminationGracePeriodSeconds: 60 hostNetwork: true restartPolicy: Always containers: - image: traefik name: traefik-ingress-lb resources: limits: cpu: 200m memory: 30Mi requests: cpu: 100m memory: 20Mi ports: - name: http containerPort: 80 hostPort: 80 - name: admin containerPort: 8580 args: - --web - --web.address=:8580 - --kubernetes
其中 traefik 监听 node 的 80 和 8580 端口,80 提供正常服务,8580 是其自带的 UI 界面,原本默认是 8080,因为环境里端口冲突了,所以这里临时改一下
2.1.2、部署 Ingress
从上面的长篇大论已经得知了 Ingress Controller 是无需部署的,所以直接部署 Ingress 即可
kubectl create -f traefik.ing.yaml # Ingress 文件如下 apiVersion: extensions/v1beta1 kind: Ingress metadata: name: traefik-ingress spec: rules: - host: traefik.www.test.com http: paths: - path: / backend: serviceName: test-www servicePort: 8080 - host: traefik.api.test.com http: paths: - path: / backend: serviceName: test-api servicePort: 8080
实际上事先集群中已经存在了相应的名为 test-www 和 test-api 的 service,对应的 service 后端也有很多 pod;所以这里就不在具体写部署实际业务容器(test-www、test-api)的过程了,各位测试时,只需要把这个 test 的 service 替换成自己业务的 service 即可
2.1.3、部署 Traefik UI
traefik 本身还提供了一套 UI 供我们使用,其同样以 Ingress 方式暴露,只需要创建一下即可
kubectl create -f ui.yaml # ui yaml 如下 --- apiVersion: v1 kind: Service metadata: name: traefik-web-ui namespace: kube-system spec: selector: k8s-app: traefik-ingress-lb ports: - name: web port: 80 targetPort: 8580 --- apiVersion: extensions/v1beta1 kind: Ingress metadata: name: traefik-web-ui namespace: kube-system spec: rules: - host: traefik-ui.local http: paths: - path: / backend: serviceName: traefik-web-ui servicePort: web
2.1.4、访问测试
都创建无误以后,只需要将待测试的域名解析到任意一台 node 上即可,页面就不截图了,截图就暴露了…..下面来两张 ui 的
2.2、健康检查
关于健康检查,测试可以使用 kubernetes 的 Liveness Probe 实现,如果 Liveness Probe检查失败,则 traefik 会自动移除该 pod,以下是一个 示例
test 的 deployment,健康检查方式是 cat /tmp/health
,容器启动 2 分钟后会删掉这个文件,模拟健康检查失败
apiVersion: v1 kind: Deployment apiVersion: extensions/v1beta1 metadata: name: test namespace: default labels: test: alpine spec: replicas: 1 selector: matchLabels: test: alpine template: metadata: labels: test: alpine name: test spec: containers: - image: mritd/alpine:3.4 name: alpine resources: limits: cpu: 200m memory: 30Mi requests: cpu: 100m memory: 20Mi ports: - name: http containerPort: 80 args: command: - "bash" - "-c" - "echo ok > /tmp/health;sleep 120;rm -f /tmp/health" livenessProbe: exec: command: - cat - /tmp/health initialDelaySeconds: 20
test 的 service
apiVersion: v1 kind: Service metadata: name: test labels: name: test spec: ports: - port: 8123 targetPort: 80 selector: name: test
test 的 Ingress
apiVersion: extensions/v1beta1 kind: Ingress metadata: name: test spec: rules: - host: test.com http: paths: - path: / backend: serviceName: test servicePort: 8123
全部创建好以后,进入 traefik ui 界面,可以观察到每隔 2 分钟健康检查失败后,kubernetes 重建 pod,同时 traefik 会从后端列表中移除这个 pod
其他更多玩法请参考 官方文档 (我发现他居然支持 Let’s Entrypt,个人博客福音啊),如有错误欢迎指正
转载请注明出处,本文采用 CC4.0 协议授权
原文
http://mritd.me/2016/12/06/try-traefik-on-kubernetes/
相关推荐
csp - j初试模拟卷.docx csp - j初试模拟卷.docx csp - j初试模拟卷.docx csp - j初试模拟卷.docx csp - j初试模拟卷.docx csp - j初试模拟卷.docx csp - j初试模拟卷.docx csp - j初试模拟卷.docx csp - j初试模拟...
901 机械设计-(初试)自命题考试大纲.pdf; filename*=utf-8''901+机械设计-(初试)自命题考试大纲(1).pdf;
标题"华中科技大学-计算机-考研初试-复试-资料.zip"表明这是一份针对华中科技大学计算机专业考研的综合资料包,涵盖了初试和复试两个阶段的学习材料。从".zip"文件格式来看,这是一个压缩文件,意味着其中包含多个...
河海大学电路初试822-843初试真题答案详解(题目比较新)
"antv-g6初试身手demo"是基于AntV G6 的一个示例项目,用于展示其基本功能和动态效果,帮助开发者更好地理解和应用G6。 在这个"模拟流程图动态切换demo"中,我们可以学习到以下几个重要的知识点: 1. **AntV G6 ...
河海大学电路初试822-843初试真题答案详解(各有6-7套),真题很重要,答案不好找
【标题】"中科大-计算机-考研-初试-复试-资料详解.zip" 提供了中国科学技术大学(中科大)计算机专业考研的重要参考资料,涵盖了初试和复试的关键环节。这个压缩包显然是一份全面的学习资源,旨在帮助考生充分准备...
2021级师姐全网搜集+独门笔记|内蒙古大学-计算机专硕考研-893初试真题(2022全网最全)+笔记+课件/试卷(不涉及版权问题) 购买后如有需要,可私信我,送30分钟专业课备考经验及考情指导,助力上岸! 另有C、C++参考...
部编人教版五年级语文上册-交流平台 初试身手-教案教学设计.docx部编人教版五年级语文上册-交流平台 初试身手-教案教学设计.docx部编人教版五年级语文上册-交流平台 初试身手-教案教学设计.docx部编人教版五年级语文...
内容:考研初试资料,包括:数学、英语、政治、专业课 适用人群:考研人 使用经验请关注知乎:https://www.zhihu.com/people/mr-somebody-33/posts
重庆大学计算机专业的考研资源集合,包括初试与复试的相关材料,是考生们宝贵的参考资料。这份压缩包涵盖了多种关键的学习资源,旨在帮助考生更好地准备考试,提高成功通过的可能性。 首先,"复试真题和答案(11·19...
893专业课考研真题,有2005年到2008年、2013年到2019年真题,2020年真题为回忆版,只有题型。
#### 西南财经大学2017-2021年初试真题概览 - **来源**: 西南财经大学历年保险硕士专业学位研究生入学考试真题。 - **内容**: 包括保险学原理、财产保险、人身保险等多个方面的试题。 - **目的**: 帮助考生熟悉考试...
这份"南京大学-计算机-考研-初试-复试-机试-真题整理.zip"压缩包显然是一份宝贵的资源,包含了考生们在备考过程中可能需要的重要资料。以下是基于标题、描述和标签所涉及的知识点的详细解释: 一、考研 考研,全称...
共11年答案,从2005年到2008年、2013年到2019年,电子版真题答案,很实用,内超详细,算法题同样给出答案。
这份“杭州电子科技大学-计算机-考研-初试-复试-复习知识点总结.zip”压缩包文件,包含了历年的考研复习重点,旨在帮助考生们精准把握考试脉络,提升备考效率。 一、核心课程与基础理论 1. 数据结构:作为计算机...
这份"南京理工大学-考研-初试-复试上机试题.zip"压缩包包含了历年的真实考试题库,对于备考的学子来说,是一份宝贵的参考资料。 1. 数据结构:数据结构是计算机科学的基础,包括数组、链表、栈、队列、树、图等。...
以下是对初试和复试关键知识点的详细梳理。 一、初试知识点 1. 数据结构与算法:这是考研基础中的核心部分,包括线性表、栈、队列、树、图、排序算法(如冒泡、选择、插入、快速、归并、堆排序等)、查找算法(二...
标题"哈工大-计算机-854考研-初试-复试-机试知识以及经验总结.zip"表明这是一个针对哈尔滨工业大学计算机专业854科目考研的资源包,包含了初试、复试及机试的相关知识和经验分享。哈工大是知名的工科院校,其计算机...
部编人教版六年级语文上册-交流平台与初试身手-教案教学设计.docx部编人教版六年级语文上册-交流平台与初试身手-教案教学设计.docx部编人教版六年级语文上册-交流平台与初试身手-教案教学设计.docx部编人教版六年级...