Traefik 简介
Træfɪk 是一个为了让部署微服务更加便捷而诞生的现代HTTP反向代理、负载均衡工具。 它支持多种后台 (Docker, Swarm, Kubernetes, Marathon, Mesos, Consul, Etcd, Zookeeper, BoltDB, Rest API, file…) 来自动化、动态的应用它的配置文件设置。
官方网站:https://traefik.io/
项目地址:https://github.com/traefik/traefik
helm 部署 traefik
官方文档:https://docs.traefik.io/getting-started/install-traefik/#use-the-helm-chart
helm仓库:https://github.com/traefik/traefik-helm-chart
前置要求:
由于 traefik 默认使用LoadBalancer方式暴露自身,因此需要提前部署一个负载均衡器,例如metallb等,为traefik service分配EXTERNAL-IP
地址。
添加Traefik Labs charts 存储库:
helm repo add traefik https://traefik.github.io/charts
使用helm
命令行安装traefik,默认service类型为LoadBalancer
helm install traefik traefik/traefik \
-n traefik --create-namespace
查看创建的pods
root@node1:~# kubectl -n traefik get pods
NAME READY STATUS RESTARTS AGE
traefik-587bdd95fd-rdfmm 1/1 Running 0 29s
查看创建的service,确认已分配EXTERNAL-IP
root@ubuntu:~# kubectl -n traefik get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
traefik LoadBalancer 10.96.2.68 192.168.72.231 80:30071/TCP,443:31255/TCP 46m
查看创建的ingressClass
root@ubuntu:~# kubectl get ingressclass
NAME CONTROLLER PARAMETERS AGE
traefik traefik.io/ingress-controller <none> 74s
出于安全考虑,此 HelmChart 默认情况下不会公开 Traefik 仪表板。因此,有多种方法可以公开仪表板,例如,通过定义和应用 IngressRoute CRD。
创建IngressRoute资源
# dashboard.yaml
apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
name: dashboard
spec:
entryPoints:
- web
routes:
- match: Host(`traefik.example.com`) && (PathPrefix(`/dashboard`) || PathPrefix(`/api`))
kind: Rule
services:
- name: api@internal
kind: TraefikService
应用yaml文件
kubectl apply -f dashboard.yaml
访问 dashboard
本地配置hosts解析,将域名traefik.example.com
指向EXTERNAL-IP
traefik.example.com 192.168.72.231
浏览器访问以下地址:
http://traefik.example.com/dashboard/
Traefik dashboard 首页如下:
Traefik ingress 示例
针对kubernetes环境,traefik 支持不同的provider,以下是两种主要的实现:
-
Kubernetes Ingress provider
:是 Kubernetes Ingress 控制器;也就是说,它通过支持Ingress规范来管理对集群服务的访问。 -
kubernetesCRD provider
:Kubernetes 入口控制器自定义资源方式。在早期版本中,Traefik 仅通过Kubernetes Ingress provider
支持 Kubernetes,严格意义上来说,这是一个 Kubernetes Ingress 控制器。后来 Traefik 工程团队为IngressRoute
类型开发了自定义资源定义 (CRD),以便提供更好的方法配置对 Kubernetes 集群的访问。
上面在向集群外暴露 traefik 自身dashboard服务时就使用了IngressRoute
的方式,下面基于whoami 示例应用针对两种类型的provider进行基本演示。
ingress示例
部署whoami
示例应用
# whoami.yaml
kind: Deployment
apiVersion: apps/v1
metadata:
name: whoami
labels:
app: whoami
spec:
replicas: 1
selector:
matchLabels:
app: whoami
template:
metadata:
labels:
app: whoami
spec:
containers:
- name: whoami
image: traefik/whoami
ports:
- name: web
containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: whoami
spec:
ports:
- name: web
port: 80
targetPort: web
selector:
app: whoami
创建 ingress 规则,注意这里的 kind 为 ingress。
# whoami-ingress.yml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: whoami-ingress
spec:
rules:
- host: whoami.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: whoami
port:
name: web
应用yaml配置
kubectl apply -f whoami.yaml
kubectl apply -f whoami-ingress.yml
查看创建的资源
root@ubuntu:~# kubectl get pods
NAME READY STATUS RESTARTS AGE
whoami-76c79d59c8-4lwcf 1/1 Running 0 2m34s
root@ubuntu:~# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 37d
whoami ClusterIP 10.96.1.145 <none> 80/TCP 2m36s
root@ubuntu:~# kubectl get ingress
NAME CLASS HOSTS ADDRESS PORTS AGE
whoami-ingress traefik whoami.example.com 80 2m38s
浏览器访问whoami 示例应用,注意配置域名解析,指向EXTERNAL-IP
ingressRoute 示例
注意这里的 kind 为 IngressRoute。
# whoami-ingressroute.yaml
apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
name: whoamiroute
spec:
entryPoints:
- web
routes:
- match: Host(`whoamiroute.example.com`)
kind: Rule
services:
- name: whoami
port: 80
查看创建的ingressRoute
root@ubuntu:~# kubectl get ingressroute.traefik.io
NAME AGE
dashboard 99m
whoamiroute 89s
浏览器访问 whoami 示例应用