k8s集群Ingress+Traefik的实用类型实现
·
这次来写一篇ingress的一些用法
环境用的是Ubuntu22.04搭建的k8集群
链接:https://blog.csdn.net/weixin_45049740/article/details/156514328?spm=1001.2014.3001.5502
文章总分为二块
第一块是原生Ingress的方法
第二块是traefik ingressRoute的代理方法
下面是一些介绍可以跳过
traefik介绍
传统反向代理(如 Nginx)依赖静态配置,面对服务频繁上下线、弹性伸缩时,需手动改配置或依赖模板 / 脚本,易出错且效率低。Traefik 从设计上解决这些痛点:
1 自动发现后端服务(如 Docker 容器、K8s Service),实时生成路由,无需手动维护路由表;
2 内置 ACME 客户端,自动申请 / 续期 Let’s Encrypt 证书,简化 HTTPS 配置;
3 以 “中间件” 封装常用流量治理能力(如重定向、限流、认证),配置灵活可复用;
4 提供可视化 Dashboard,快速排查路由与服务问题,降低运维门槛。
Ingress 介绍
Ingress 是Kubernetes 原生的 HTTP/HTTPS 流量入口资源,核心作用是为集群内的 Service 提供统一的外部访问入口和七层(应用层)路由规则管理,解决了 NodePort/LoadBalancer 端口零散、无域名 / 路径路由、HTTPS 配置繁琐等问题,是 K8s 集群暴露七层服务的标准方案。
简单说:K8s 里的 Service 负责集群内服务发现和四层负载均衡,而 Ingress 负责集群外的七层流量调度,把外部基于域名、URL 路径的请求,精准转发到对应的后端 Service,同时可统一管理 HTTPS 证书、限流、重定向等七层策略。
IngressRoute 介绍
IngressRoute 是 Traefik 针对 K8s 设计的自定义资源(CRD),本质是「Traefik 专属的 Ingress 规则定义方式」—— 它比 K8s 原生 Ingress 功能更强、配置更灵活,是 Traefik 接管 K8s 七层流量的核心配置入口。
简单说:
K8s 原生 Ingress 是「通用版七层路由规则」,功能有限;
Traefik IngressRoute 是「Traefik 定制版七层路由规则」,完美适配 Traefik 的所有特性(中间件、TLS、权重路由等)。
一. Ingress
1.1 http代理模式
1.1.1 镜像配置
链接:https://pan.baidu.com/s/1k4yZHQoCawwvsUkKRbtBKw?pwd=v2kf
[root@master01 game]# cat deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: game-static-v1
labels:
app: game-static
spec:
replicas: 2
selector:
matchLabels:
app: game-static-v1
template:
metadata:
labels:
app: game-static-v1
spec:
containers:
- name: c1
image: hb.aixxw.xin:8444/gamehtml/testgame:v0.1
ports:
- containerPort: 8090
protocol: TCP
---
apiVersion: v1
kind: Service
metadata:
name: game-static-svc-v1
spec:
selector:
app: game-static-v1
type: NodePort
ports:
- port: 8091
targetPort: 8090
nodePort: 30891
1.1.2 运行
kubectl apply -f deployment.yaml ingress-deployment.yaml
#添加hosts解析
[root@master01 game]# cat /etc/hosts
...
...
10.0.250.6 worker01 v1.xinyouzhumeng.com v2.xinyouzhumeng.com
...
...
#检查下
[root@master01 ~]# kubectl get ing
NAME CLASS HOSTS ADDRESS PORTS AGE
ingress-game traefik-server v1.xinyouzhumeng.com 80 10h
kubectl describe ingress ingress-game
Name: ingress-game
Labels: <none>
Namespace: default
Address:
Ingress Class: traefik-server
Default backend: <default>
Rules:
Host Path Backends
---- ---- --------
v1.xinyouzhumeng.com
/ game-static-svc-v1:8091 (10.100.30.110:8090,10.100.5.52:8090)
v2.xinyouzhumeng.com
Annotations: <none>
Events: <none>
[root@master01 game]# cat ingress-deployment.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-game
namespace: default
spec:
ingressClassName: traefik-server
rules:
- host: v1.xinyouzhumeng.com
http:
paths:
- pathType: Prefix
path: /
backend:
service:
name: game-static-svc-v1
port:
number: 8091
检查测试
root@master01 game]# kubectl get svc -A |grep traefik-server
traefik traefik-server NodePort 10.200.182.166 <none> 80:26286/TCP,443:30700/TCP 7d12h
[root@master01 game]# curl v1.xinyouzhumeng.com:26286
<!DOCTYPE html>
<html lang="zh-CN">
<head>
.....
.....
</body>
</html>
1.2 url多路径匹配
[root@master01 ~]# mkdir /root/test
[root@master01 ~]# cd test/
[root@master01 test]# cat deplourl.yam
apiVersion: apps/v1
kind: Deployment
metadata:
name: game-static-v3
labels:
app: game-static
spec:
replicas: 2
selector:
matchLabels:
app: game-static-v3
template:
metadata:
labels:
app: game-static-v3
spec:
volumes:
- name: data
emptyDir: {}
- name: dt
hostPath:
path: /etc/localtime
initContainers:
- name: i1
image: hb.aixxw.xin:8444/gamehtml/testgame:v0.1
command:
- /bin/sh
- -c
- echo ${pod_name} =========== ${pod_ip} >> /data/code/index.html
env:
- name: pod_name
valueFrom:
fieldRef:
fieldPath: metadata.name
- name: pod_ip
valueFrom:
fieldRef:
fieldPath: status.podIP
volumeMounts:
- name: data
mountPath: /data/code
- name: dt
mountPath: /etc/localtime
containers:
- name: c3
image: hb.aixxw.xin:8444/gamehtml/testgame:v0.1
ports:
- containerPort: 8090
protocol: TCP
volumeMounts:
- name: data
mountPath: /data/code/
- name: dt
mountPath: /etc/localtime
---
apiVersion: v1
kind: Service
metadata:
name: game-static-svc-v3
spec:
selector:
app: game-static-v3
type: NodePort
ports:
- port: 8093
targetPort: 8090
nodePort: 30893
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: game-static-v4
labels:
app: game-static
spec:
replicas: 2
selector:
matchLabels:
app: game-static-v4
template:
metadata:
labels:
app: game-static-v4
spec:
volumes:
- name: data
emptyDir: {}
- name: dt
hostPath:
path: /etc/localtime
initContainers:
- name: i1
image: hb.aixxw.xin:8444/gamehtml/testgame:v0.1
command:
- /bin/sh
- -c
- echo ${pod_name} =========== ${pod_ip} >> /data/code/index.html
env:
- name: pod_name
valueFrom:
fieldRef:
fieldPath: metadata.name
- name: pod_ip
valueFrom:
fieldRef:
fieldPath: status.podIP
volumeMounts:
- name: data
mountPath: /data/code
- name: dt
mountPath: /etc/localtime
containers:
- name: c4
image: hb.aixxw.xin:8444/gamehtml/testgame:v0.1
ports:
- containerPort: 8090
protocol: TCP
volumeMounts:
- name: data
mountPath: /data/code/
- name: dt
mountPath: /etc/localtime
---
apiVersion: v1
kind: Service
metadata:
name: game-static-svc-v4
spec:
selector:
app: game-static-v4
type: NodePort
ports:
- port: 8094
targetPort: 8090
nodePort: 30894
1.2.1 启动
kubectl apply -f deplourl.yam
[root@master01 test]# kubectl get pods,svc -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod/cj-backup-etcd-29499420-nhvz2 0/1 Completed 0 6d14h 10.0.250.6 worker01 <none> <none>
pod/cj-backup-etcd-29505180-kxcnf 0/1 Completed 1 45h 10.0.250.6 worker01 <none> <none>
pod/cj-backup-etcd-29506620-wjggc 0/1 Completed 0 38h 10.0.250.6 worker01 <none> <none>
pod/cj-backup-etcd-29508060-dv45n 0/1 Completed 0 14h 10.0.250.6 worker01 <none> <none>
pod/game-static-v1-b9bf9899c-lnwjk 1/1 Running 0 14h 10.100.30.110 worker02 <none> <none>
pod/game-static-v1-b9bf9899c-mdxgk 1/1 Running 0 14h 10.100.5.52 worker01 <none> <none>
pod/game-static-v2-67665d5b95-9qk8k 1/1 Running 0 14h 10.100.30.111 worker02 <none> <none>
pod/game-static-v2-67665d5b95-hw8rs 1/1 Running 0 14h 10.100.5.53 worker01 <none> <none>
pod/game-static-v3-89bcff66d-k5gk4 1/1 Running 0 32m 10.100.5.54 worker01 <none> <none>
pod/game-static-v3-89bcff66d-q92hc 1/1 Running 0 32m 10.100.30.112 worker02 <none> <none>
pod/game-static-v4-7b499d74bb-8w5nv 1/1 Running 0 32m 10.100.30.113 worker02 <none> <none>
pod/game-static-v4-7b499d74bb-cfrvl 1/1 Running 0 32m 10.100.5.55 worker01 <none> <none>
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
service/game-static-svc-v1 NodePort 10.200.148.10 <none> 8091:30891/TCP 14h app=game-static-v1
service/game-static-svc-v2 NodePort 10.200.224.128 <none> 8092:30892/TCP 14h app=game-static-v2
service/game-static-svc-v3 NodePort 10.200.108.3 <none> 8093:30893/TCP 32m app=game-static-v3
service/game-static-svc-v4 NodePort 10.200.36.188 <none> 8094:30894/TCP 32m app=game-static-v4
service/kubernetes ClusterIP 10.200.0.1 <none> 443/TCP 30d <none>
[root@master01 test]#
#可以看到轮询正常
[root@master01 test]# curl 10.200.36.188:8094
game-static-v4-7b499d74bb-8w5nv =========== 10.100.30.113
[root@master01 test]# curl 10.200.36.188:8094
game-static-v4-7b499d74bb-cfrvl =========== 10.100.5.55
[root@master01 test]# curl 10.200.36.188:8094
game-static-v4-7b499d74bb-8w5nv =========== 10.100.30.113
[root@master01 test]# curl 10.200.36.188:8094
game-static-v4-7b499d74bb-cfrvl =========== 10.100.5.55
[root@master01 test]#
1.2.2 ingress实现uri代理分发配置
[root@master01 test]# cat ingurl.yam
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-uri
spec:
ingressClassName: traefik-server
rules:
- host: url.xinyouzhumeng.com
http:
paths:
- pathType: Prefix
path: /v1
backend:
service:
name: game-static-svc-v3
port:
number: 8093
- pathType: Prefix
path: /v2
backend:
service:
name: game-static-svc-v4
port:
number: 8094
记得配置hosts
[root@master01 test]# cat /etc/hosts
...
10.0.250.6 worker01 v1.xinyouzhumeng.com v2.xinyouzhumeng.com url.xinyouzhumeng.com
10.0.250.7 worker02 v1.xinyouzhumeng.com v2.xinyouzhumeng.com url.xinyouzhumeng.com
[root@master01 test]#
[root@master01 test]# kubectl get ing
NAME CLASS HOSTS ADDRESS PORTS AGE
ingress-game traefik-server v1.xinyouzhumeng.com,v2.xinyouzhumeng.com 80 13h
ingress-uri traefik-server url.xinyouzhumeng.com 80 4m41s
[root@master01 test]# kubectl describe ing ingress-uri
Name: ingress-uri
Labels: <none>
Namespace: default
Address:
Ingress Class: traefik-server
Default backend: <default>
Rules:
Host Path Backends
---- ---- --------
url.xinyouzhumeng.com
/v1 game-static-svc-v3:8093 (10.100.30.114:8090,10.100.5.56:8090)
/v2 game-static-svc-v4:8094 (10.100.30.115:8090,10.100.5.57:8090)
Annotations: <none>
Events: <none>
#看端口
error: unknown command "traefik-server" for "kubectl"
[root@master01 test]# kubectl get svc -A | grep -i traefik
traefik traefik-server NodePort 10.200.182.166 <none> 80:26286/TCP,443:30700/TCP 7d15h
1.2.3 访问测试
[root@master01 test]# curl url.xinyouzhumeng.com:26286/v1
game-static-v3-89bcff66d-2gh5j =========== 10.100.30.114
[root@master01 test]# curl url.xinyouzhumeng.com:26286/v1
game-static-v3-89bcff66d-4blw9 =========== 10.100.5.56
[root@master01 test]# curl url.xinyouzhumeng.com:26286/v1
game-static-v3-89bcff66d-2gh5j =========== 10.100.30.114
[root@master01 test]# curl url.xinyouzhumeng.com:26286/v1
game-static-v3-89bcff66d-4blw9 =========== 10.100.5.56
[root@master01 test]# curl url.xinyouzhumeng.com:26286/v2
game-static-v4-7b499d74bb-6b7fn =========== 10.100.5.57
[root@master01 test]# curl url.xinyouzhumeng.com:26286/v2
game-static-v4-7b499d74bb-4brth =========== 10.100.30.115
[root@master01 test]# curl url.xinyouzhumeng.com:26286/v2
game-static-v4-7b499d74bb-6b7fn =========== 10.100.5.57
[root@master01 test]# curl url.xinyouzhumeng.com:26286/v2
game-static-v4-7b499d74bb-4brth =========== 10.100.30.115
1.3 映射https
1.3.1创建个证书
[root@master01 test]# openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=gam.xinyouzhumeng.com"
..........+...+.....+......+.+.....+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*....+.+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*..+...+............+...+...+.................+..........+..+.........+....+......+.........+.....+......+.......+.....+...+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
......+.+..+.+...........+....+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*.+.........+.+.....+....+.....+....+.........+..+...+............+......+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*..+...........+..........+..+...+....+...+..+......+...............+.........+...............+.+...............+..+....+.....+...+.+...........+.+...+......+...+..+..........+......+............+.....+............+......+.......+...........+....+...........+.........+......+......+..........+.....+.+...+..+............+.+...........+...+...+...+....+.....+...+....+......+...+........................+...............+........+.......+.....+.......+........+.+.................+.........+.+..+......................+........+......+....+....................+...+.............+......+...........+...+....+...........+.......+...+.....+.+........+...+...+......+.....................+.......+......+..+..........+..+......+.+...+.....+......+.+......+...+..+...............+..................+..........+.........+.....+.+.....+.......+...+.....+......+..................+......+.+...+..+......+.......+..............................+.....+.......+......+..+..........+............+......+........+......+.+........+.+...+...+...+..+.........+.+...+......+...+......+..+....+...+........+...+.+.....+....+............+........+.+......+..+...+...+....+..+......+...+......+....+......+.....+...+......+.......+...+.........+...+........+.+......+...+......+...+........+.............+..+.........+....+..+....+...+........+........................+.+..+.+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-----
[root@master01 test]# ls
deplourl.yam ingurl.yam tls.crt tls.key
1.3.2 将证书文件以secrets形式存储
kubectl create secret tls ca-secret --cert=tls.crt --key=tls.key
secret/ca-secret created
[root@master01 test]# kubectl get secrets ca-secret
NAME TYPE DATA AGE
ca-secret kubernetes.io/tls 2 6s
[root@master01 test]# kubectl delete -f ingurl.yam
ingress.networking.k8s.io "ingress-uri" deleted
[root@master01 test]#
#配置
[root@master01 test]# cat deplourl.yam
apiVersion: apps/v1
kind: Deployment
metadata:
name: game-static-v3
labels:
app: game-static
spec:
replicas: 2
selector:
matchLabels:
app: game-static-v3
template:
metadata:
labels:
app: game-static-v3
spec:
volumes:
- name: data
emptyDir: {}
- name: dt
hostPath:
path: /etc/localtime
initContainers:
- name: i1
image: hb.aixxw.xin:8444/gamehtml/testgame:v0.1
command:
- /bin/sh
- -c
- echo ${pod_name} =========== ${pod_ip} >> /data/code/index.html
env:
- name: pod_name
valueFrom:
fieldRef:
fieldPath: metadata.name
- name: pod_ip
valueFrom:
fieldRef:
fieldPath: status.podIP
volumeMounts:
- name: data
mountPath: /data/code
- name: dt
mountPath: /etc/localtime
containers:
- name: c3
image: hb.aixxw.xin:8444/gamehtml/testgame:v0.1
command:
- /bin/sh
- -c
- |
sed -i 's/listen 8090;/listen 0.0.0.0:8090;/g' /etc/nginx/nginx.conf
sed -i 's/server_name localhost;/server_name _;/g' /etc/nginx/nginx.conf
nginx -g "daemon off;"
ports:
- containerPort: 8090
protocol: TCP
volumeMounts:
- name: data
mountPath: /data/code/
- name: dt
mountPath: /etc/localtime
---
apiVersion: v1
kind: Service
metadata:
name: game-static-svc-v3
spec:
selector:
app: game-static-v3
type: NodePort
ports:
- port: 8093
targetPort: 8090
nodePort: 30893
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: game-static-v4
labels:
app: game-static
spec:
replicas: 2
selector:
matchLabels:
app: game-static-v4
template:
metadata:
labels:
app: game-static-v4
spec:
volumes:
- name: data
emptyDir: {}
- name: dt
hostPath:
path: /etc/localtime
initContainers:
- name: i1
image: hb.aixxw.xin:8444/gamehtml/testgame:v0.1
command:
- /bin/sh
- -c
- echo ${pod_name} =========== ${pod_ip} >> /data/code/index.html
env:
- name: pod_name
valueFrom:
fieldRef:
fieldPath: metadata.name
- name: pod_ip
valueFrom:
fieldRef:
fieldPath: status.podIP
volumeMounts:
- name: data
mountPath: /data/code
- name: dt
mountPath: /etc/localtime
containers:
- name: c4
image: hb.aixxw.xin:8444/gamehtml/testgame:v0.1
command:
- /bin/sh
- -c
- |
sed -i 's/listen 8090;/listen 0.0.0.0:8090;/g' /etc/nginx/nginx.conf
sed -i 's/server_name localhost;/server_name _;/g' /etc/nginx/nginx.conf
nginx -g "daemon off;"
ports:
- containerPort: 8090
protocol: TCP
volumeMounts:
- name: data
mountPath: /data/code/
- name: dt
mountPath: /etc/localtime
---
apiVersion: v1
kind: Service
metadata:
name: game-static-svc-v4
spec:
selector:
app: game-static-v4
type: NodePort
ports:
- port: 8094
targetPort: 8090
nodePort: 30894
[root@master01 test]# cat httpsingurl.yam
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-https
labels:
app: game-static
env: test
version: v1
annotations:
traefik.ingress.kubernetes.io/router.middlewares: default-redirect-https@kubernetescrd
traefik.ingress.kubernetes.io/router.tls: "true"
traefik.ingress.kubernetes.io/router.tls.minVersion: "VersionTLS12"
traefik.ingress.kubernetes.io/router.tls.sessionTimeout: "86400s"
traefik.ingress.kubernetes.io/service.timeout: "30s"
traefik.ingress.kubernetes.io/service.idleTimeout: "60s"
kubernetes.io/description:
spec:
ingressClassName: traefik-server
rules:
- host: www.xinyouzhumeng.com
http:
paths:
- path: /v1
pathType: Prefix
backend:
service:
name: game-static-svc-v3
port:
number: 8093
- path: /v2
pathType: Prefix
backend:
service:
name: game-static-svc-v4
port:
number: 8094
tls:
- hosts:
- www.xinyouzhumeng.com
secretName: ca-secret
启动
[root@master01 test]# kubectl apply -f httpsingurl.yam
ingress.networking.k8s.io/ingress-https created
#记得添加hosts解析
www.xinyouzhumeng.com
#查看
[root@master01 test]# kubectl get ingress ingress-https
NAME CLASS HOSTS ADDRESS PORTS AGE
ingress-https traefik-server www.xinyouzhumeng.com 80, 443 7m38s
#测试http
[root@master01 test]# curl www.xinyouzhumeng.com:26286/v1
game-static-v3-5fdbfdff99-rmt9w =========== 10.100.5.60
# 测试https
[root@master01 test]# curl -k https://www.xinyouzhumeng.com:30700/v1 --header "Host: www.xinyouzhumeng.com"
game-static-v3-5fdbfdff99-269ch =========== 10.100.30.119
1.4 Dashboard界面配置
1.4.1 修改配置
[root@master01 helm-charts]# cd /opt/k8s/add-ons/helm-charts
[root@master01 helm-charts]# ls
traefik whelm-linux
[root@master01 helm-charts]# vim traefik/values.yaml -n 210
..............
..............
# @default -- See _values.yaml_
ingressRoute:
dashboard:
# -- Create an IngressRoute for the dashboard
# enabled: false
enabled: true
insecure: true
............
............
1.4.2 heml重新生成
helm -n traefik uninstall traefik-server
helm -n traefik install traefik-server traefik
[root@master01 test]# kubectl get pods -A -o wide | grep traefik
traefik traefik-server-69497fcd6f-q7jlg 1/1 Running 0 37m 10.100.5.63 worker01 <none> <none>
[root@master01 test]# kubectl get pods,svc -A -o wide | grep traefik
traefik pod/traefik-server-69497fcd6f-q7jlg 1/1 Running 0 37m 10.100.5.63 worker01 <none> <none>
traefik service/traefik-server NodePort 10.200.247.42 <none> 80:31889/TCP,443:20902/TCP 37m app.kubernetes.io/instance=traefik-server-traefik,app.kubernetes.io/name=traefik
[root@master01 test]#
1.4.3 配置ingress
[root@master01 test]# cat traefik-dashboard.yam
apiVersion: v1
kind: Service
metadata:
name: svc-traefik-server
namespace: traefik
spec:
selector:
app.kubernetes.io/instance: traefik-server-traefik
type: NodePort
ports:
- port: 8080
targetPort: 8080
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-traefik-server
namespace: traefik
spec:
ingressClassName: traefik-server
rules:
- host: traefik.dashboard.com
http:
paths:
- pathType: Prefix
path: /dashboard
backend:
service:
name: svc-traefik-server
port:
number: 8080
- pathType: Prefix
path: /api
backend:
service:
name: svc-traefik-server
port:
number: 8080
1.4.4 启动测试
[root@master01 test]# kubectl apply -f traefik-dashboard.yam
service/svc-traefik-server created
ingress.networking.k8s.io/ingress-traefik-server created
[root@master01 test]# kubectl get svc,ingress -n traefik | grep traefik-server
service/svc-traefik-server NodePort 10.200.176.87 <none> 8080:46572/TCP 4s
service/traefik-server NodePort 10.200.247.42 <none> 80:31889/TCP,443:20902/TCP 27m
ingress.networking.k8s.io/ingress-traefik-server traefik-server traefik.dashboard.com 80 4s
[root@master01 test]# curl http://traefik.dashboard.com:31889/dashboard/
<!DOCTYPE html>
<html lang="en">
<head>
<script>
window.APIUrl = "/api/"
</script>
<meta charset="utf-8" />
<link rel="icon" href="./favicon.ico" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="theme-color" content="#ddee6d" />
<meta
name="description"
content="Traefik Proxy"
/>
<!--
manifest.json provides metadata used when your web app is installed on a
user's mobile device or desktop. See https://developers.google.com/web/fundamentals/web-app-manifest/
-->
<link rel="manifest" href="./manifest.json" />
<title>Traefik Proxy</title>
<script type="module" crossorigin src="./assets/index-Cn5NaOnq.js"></script>
</head>
<body>
<noscript>You need to enable JavaScript to run this app.</noscript>
<div id="root"></div>
</body>
</html>
二. 使用Traefik IngressRoute代理
2.1 基于IngressRoute暴露Traefik的Dashboard
2.1.1 先看下有没运行中相同域名避免解析冲突
[root@master01 ~]# kubectl -n traefik get ingress ingress-traefik-server
NAME CLASS HOSTS ADDRESS PORTS AGE
ingress-traefik-server traefik-server traefik.dashboard.com 80 4d15h
[root@master01 ~]# kubectl -n traefik describe ingress ingress-traefik-server
Name: ingress-traefik-server
Labels: <none>
Namespace: traefik
Address:
Ingress Class: traefik-server
Default backend: <default>
Rules:
Host Path Backends
---- ---- --------
traefik.dashboard.com
/dashboard svc-traefik-server:8080 ()
/api svc-traefik-server:8080 ()
Annotations: <none>
Events: <none>
2.1.2 编写资源清单
[root@master01 routeIngress]# cat ir-traefik-dashboard.yaml
apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
name: ingressroute-traefik
namespace: traefik
spec:
entryPoints:
- web
# 配置路由
routes:
- match: Host(`rou.aixxw.xin`) && PathPrefix(`/`)
kind: Rule
services:
- name: svc-traefik-server
port: 8080
[root@master01 routeIngress]#
记得添加hosts解析
...
10.0.250.6 rou.aixxw.xin
10.0.250.7 rou.aixxw.xin
...
kubectl apply -f ir-traefik-dashboard.yaml
[root@master01 routeIngress]# kubectl get ingressroute -n traefik
NAME AGE
ingressroute-traefik 30s
traefik-server-dashboard 4d16h
[root@master01 routeIngress]# kubectl describe ingressroute ingressroute-traefik -n traefik
Name: ingressroute-traefik
Namespace: traefik
Labels: <none>
Annotations: <none>
API Version: traefik.io/v1alpha1
Kind: IngressRoute
Metadata:
Creation Timestamp: 2026-02-13T08:34:58Z
Generation: 1
Resource Version: 8881311
UID: d007ff60-6058-4766-8e8c-a1f5ad77491b
Spec:
Entry Points:
web
Routes:
Kind: Rule
Match: Host(`rou.aixxw.xin`) && PathPrefix(`/`)
Services:
Name: svc-traefik-server
Port: 8080
Events: <none>
oot@master01 routeIngress]# kubectl get svc -A |grep traefik
traefik svc-traefik-server NodePort 10.200.176.87 <none> 8080:46572/TCP 4d16h
traefik traefik-server NodePort 10.200.247.42 <none> 80:31889/TCP,443:20902/TCP 4d16h
2.1.3 测试
[root@master01 routeIngress]# curl rou.aixxw.xin:46572/dashboard/
<!DOCTYPE html>
<html lang="en">
<head>
<script>
window.APIUrl = "/api/"
</script>
<meta charset="utf-8" />
<link rel="icon" href="./favicon.ico" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="theme-color" content="#ddee6d" />
<meta
name="description"
content="Traefik Proxy"
/>
<!--
manifest.json provides metadata used when your web app is installed on a
user's mobile device or desktop. See https://developers.google.com/web/fundamentals/web-app-manifest/
-->
<link rel="manifest" href="./manifest.json" />
<title>Traefik Proxy</title>
<script type="module" crossorigin src="./assets/index-Cn5NaOnq.js"></script>
</head>
<body>
<noscript>You need to enable JavaScript to run this app.</noscript>
<div id="root"></div>
</body>
</html>
[root@master01 routeIngress]#
2.2 IngressRoute暴露whoami
2.2.1先下载whoami镜像
链接:https://pan.baidu.com/s/19NeohIsUTpMPD-QAOAvdLw?pwd=kj3m
先解压dockerwho.tar.gz (其他是二进制文件安装的这里用镜像)
得到三个文件
whoamiudp_v0.2.3.tar
whoami_v1.11.tar
whoamitcp_v0.3.0.tar
再分别
分别导入你的仓库(这边我用的是hb仓库感兴趣的可以去看看)
docker
docker load -i whoamiudp_v0.2.3.tar
docker load -i whoami_v1.11.tar
docker load -i whoamitcp_v0.3.0.tar
4.2.2 编写deploy启动
[root@master01 whoamd64]# cat deploy-svc-whoami.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: deploy-whoami
spec:
replicas: 2
selector:
matchLabels:
apps: whoami
template:
metadata:
labels:
apps: whoami
spec:
containers:
- name: whoami
image: hb.aixxw.xin:8444/linux-ingress/whoami:v1.11
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: deploy-whoamitcp
spec:
replicas: 2
selector:
matchLabels:
apps: whoamitcp
template:
metadata:
labels:
apps: whoamitcp
spec:
containers:
- name: whoamitcp
image: hb.aixxw.xin:8444/linux-ingress/whoamitcp:v0.3.0
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8080
protocol: TCP
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: deploy-whoamiudp
spec:
replicas: 2
selector:
matchLabels:
apps: whoamiudp
template:
metadata:
labels:
apps: whoamiudp
spec:
containers:
- name: whoamiudp
image: hb.aixxw.xin:8444/linux-ingress/whoamiudp:v0.2.3
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8080
protocol: UDP
---
apiVersion: v1
kind: Service
metadata:
name: svc-whoami
spec:
ports:
- name: http
port: 80
selector:
apps: whoami
---
apiVersion: v1
kind: Service
metadata:
name: svc-whoamitcp
spec:
ports:
- name: tcp
port: 8080
selector:
apps: whoamitcp
---
apiVersion: v1
kind: Service
metadata:
name: svc-whoamiudp
spec:
ports:
- name: udp
port: 8080
protocol: UDP
selector:
apps: whoamiudp
启动
kubectl apply -f deploy-svc-whoami.yaml
[root@master01 whoamd64]# kubectl get pods,svc -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod/deploy-whoami-7dd565f974-9682b 1/1 Running 0 2m5s 10.100.5.9 worker01 <none> <none>
pod/deploy-whoami-7dd565f974-9q6cz 1/1 Running 0 2m5s 10.100.30.127 worker02 <none> <none>
pod/deploy-whoamitcp-cf66d64c9-6n78t 1/1 Running 0 2m5s 10.100.5.10 worker01 <none> <none>
pod/deploy-whoamitcp-cf66d64c9-zvmfn 1/1 Running 0 2m5s 10.100.30.126 worker02 <none> <none>
pod/deploy-whoamiudp-78cb657f57-2dbfs 1/1 Running 0 2m5s 10.100.30.67 worker02 <none> <none>
pod/deploy-whoamiudp-78cb657f57-xhgcr 1/1 Running 0 2m5s 10.100.5.1 worker01 <none> <none>
4.2.3 创建IngressRoute代理
#添加ingress解析
#whoami
[root@master01 whoamd64]# cat whoami-ir.yaml
apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
name: ingressroute-whoami
namespace: default
spec:
entryPoints:
- web
routes:
- match: Host(`w.aixxw.xin`) && PathPrefix(`/`)
kind: Rule
services:
- name: svc-whoami
port: 80
[root@master01 whoamd64]#
kubectl apply -f whoami-ir.yaml
kubectl get svc traefik-server -n traefik
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
traefik-server NodePort 10.200.247.42 <none> 80:31889/TCP,443:20902/TCP 4d20h
[root@master01 whoamd64]# curl w.aixxw.xin:31889
Hostname: deploy-whoami-7dd565f974-9682b
IP: 127.0.0.1
IP: ::1
IP: 10.100.5.9
IP: fe80::4be:50ff:fe65:ea07
RemoteAddr: 10.100.5.63:48458
GET / HTTP/1.1
Host: w.aixxw.xin:31889
User-Agent: curl/7.81.0
Accept: */*
Accept-Encoding: gzip
X-Forwarded-For: 10.0.250.6
X-Forwarded-Host: w.aixxw.xin:31889
X-Forwarded-Port: 31889
X-Forwarded-Proto: http
X-Forwarded-Server: traefik-server-69497fcd6f-q7jlg
X-Real-Ip: 10.0.250.6
[root@master01 whoamd64]# ping w.aixxw.xin -c 2
PING worker01 (10.0.250.6) 56(84) bytes of data.
64 bytes from worker01 (10.0.250.6): icmp_seq=1 ttl=64 time=1.53 ms
64 bytes from worker01 (10.0.250.6): icmp_seq=2 ttl=64 time=0.913 ms
--- worker01 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1002ms
rtt min/avg/max/mdev = 0.913/1.222/1.531/0.309 ms
ok完美执行
2.3 IngressRoute暴露whoami tls证书版本
2.3.1 配置证书
方案一
使用openssl自建证书
openssl req -x509 -nodes -days 365 --newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=w.aixxw.xin"
方案二 (我集群是k8s就使这个了)
k8s生成证书
[root@master01 pki]# pwd
/k8s/certs/pki
cat whoami-csr.json
{
"CN": "w.aixxw.xin",
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "Beijing",
"L": "Beijing",
"O": "whoami",
"OU": "whoami-manual"
}
]
}
签发whoami证书
[root@master01 pki]# cfssl gencert \
-ca=/k8s/certs/kubernetes/k8s-ca.pem \
-ca-key=/k8s/certs/kubernetes/k8s-ca-key.pem \
-config=k8s-ca-config.json \
--hostname=w.aixxw.xin,10.0.250.6,10.0.250.7,10.0.250.8,10.0.250.9,10.0.250.2 \
--profile=kubernetes \
whoami-csr.json | cfssljson -bare /k8s/certs/kubernetes/whoami
2026/02/13 21:39:15 [INFO] generate received request
2026/02/13 21:39:15 [INFO] received CSR
2026/02/13 21:39:15 [INFO] generating key: rsa-2048
2026/02/13 21:39:16 [INFO] encoded CSR
2026/02/13 21:39:16 [INFO] signed certificate with serial number 268583251639372085577287054414435225436650305842
cd /k8s/certs/kubernetes/
[root@master01 kubernetes]# ll ./whoami*
-rw------- 1 root root 1675 Feb 13 21:39 ./whoami-key.pem
-rw-r--r-- 1 root root 1110 Feb 13 21:39 ./whoami.csr
-rw-r--r-- 1 root root 1509 Feb 13 21:39 ./whoami.pem
2.3.2 放入secrets资源
[root@master01 kubernetes]# kubectl create secret tls whoami-tls --cert=/k8s/certs/kubernetes/whoami.pem --key=/k8s/certs/kubernetes/whoami-key.pem
secret/whoami-tls created
查看下
[root@master01 kubernetes]# kubectl get secrets whoami-tls
NAME TYPE DATA AGE
whoami-tls kubernetes.io/tls 2 12s
[root@master01 whoamd64]# kubectl apply -f deploy-svc-whoami-https.yaml
ingressroute.traefik.io/ingressroute-whoami-https created
提示:
记得hosts解析
[root@master01 whoamd64]# curl w.aixxw.xin:31889
Hostname: deploy-whoami-7dd565f974-9682b
IP: 127.0.0.1
IP: ::1
IP: 10.100.5.9
IP: fe80::4be:50ff:fe65:ea07
RemoteAddr: 10.100.5.63:48460
GET / HTTP/1.1
Host: w.aixxw.xin:31889
User-Agent: curl/7.81.0
Accept: */*
Accept-Encoding: gzip
X-Forwarded-For: 10.0.250.6
X-Forwarded-Host: w.aixxw.xin:31889
X-Forwarded-Port: 31889
X-Forwarded-Proto: http
X-Forwarded-Server: traefik-server-69497fcd6f-q7jlg
X-Real-Ip: 10.0.250.6
okok大家看到这里辛苦大家啦,文章就暂时结束啦
Traefilk就基本使用方式基本都给了详细的实现方式。
想要了解更多进阶功能我们下篇再讲
下篇文章我们讲TCP 和UDP 转发方式
以及 Traefik更多的进阶功能,兄弟们下篇再见啦
更多推荐
所有评论(0)