本节内容:

  • Traefik介绍
  • 部署测试用的两个服务
  • Role Based Access Control configuration (Kubernetes 1.6+ only)
  • 部署Traefik
  • 部署 Ingress
  • 部署Traefik UI
  • 访问测试
  • 健康检查

一、Traefik介绍

traefik 是一个前端负载均衡器,对于微服务架构尤其是 kubernetes 等编排工具具有良好的支持;同 nginx 等相比,traefik 能够自动感知后端容器变化,从而实现自动服务发现。

由于微服务架构以及 Docker 技术和 kubernetes 编排工具最近几年才开始逐渐流行,所以一开始的反向代理服务器比如 nginx、apache 并未提供其支持,毕竟他们也不是先知;所以才会出现 Ingress Controller 这种东西来做 kubernetes 和前端负载均衡器如 nginx 之间做衔接;即 Ingress Controller 的存在就是为了能跟 kubernetes 交互,又能写 nginx 配置,还能 reload 它,这是一种折中方案;而 traefik 天生就是提供了对 kubernetes 的支持,也就是说 traefik 本身就能跟 kubernetes API 交互,感知后端变化,因此可以得知: 在使用 traefik 时,Ingress Controller 已经没什么用了,整体架构如下:

二、部署测试用的两个服务

部署两个服务nginx1-7和nginx1-8,后面用Traefik去负载这两个服务:

  1. apiVersion: v1
  2. kind: Service
  3. metadata:
  4. name: frontend
  5. spec:
  6. ports:
  7. - port: 80
  8. targetPort: 80
  9. selector:
  10. app: nginx1-7
  11. ---
  12. apiVersion: apps/v1beta1
  13. kind: Deployment
  14. metadata:
  15. name: nginx1-7-deployment
  16. spec:
  17. replicas: 2
  18. template:
  19. metadata:
  20. labels:
  21. app: nginx1-7
  22. spec:
  23. containers:
  24. - name: nginx
  25. image: nginx:1.7.9
  26. ports:
  27. - containerPort: 80

nginx1-7.yaml

  1. apiVersion: v1
  2. kind: Service
  3. metadata:
  4. name: my-nginx
  5. spec:
  6. ports:
  7. - port: 80
  8. targetPort: 80
  9. selector:
  10. app: nginx1-8
  11. ---
  12. apiVersion: apps/v1beta1
  13. kind: Deployment
  14. metadata:
  15. name: nginx1-8-deployment
  16. spec:
  17. replicas: 2
  18. template:
  19. metadata:
  20. labels:
  21. app: nginx1-8
  22. spec:
  23. containers:
  24. - name: nginx
  25. image: nginx:1.8
  26. ports:
  27. - containerPort: 80

nginx1-8.yaml

运行两个服务:

  1. [root@node1 nginx_ingress]# kubectl create -f nginx1-.yaml
  2. service "frontend" created
  3. deployment "nginx1-7-deployment" created
  4. [root@node1 nginx_ingress]# kubectl create -f nginx1-.yaml
  5. service "my-nginx" created
  6. deployment "nginx1-8-deployment" created

三、Role Based Access Control configuration (Kubernetes 1.6+ only)

我这里部署的是1.6.0集群,开启了RBAC,授权需要使用角色和绑定角色。

  1. [root@node1 traefik]# pwd
  2. /opt/traefik
  1. [root@node1 traefik]# vim ingress-rbac.yaml
  2. apiVersion: v1
  3. kind: ServiceAccount
  4. metadata:
  5. name: ingress
  6. namespace: kube-system
  7.  
  8. ---
  9.  
  10. kind: ClusterRoleBinding
  11. apiVersion: rbac.authorization.k8s.io/v1beta1
  12. metadata:
  13. name: ingress
  14. subjects:
  15. - kind: ServiceAccount
  16. name: ingress
  17. namespace: kube-system
  18. roleRef:
  19. kind: ClusterRole
  20. name: cluster-admin
  21. apiGroup: rbac.authorization.k8s.io

ingress-rbac.yaml

四、部署Traefik

  1. [root@node1 traefik]# pwd
  2. /opt/traefik
  1. [root@node1 traefik]# vim traefik-deploy.yaml
  2. apiVersion: extensions/v1beta1
  3. kind: Deployment
  4. metadata:
  5. name: traefik-ingress-lb
  6. namespace: kube-system
  7. labels:
  8. k8s-app: traefik-ingress-lb
  9. spec:
  10. template:
  11. metadata:
  12. labels:
  13. k8s-app: traefik-ingress-lb
  14. name: traefik-ingress-lb
  15. spec:
  16. terminationGracePeriodSeconds: 60
  17. hostNetwork: true
  18. restartPolicy: Always
  19. serviceAccountName: ingress
  20. containers:
  21. - image: traefik
  22. name: traefik-ingress-lb
  23. resources:
  24. limits:
  25. cpu: 200m
  26. memory: 30Mi
  27. requests:
  28. cpu: 100m
  29. memory: 20Mi
  30. ports:
  31. - name: http
  32. containerPort: 80
  33. hostPort: 80
  34. - name: admin
  35. containerPort: 8580
  36. hostPort: 8580
  37. args:
  38. - --web
  39. - --web.address=:8580
  40. - --kubernetes

traefik-deploy.yaml

其中 traefik 监听 node 的 80 和 8580 端口,80 提供正常服务,8580 是其自带的 UI 界面,原本默认是 8080,因为环境里端口冲突了,所以这里临时改一下。

【注意】:这里用的是Deploy类型,没有限定该pod运行在哪个主机上。

五、部署 Ingress

  1. [root@node1 traefik]# cat traefik.yaml
  2. apiVersion: extensions/v1beta1
  3. kind: Ingress
  4. metadata:
  5. name: traefik-ingress
  6. namespace: default
  7. spec:
  8. rules:
  9. - host: traefik.nginx.io
  10. http:
  11. paths:
  12. - path: /
  13. backend:
  14. serviceName: my-nginx
  15. servicePort: 80
  16. - host: traefik.frontend.io
  17. http:
  18. paths:
  19. - path: /
  20. backend:
  21. serviceName: frontend
  22. servicePort: 80

traefik.yaml

其中的backend中要配置default namespace中启动的service名字,如果你没有配置namespace名字,默认使用default namespace,如果你在其他namespace中创建服务想要暴露到kubernetes集群外部,可以创建新的ingress.yaml文件,同时在文件中指定该namespace,其他配置与上面的文件格式相同。path就是URL地址后的路径,如traefik.frontend.io/path,service将会接受path这个路径,host最好使用service-name.filed1.filed2.domain-name这种类似主机名称的命名方式,方便区分服务。

根据实际环境中部署的service的名字和端口自行修改,有新service增加时,修改该文件后可以使用kubectl replace -f traefik.yaml来更新。

六、部署Traefik UI

traefik 本身还提供了一套 UI 供我们使用,其同样以 Ingress 方式暴露,只需要创建一下即可。

  1. [root@node1 traefik]# cat traefik-ui-service.yaml
  2. apiVersion: v1
  3. kind: Service
  4. metadata:
  5. name: traefik-web-ui
  6. namespace: kube-system
  7. spec:
  8. selector:
  9. k8s-app: traefik-ingress-lb
  10. ports:
  11. - name: web
  12. port: 80
  13. targetPort: 8580
  14. ---
  15. apiVersion: extensions/v1beta1
  16. kind: Ingress
  17. metadata:
  18. name: traefik-web-ui
  19. namespace: kube-system
  20. spec:
  21. rules:
  22. - host: traefik-ui.local
  23. http:
  24. paths:
  25. - path: /
  26. backend:
  27. serviceName: traefik-web-ui
  28. servicePort: web

traefik-ui-service.yaml

最后一起创建:

  1. [root@node1 traefik]# kubectl create -f .
  2. serviceaccount "ingress" created
  3. clusterrolebinding "ingress" created
  4. deployment "traefik-ingress-lb" created
  5. service "traefik-web-ui" created
  6. ingress "traefik-web-ui" created
  7. ingress "traefik-ingress" created

七、访问测试

查看traefik pod被分配到了哪台主机上:

  1. [root@node1 traefik]# kubectl get pods -n kube-system -l k8s-app=traefik-ingress-lb -o wide
  2. NAME READY STATUS RESTARTS AGE IP NODE
  3. traefik-ingress-lb--1dg9n / Running 2m 172.16.7.152 172.16.7.152

浏览器输入http://172.16.7.152:8580/,将可以看到dashboard。

左侧黄色部分部分列出的是所有的rule,右侧绿色部分是所有的backend。

在Kubernetes集群的任意一个节点上执行。假如现在我要访问nginx的"/"路径。

  1. curl -H Host:traefik.nginx.io http://172.16.7.152/

如果需要在kubernetes集群以外访问就需要设置DNS,或者修改本机的hosts文件。

  1. 172.16.7.152 traefik.nginx.io
  2. 172.16.7.152 traefik.frontend.io

所有访问这些地址的流量都会发送给172.16.7.152这台主机,就是我们启动traefik的主机。

Traefik会解析http请求header里的Host参数将流量转发给Ingress配置里的相应service。

修改hosts后就就可以在kubernetes集群外访问以上两个service。

八、健康检查

关于健康检查,测试可以使用 kubernetes 的 Liveness Probe 实现,如果 Liveness Probe检查失败,则 traefik 会自动移除该 pod。

【示例】:我们定义一个 test-health 的 deployment,健康检查方式是 cat /tmp/health,容器启动 2 分钟后会删掉这个文件,模拟健康检查失败。

test-health的deployment:

  1. [root@node1 traefik]# cat test-health-deploy.yaml
  2. apiVersion: v1
  3. kind: Deployment
  4. apiVersion: extensions/v1beta1
  5. metadata:
  6. name: test
  7. namespace: default
  8. labels:
  9. test: alpine
  10. spec:
  11. replicas: 1
  12. selector:
  13. matchLabels:
  14. test: alpine
  15. template:
  16. metadata:
  17. labels:
  18. test: alpine
  19. name: test
  20. spec:
  21. containers:
  22. - image: mritd/alpine:3.4
  23. name: alpine
  24. resources:
  25. limits:
  26. cpu: 200m
  27. memory: 30Mi
  28. requests:
  29. cpu: 100m
  30. memory: 20Mi
  31. ports:
  32. - name: http
  33. containerPort: 80
  34. args:
  35. command:
  36. - "bash"
  37. - "-c"
  38. - "echo ok > /tmp/health;sleep 120;rm -f /tmp/health"
  39. livenessProbe:
  40. exec:
  41. command:
  42. - cat
  43. - /tmp/health
  44. initialDelaySeconds: 20

test-health-deploy.yaml

test-health 的 service:

  1. [root@node1 traefik]# vim test-health-service.yaml
  2. apiVersion: v1
  3. kind: Service
  4. metadata:
  5. name: test
  6. labels:
  7. name: test
  8. spec:
  9. ports:
  10. - port: 8123
  11. targetPort: 80
  12. selector:
  13. name: test

test-health-service.yaml

test-health的 Ingress:

  1. [root@node1 traefik]# vim test-health-ingress.yaml
  2. apiVersion: extensions/v1beta1
  3. kind: Ingress
  4. metadata:
  5. name: test
  6. spec:
  7. rules:
  8. - host: test.com
  9. http:
  10. paths:
  11. - path: /
  12. backend:
  13. serviceName: test
  14. servicePort: 8123

test-health-ingress.yaml

全部创建好以后,进入 traefik ui 界面,可以观察到每隔 2 分钟健康检查失败后,kubernetes 重建 pod,同时 traefik 会从后端列表中移除这个 pod。

在Kubernetes上使用Traefik的更多相关文章

  1. Step by Step!教你如何在k3s集群上使用Traefik 2.x

    本文来自边缘计算k3s社区 作者简介 Cello Spring,瑞士人.从电子起步,拥有电子工程学位.尔后开始关注计算机领域,在软件开发领域拥有多年的工作经验. Traefik是一个十分可靠的云原生动 ...

  2. 在单机Docker上安装 Traefik 反向代理-负载均衡器

    一.创建Traefik和容器应用的连接网络 sudo docker network create traefik-net 二.下载Traefik样本配置文件wget https://raw.githu ...

  3. 微服务开发有道之把项目迁移到Kubernetes上的5个小技巧

    我们将在本文中提供5个诀窍帮你将项目迁移到Kubernetes上,这些诀窍来源于过去12个月中OpenFaas社区的经验.下文的内容与Kubernetes 1.8兼容,并且已经应用于OpenFaaS ...

  4. 在Kubernetes上运行SAP UI5应用(下): 一个例子体会Kubernetes内容器的高可用性和弹性伸缩

    上一篇文章 在Kubernetes上运行SAP UI5应用(上),我介绍了如何在Docker里运行一个简单的SAP UI5应用,并且已经成功地将一个包含了这个UI5应用的docker镜像上传到Dock ...

  5. 深度学习框架TensorFlow在Kubernetes上的实践

    什么是TensorFlow TensorFlow是谷歌在去年11月份开源出来的深度学习框架.开篇我们提到过AlphaGo,它的开发团队DeepMind已经宣布之后的所有系统都将基于TensorFlow ...

  6. 在Kubernetes上运行SAP UI5应用(上)

    2018年只剩最后30天了.Jerry在2017年的最后一天,曾经立下一个目标:这个微信公众号在2018年保证至少每周发布一篇SAP原创技术文章. 从Jerry在后台统计的2018全年文章数量来看,这 ...

  7. 利用 istio 来对运行在 Kubernetes 上的微服务进行管理

    尝试在一个准生产环境下,利用 istio 来对运行在 Kubernetes 上的微服务进行管理. 这一篇是第一篇,将一些主要的坑和环境准备工作. 内容较多,因此无法写成手把手教程,希望读者有一定 Ku ...

  8. 实例演示:如何在Kubernetes上大规模运行CI/CD

    本周四晚上8:30,第二期k3s在线培训如约开播!本期课程将介绍k3s的核心架构,如高可用架构以及containerd.一起来进阶探索k3s吧! 报名及观看链接:http://z-mz.cn/PmwZ ...

  9. 把Spring Cloud Data Flow部署在Kubernetes上,再跑个任务试试

    1 前言 欢迎访问南瓜慢说 www.pkslow.com获取更多精彩文章! Spring Cloud Data Flow在本地跑得好好的,为什么要部署在Kubernetes上呢?主要是因为Kubern ...

随机推荐

  1. Eloquent 条件查询——tucker-eric/eloquentfilter 笔记

    请阅读 https://github.com/Tucker-Eric/EloquentFilter , 里面有很全的文档和注释,以下仅列出关键部分. 1. 安装 composer require tu ...

  2. python函数的 全局变量与局部变量

    一.函数的全局变量 1.什么是全局变量 顶着头开始写,没有任何缩进,在py文件的任何位置都能调用 #!/usr/bin/env python # _*_ coding:utf8 _*_ name=&q ...

  3. np.repeat函数

    np.repeat用法 觉得有用的话,欢迎一起讨论相互学习~Follow Me np.repeat用于将numpy数组重复 一维数组重复三次 import numpy as np # 随机生成[0,5 ...

  4. Idea+TestNg配置test-output输出(转)

    说明:testNG的工程我是使用eclipse创建的,直接导入到idea中,运行test时不会生产test-output,只能在idea的控制台中查看运行结果,然后到处报告,经过不懈的百度终于找到怎么 ...

  5. java类的定义

  6. java反射三种获得类类型的方法

    public class Test { public static void main(String[] args) { Test t=new Test();//所有的类都是Class类的实例(类类型 ...

  7. OK6410 rmmod卸载模块失败:No such file or directory -- 转

    原文地址:http://hi.baidu.com/andio/item/b8be9810282841433a176e86 rmmod chdir no such file or directory 说 ...

  8. 莫队-小Z的袜子

    ----普通莫队 首先清楚概率怎么求假设我们要求从区间l到r中拿出一对袜子的概率sum[i]为第i种袜子在l到r中的数量 $$\frac{\sum_{i=l}^{r} {[sum[i] \times ...

  9. D - Balanced Ternary String (贪心)

    题目链接:http://codeforces.com/contest/1102/problem/D 题目大意:给你一个字符串,这个字符串是由0,1,2构成的,然后让你替换字符,使得在替换的次数最少的前 ...

  10. atan2 atan

    atan2 definition In terms of the standard arctan function, whose range is (−π/2, π/2), it can be exp ...