共计 2890 个字符,预计需要花费 8 分钟才能阅读完成。
前文已经介绍过了 k8s ingress 的实现原理和配置,本文将介绍替代方案 traefik。在开始配置之前我们先回顾一下 ingress 发布 k8s 服务的实现方案,ingress 方案需要使用下列的组件:
1、反向代理负载均衡器
2、ingress control
3、ingress
其中 ingress control 负责同 apiserver 进行通信,监测 pod 和 service 的变化,并更新反向代理负载均衡器的配置,同时让反向代理负载均衡器重载配置。
接下来我们来看看 traefik,官网地址:https://traefik.io/
Traefik (pronounced like traffic) is a modern HTTP reverse proxy and load balancer made to deploy microservices with ease. It supports several backends (Docker,Swarm mode,Kubernetes,Marathon, Consul,Etcd,Rancher,Amazon ECS, and a lot more) to manage its configuration automatically and dynamically.
Traefik 本质上是一个 http 的方向代理和负载均衡,可以支持 Docker, Swarm mode, Kubernetes, Marathon, Consul, Etcd, Rancher, Amazon ECS 等后端服务,动态的管理这些服务的配置文件(我们可以理解为自动发现这些后端服务的配置变更,并重新加载服务的配置)
下图是 traefik 的工作原理示意图:
Traefik 的主要特点:
1、Go 语音编写、无需安装其他依赖包、速度快
2、支持 Rest API、多后端类型支持
3、支持配置文件热加载,不需要重启 app 进程
4、支持 Round Robin, rebalancer load-balancers 等负载均衡策略
5、自带 AngularJS Web UI 图形化界面
6、支持 https、自动更新 https 证书
7、支持 websocket、HTTP/2, GRPC、高可用集群等
8、支持网络错误重试、后端自动熔断(当后端应用错误数过多的时候,可以自动熔断)
总而言之, 在 k8s 集群中服务发布的方案选择,Traefik 可用作为 ingress 的替代解决方案,traefik 的特点足够说服我们将 ingress 替换成 Traefik,下面我们开始在 k8s 1.5.2 集群环境中使用 Traefik 来发布服务。
一、通过 yaml 文件已 daemonset 方式运行 traefik
# mkdir traefik
# cd traefik
# docker pullk docker.io/traefik# cat traefik.ds.yaml
apiVersion: extensions/v1beta1
kind: DaemonSet
metadata:
name: traefik-ingress-lb
namespace: default
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: docker.io/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: 8081
args:
– –web
– –web.address=:8081
– –kubernetes
– –kubernetes.endpoint=http://192.168.115.5:8080
二、通过 yaml 文件创建 webui 的 service、ingress
# cat ui.yaml
apiVersion: v1
kind: Service
metadata:
name: traefik-web-ui
namespace: default
spec:
selector:
k8s-app: traefik-ingress-lb
ports:
– name: web
port: 80
targetPort: 8081
—
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: traefik-web-ui
namespace: default
spec:
rules:
– host: traefik-ui.local
http:
paths:
– path: /
backend:
serviceName: traefik-web-ui
servicePort: web
三、通过 yaml 文件创建 kubernetes-dashboard 和 frontend 的 ingress
# cat traefik.ing.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: traefik-ingress
spec:
rules:
– host: k8s.webui
http:
paths:
– path: /
backend:
serviceName: kubernetes-dashboard
servicePort: 80
– host: k8s.frontend
http:
paths:
– path: /
backend:
serviceName: frontend
servicePort: 80
三、通过上述 yaml 配置文件创建 pod 和 ingress
# cd kubernetes/traefik/
# kubectl get pod
# kubectl get svc
# kubectl create -f .
# kubectl get pod
# kubectl get svc
# kubectl get ingress
四、访问应用测试
修改测试机 hosts 文件,因为 traefik 采用 demonset 的方式运行,所以 hosts 记录指向 k8s 集群中任意的节点均可
可以通过访问集群内任意节点的 8081 端口查看 taefik 的图形化界面
后续将研究一下如何在 k8s 集群中发布 https 协议的服务。