在 Kubernetes 上部署 Traefik Ingress

640?wx_fmt=png


Traefik 介绍


简单的说,Ingress 就是从 Kubernetes 集群外访问集群的入口,将用户的 URL 请求转发到不同的 Service上。Ingress 相当于 Nginx、Apache 等负载均衡反向代理服务器,其中还包括规则定义,即 URL 的路由信息。


Traefik 是一款开源的反向代理与负载均衡工具。它最大的优点是能够与常见的微服务系统直接整合,实现自动化动态配置。Traefik 通过不断地跟 Kubernetes API 打交道,实时的感知后端 Service、Pod 等变化,比如 Pod,Service 增加与减少等;当得到这些变化信息后,Ingress 自动更新配置并热重载 ,达到服务发现的作用。


Traefik 整体架构如下所示:


640?wx_fmt=png


Traefik 主要特性详解


1. 自动熔断


在集群中,当某一个服务大量出现请求错误,或者请求响应时间过久,或者返回 500+ 错误状态码时,我们希望可以主动剔除该服务,也就是不在将请求转发到该服务上,而这一个过程是自动完成,不需要人工执行。Traefik 通过配置很容易就能帮我们实现,Traefik 可以通过定义策略来主动熔断服务。


  • NetworkErrorRatio() > 0.5:监测服务错误率达到 50% 时,熔断。

  • LatencyAtQuantileMS(50.0) > 50:监测延时大于50ms时,熔断。

  • ResponseCodeRatio(500, 600, 0, 600) > 0.5:监测返回状态码为 [500-600]在 [0-600] 区间占比超过 50% 时,熔断。


2. 负载均衡策略


Traefik 提供两种负载均衡策略支持。一种是 WRR(加权轮训调度算法),一种是 DRR(动态加权循环调度算法)。


WRR 是默认的负载均衡策略,新创建的 Service 权重都是一样为 1,这样的话,请求会平均分给每个服务,但是这样很多时候会出现资源分配不均衡的问题,比如由于集群中每个机器配置不一样,而且服务消耗不一样,假设 A 资源使用率已经很高,而 B 属于空闲状态,如果还是均摊到每个服务的话,会加重 A 的负荷,这时候因该有一种策略能够主动识别并分担更多流量到 B 才对。


DRR 就更加智能,它是一种动态加权轮训调度方式,它会记录一段时间内转发到 A 的请求数,跟转发到 B 的请求数对比,转发数量多,说明处理速度快,响应时间快。如果 A 处理请求速度比 B 快,那么就会调整 A 的权重,接下来的一段时间,就会转发更多请求给 A,相应的 B 的转发就少一些。整个过程都在不断的调整权重,实现请求的合理分配,从而达到资源使用最大化。

部署 Traefik ingress


创建 ingress-rbac.yaml,将用于 Service Account 验证。

 
 
apiVersion: v1	
kind: ServiceAccount	
metadata:	
name: ingress	
namespace: kube-system	
---	
kind: ClusterRoleBinding	
apiVersion: rbac.authorization.k8s.io/v1beta1	
metadata:	
name: ingress	
subjects:	
- kind: ServiceAccount	
name: ingress	
namespace: kube-system	
roleRef:	
kind: ClusterRole	
name: cluster-admin	
apiGroup: rbac.authorization.k8s.io


创建 Depeloyment 部署 Traefik,如文件名为 deployment.yaml。

 
 
apiVersion: extensions/v1beta1	
kind: Deployment	
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	
serviceAccountName: ingress	
containers:	
- image: traefik	
name: traefik-ingress-lb	
resources:	
limits:	
cpu: 1000m	
memory: 3000Mi	
requests:	
cpu: 500m	
memory: 2000Mi	
ports:	
- name: http	
containerPort: 80	
hostPort: 80	
- name: admin	
containerPort: 8580	
hostPort: 8580	
args:	
- --web	
- --web.address=:8580	
- --kubernetes


注意:我们这里用的是 Deploy 类型,没有限定该 Pod 运行在哪个主机上。Traefik的端口是 8580。


编写 Traefik UI 的 Ingress部署文件,如文件名为 traefik-ui.yaml。

 
 
apiVersion: v1	
kind: Service	
metadata:	
name: traefik-web-ui	
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.com	
http:	
paths:	
- path: /	
backend:	
serviceName: traefik-web-ui	
servicePort: web


backend 中要配置 default namespace 中启动的 service 名字。path 就是URL 地址后的路径,如 traefik.frontend.io/path,service 将会接受 path 这个路径,host 最好使用service-name.filed1.filed2.domain-name 这种类似主机名称的命名方式,方便区分服务。


配置完成后就可以启动 Treafik Ingress了。

 
 
$ kubectl create -f .	
deployment.extensions/traefik-ingress-lb created	
serviceaccount/ingress created	
clusterrolebinding.rbac.authorization.k8s.io/ingress created	
service/traefik-web-ui created	
ingress.extensions/traefik-web-ui created	
ingress.extensions/traefik-ingress created


查看是否部署成功

 
 
$ kubectl get pods -n kube-system | grep traefik	
traefik-ingress-lb-57786f6c44-cwr96        1/1     Running   0          2m27s	
	
$ kubectl get ingress -o wide --all-namespaces   	
NAMESPACE     NAME             HOSTS            ADDRESS   PORTS   AGE	
kube-system   traefik-web-ui   traefik.ui.com             80      12s


在客户端配置 hosts 域名解析,如下:

 
 
172.16.0.180 traefik.ui.com


172.16.0.180 是 Traefik Pod 所在的 K8s 节点,通过域名 traefik.ui.com 访问将可以看到 Dashboard


640?wx_fmt=png


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

测试


下面模拟部署一个程序,以 Nginx 为例,并使用 DRR 动态轮训加权策略。

 
 
$ cat nginx-deployment.yaml 	
apiVersion: apps/v1beta1	
kind: Deployment	
metadata:	
  name: nginx-pod	
spec:	
  replicas: 2	
  template:	
    metadata:	
      labels:	
        app: nginx-pod	
    spec:	
      containers:	
      - name: nginx	
        image: nginx:1.15.5	
        ports:	
        - containerPort: 80	
---	
apiVersion: v1	
kind: Service	
metadata:	
  name: nginx-service	
  annotations:	
    traefik.ingress.kubernetes.io/load-balancer-method: drr	
spec:	
  template:	
    metadata:	
      labels:	
        name: nginx-service	
        namespace: default	
spec:	
  selector:	
    app: nginx-pod	
  ports:	
  - port: 80	
    targetPort: 80	
---	
apiVersion: extensions/v1beta1	
kind: Ingress	
metadata:	
  name: nginx-ingress	
  annotations:	
    kubernetes.io/ingress.class: traefik	
spec:	
  rules:	
  - host: k8s.nginx.com	
    http:	
      paths:	
      - backend:	
          serviceName: nginx-service	
          servicePort: 80


创建 Nginx

 
 
$ kubectl apply -f nginx-deployment.yaml 	
$ kubectl get pods


同样,修改客户端的 hosts 文件。在其中加入:

 
 
172.16.0.180 traefik.ui.com	
172.16.0.180 k8s.nginx.com


所有访问这些地址的流量都会发送给 172.16.0.180 这台主机,就是我们启动Traefik 的主机。Traefik 会解析 HTTP 请求 Header 里的 Host 参数将流量转发给 Ingress 配置里的相应 Service。


640?wx_fmt=png


在外部客户端,访问 Nginx 应用的 Ingress 地址:http://k8s.nginx.com/


640?wx_fmt=png


在 K8s 集群节点上访问测试

 
 
$ curl -x 172.16.0.180:80 http://k8s.nginx.com


Ingress 配置同域名不同路径代理 Web 应用


很多使用我们不想配置太多的域名来区别应用,使用同域名分路径的方式来区别应用就简洁方便很多,Ingress 也提供了相关的配置。


假设两个应用 tomcat-test1 和 tomcat-test2 。这里可配置域名tomcat.test.k8s,通过路径 test1、test2 来分别代理两个 tomcat 应用。其中,分路径配置需添加配置:traefik.frontend.rule.type: PathPrefixStrip

 
 
$ vi ingress-tomcat.yaml 	
---	
apiVersion: extensions/v1beta1	
kind: Ingress	
metadata:	
  name: tomcat-test-web	
  namespace: default	
  annotations:	
    kubernetes.io/ingress.class: traefik	
    traefik.frontend.rule.type: PathPrefixStrip	
spec:	
  rules:	
  - host: tomcat.test.k8s	
    http:	
      paths:	
      - path: /test1/	
        backend:	
          serviceName: tomcat-test1	
          servicePort: 8080	
      - path: /test2/	
        backend:	
          serviceName: tomcat-test2	
          servicePort: 8080


 
 
$ kubectl apply -f ingress-tomcat.yaml                               	
$ kubectl describe ingress tomcat-test-web


从 describe 信息和 UI 界面上可以看到,tomcat.test.k8s 分别有了 /test1/和 /test2/ 的域名代理以及相对应的后端,可以修改 hosts 测试一下分路径是否生效:

 
 
172.16.0.180  tomcat.test.k8s


测试访问

640?wx_fmt=png


在线修改资源配置

如果需要在线修改部署的资源,如 Deployment、Service 或 Ingress 等,可以使用 kubectl edit 命令。如修改 Deployment。

 
 
$ kubectl get deploy	
$ kubectl edit deploy nginx-pod


或者直接修改 YAML 文件后,执行 kubectl apply 命令更新即可生效。

来源:xuchao's blog
原文:http://t.cn/ESt443q
题图:
来自谷歌图片搜索 
版权:
本文版权归原作者所有
投稿:欢迎投稿,投稿邮箱: editor@hi-linux.com

640?wx_fmt=gif


今日思想

人生如同道路,最近的捷径通常是最坏的路。


—— 弗兰西斯·培根「培根论人生」


640?wx_fmt=gif


推荐阅读


640?wx_fmt=gif

640?wx_fmt=png640?wx_fmt=gif

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值