helm repo add traefik https://helm.traefik.io/traefik
helm repo update
kubectl create ns traefik-v2
helm upgrade --install -n kube-system traefik traefik/traefik
端口说明: 8080是dashboard 80是http入口 443是https入口
配置traefik webui为IngressRoute资源, 配置文件文件的如下(traefik-ui.yaml):
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
name: traefik-webui-tls
namespace: kube-system
spec:
entryPoints:
- websecure # 注意这里是websecure这个entryPoint,监控443端口
tls:
certResolver: foo
domains:
- main: "ctq6.cn"
sans:
- "*.ctq6.cn"
passthrough: false
options:
name: tlsoption
namespace: kube-system
routes:
- match: Host(`traefik-uat.`) && PathPrefix(`/`)
kind: Rule
services:
- name: traefik
port: 8080
直接执行下面命令创建资源:
kubectl apply -f traefik-ui.yaml
通过域名访问traefik仪表盘
下面有一个nginx应用
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-test
namespace: kube-system
spec:
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx-test
ports:
- name: http
containerPort: 80
image: nginx
---
apiVersion: v1
kind: Service
metadata:
name: nginx-test
namespace: kube-system
spec:
selector:
app: nginx
test: "true"
type: ClusterIP
ports:
- name: web
port: 80
targetPort: http
让我们通过IngressRoute来配置一个规则
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
name: nginx-test
namespace: kube-system
spec:
entryPoints:
# 指定入口点为web。这里的web就是traefik静态配置(启动参数)中的 --entryPoints.web.address=:8080,通过仪表盘也可以看到
- web
routes:
- kind: Rule
match: Host(`localhost.cluster`) # 匹配规则,第三部分说明
services:
- name: nginx-test
port: 80
现在将入口web暴露出来,通过8080端口访问:
kubectl port-forward --address=0.0.0.0 -n traefik-v2 $(kubectl get pods -n traefik-v2 --selector "app.kubernetes.io/name=traefik" --output=name) 8080:8080
在本地做host解析 x.x.x.x localhost.cluster
现在可以直接打开localhost.cluster:8080, 可以看到nginx已经正常访问
key
, value
): 判断请求头是否存在,key是请求头名称,value是值key
, regexp
): 同上,可以使用正则来匹配example.com
, …): 检查请求Host请求头,判断其值是否为给定之一example.com
, …): 同上example.com
, {subdomain:[a-z]+}.example.com
, …): 同上,可以使用正则GET
, …): 检查请求方法是否为给定的一个methods(GET,POST,PUT,DELETE,PATCH)/path
, /articles/{cat:[a-z]+}/{id:[0-9]+}
, …): 匹配确切的请求路径。接受正则表达式/products/
, /articles/{cat:[a-z]+}/{id:[0-9]+}
): 匹配请求前缀路径。接受正则表达式foo=bar
, bar=baz
): 匹配查询字符串参数注意点:
为了与Host和Path表达式一起使用正则表达式,必须声明一个任意命名的变量,后跟用冒号分隔的正则表达式,所有这些都用花括号括起来。例如/posts/{id:[0-9]+},id为变量名
您可以使用AND(&&)和OR(||)运算符组合多个匹配器。您也可以使用括号。
规则评估后可以使用中间件,在请求被转发到服务之前对规则进行评估
kubectl create secret tls nginx-test --cert=tls.crt --key=tls.key
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
name: nginx-test
namespace: kube-system
spec:
entryPoints:
# 指定入口点为web。这里的web就是traefik静态配置(启动参数)中的 --entryPoints.web.address=:8080,通过仪表盘也可以看到
- web
routes:
- kind: Rule
match: Host(`localhost.cluster`) # 匹配规则,第三部分说明
services:
- name: nginx-test
port: 80
tls:
secretName: nginx-test
因为不是正常的证书,所以访问过不去