#{ commentsCount } comment.
Kubernetes环境Traefik部署与应用
发布于2021-09-11
,最后编辑于2024-10-25
,全文约3054
字,阅读时间约7
分钟。
Kubernetes Traefik Ingress Helm
更新记录
-
2021-09-17
- 部署
Traefik
时禁用默认Dashboard
入口规则;
- 部署
-
2021-09-30
Traefik
版本由v2.5.1
更新至v2.5.3
;Traefik Helm Chart
版本由v10.3.2
更新至v10.3.6
;- 修复一些配置文件中的字符转义错误;
-
2021-10-30
Traefik Helm Chart
版本由v10.3.2
更新至v10.6.0
;- 修复创建TLS证书命名空间配置错误;
-
2021-11-20
Traefik
版本由v2.5.3
更新至v2.5.4
;Traefik Helm Chart
版本由v10.3.2
更新至v10.6.2
;
-
2022-04-30
Traefik
版本由v2.5.4
更新至v2.6.3
;Traefik Helm Chart
版本由v10.6.2
更新至v10.19.4
;
-
2022-05-20
Traefik
版本由v2.6.3
更新至v2.6.6
;Traefik Helm Chart
版本由v10.19.4
更新至v10.19.5
;
-
2022-05-29
Traefik
版本由v2.6.6
更新至v2.7.0
;Traefik Helm Chart
版本由v10.19.5
更新至v10.20.0
;
-
2022-06-23
Traefik
版本由v2.7.0
更新至v2.7.1
;Traefik Helm Chart
版本由v10.20.0
更新至v10.22.0
;
-
2022-07-09
Traefik
版本由v2.7.1
更新至v2.8.0
;Traefik Helm Chart
版本由v10.22.0
更新至v10.24.0
;
-
2022-08-14
- 安装
Traefik
时创建并设置默认IngressClass
;
- 安装
-
2022-09-06
Traefik
版本由v2.8.0
更新至v2.8.4
;Traefik Helm Chart
版本由v10.24.0
更新至v10.24.2
;- 启用保留客户端IP地址;
-
2022-09-17
Traefik
版本由v2.8.5
更新至v2.8.7
;Traefik Helm Chart
版本由v10.24.3
更新至v10.30.1
;
-
2022-10-14
Traefik
版本由v2.8.7
更新至v2.9.1
;Traefik Helm Chart
版本由v10.30.1
更新至v15.0.0
;
-
2022-10-20
Traefik Helm Chart
版本由v15.0.0
更新至v16.1.0
;
-
2022-11-08
Traefik
版本由v2.9.1
更新至v2.9.4
;Traefik Helm Chart
版本由v16.1.0
更新至v19.0.3
;
-
2022-11-12
Traefik Helm Chart
版本由v19.0.3
更新至v20.1.1
;
-
2022-11-18
Traefik Helm Chart
版本由v20.1.1
更新至v20.3.0
;
-
2022-12-08
Traefik
版本由v2.9.5
更新至v2.9.6
;Traefik Helm Chart
版本由v20.6.0
更新至v20.8.0
;
-
2023-02-11
- 添加
cert-manager
证书管理方案文章引用; Traefik Helm Chart
版本由v20.8.0
更新至v21.0.0
;
- 添加
-
2023-02-18
Traefik
版本由v2.9.6
更新至v2.9.7
;Traefik Helm Chart
版本由v21.0.0
更新至v21.1.0
;
-
2023-03-03
Traefik
版本由v2.9.7
更新至v2.9.8
;
-
2023-03-22
Traefik Helm Chart
版本由v21.1.0
更新至v21.2.0
;
-
2023-03-27
Traefik
版本由v2.9.8
更新至v2.9.9
;
-
2023-04-14
Traefik
版本由v2.9.9
更新至v2.9.10
;Traefik Helm Chart
版本由v21.2.0
更新至v22.1.0
;
-
2023-05-03
Traefik
版本由v2.9.10
更新至v2.10.1
;Traefik Helm Chart
版本由v22.1.0
更新至v23.0.1
;
-
2023-06-24
Traefik
版本由v2.10.1
更新至v2.10.3
;Traefik Helm Chart
版本由v23.0.1
更新至v23.1.0
;
-
2023-08-08
Traefik
版本由v2.10.3
更新至v2.10.4
;Traefik Helm Chart
版本由v23.1.0
更新至v23.2.0
;
-
2023-09-01
Traefik Helm Chart
版本由v23.2.0
更新至v24.0.0
;
-
2023-11-18
Traefik
版本由v2.10.4
更新至v2.10.5
;Traefik Helm Chart
版本由v24.0.0
更新至v25.0.0
;
-
2024-01-01
Traefik
版本由v2.10.5
更新至v2.10.7
;Traefik Helm Chart
版本由v25.0.0
更新至v26.0.0
;
-
2024-03-31
Traefik
版本由v2.10.7
更新至v2.11.0
;Traefik Helm Chart
版本由v26.0.0
更新至v26.1.0
;
-
2024-04-28
Traefik
版本由v2.11.0
更新至v2.11.2
;Traefik Helm Chart
版本由v26.1.0
更新至v27.0.2
;
-
2024-05-02
Traefik
版本由v2.11.2
更新至v3.0.0
;Traefik Helm Chart
版本由v27.0.2
更新至v28.0.0
;
-
2024-08-27
Traefik
版本由v3.0.0
更新至v3.1.2
;Traefik Helm Chart
版本由v28.0.0
更新至v30.1.0
;
-
2024-09-29
Traefik
版本由v3.1.2
更新至v3.1.4
;Traefik Helm Chart
版本由v30.1.0
更新至v32.0.0
;
概述¶
本文用于整理基于Kubernetes环境的Traefik部署与应用,实现Ingress Controller、七层/四层反向代理等功能。
随着各相关组件版本的更新,笔者将在验证通过后对本文进行补充和更新,请参考更新记录。
本次演练环境为Kubernetes集群环境,环境配置可参考笔者另一篇笔记《Kubernetes集群部署笔记》。
组件版本¶
-
Traefik
v3.1.4
-
Traefik Helm Chart
v32.0.0
配置过程¶
安装Traefik¶
-
添加Helm仓库
1helm repo add traefik https://helm.traefik.io/traefik 2helm repo update traefik
-
安装Traefik
本次演练中将
traefik
安装至kube-system
命名空间,可根据需要替换。1# image.tag=v3.1.4 设置Traefik容器镜像版本 2# image.registry=quay.io 设置Traefik容器镜像服务 3# image.repository=choral-k8s/traefik 设置Traefik容器镜像仓库 4# deployment.replicas=3 设置Traefik部署副本数量 5# ingressRoute.dashboard.enabled=false 禁用默认Dashboard入口规则(将在后续步骤中手动创建) 6# ingressClass.enabled=true 创建IngressClass 7# ingressClass.isDefaultClass=true 设置为默认IngressClass 8# service.single=false 为TCP和UDP端口分别创建负载均衡服务 9# service.spec.externalTrafficPolicy=Local 启用保留客户端IP地址。注意,这可能仅适合笔者演练环境。参见: 10# https://metallb.universe.tf/usage/#traffic-policies 11# https://kubernetes.io/docs/tasks/access-application-cluster/create-external-load-balancer/#preserving-the-client-source-ip 12# service.annotationsTCP."metallb\.universe\.tf/loadBalancerIPs"=10.0.0.201 设置TCP服务负载均衡地址 13# entryPoints.*.proxyProtocol.trustedIPs=10.0.0.0/24 为信任的IP地址启用代理协议 14helm upgrade --install --namespace kube-system \ 15 --set image.tag=v3.1.4 \ 16 --set image.registry=quay.io \ 17 --set image.repository=choral-k8s/traefik \ 18 --set deployment.replicas=3 \ 19 --set ingressRoute.dashboard.enabled=false \ 20 --set ingressClass.enabled=true \ 21 --set ingressClass.isDefaultClass=true \ 22 --set service.single=false \ 23 --set service.spec.externalTrafficPolicy=Local \ 24 --set service.annotationsTCP."metallb\.universe\.tf/loadBalancerIPs"=10.0.0.201 \ 25 --set additionalArguments[0]=--entryPoints.web.proxyProtocol.trustedIPs=10.0.0.0/24 \ 26 --set additionalArguments[1]=--entryPoints.websecure.proxyProtocol.trustedIPs=10.0.0.0/24 \ 27 traefik traefik/traefik --version v32.0.0
-
其他准备工作
获取
traefik
服务的负载均衡器地址。执行该命令,记录返回的EXTERNAL-IP
地址备用。本次演练环境中,已将local.choral.io
和*.local.choral.io
指向该地址。1kubectl get svc traefik -n kube-system
创建一个用于部署演练用对象的命名空间。本次演练中使用
apps-choral
命名空间,可根据需要替换。1kubectl create namespace apps-choral
部署Dashboard¶
-
创建一个
IngressRoute
,用于配置api
和dashboard
的入口规则。本次演练中,使用
traefik.local.choral.io
域名访问Dashboard
,可根据需要替换。1cat <<EOF | kubectl apply -f - > /dev/null 2apiVersion: traefik.io/v1alpha1 3kind: IngressRoute 4metadata: 5 name: traefik-dashboard 6 namespace: apps-choral 7spec: 8 entryPoints: 9 - web 10 routes: 11 - match: Host(\`traefik.local.choral.io\`) && (PathPrefix(\`/dashboard\`) || PathPrefix(\`/api\`)) 12 kind: Rule 13 services: 14 - name: api@internal 15 kind: TraefikService 16EOF
-
启用BasicAuth认证
首先,创建一个用于保存用户名和密码的
Secret
,其中的users
字段内容可使用htpassword
工具生成。本次演练中,认证username
和password
都是admin
。1cat <<EOF | kubectl apply -f - > /dev/null 2apiVersion: v1 3kind: Secret 4metadata: 5 name: traefik-basicauth-secret 6 namespace: apps-choral 7data: 8 users: |2 # htpasswd -nb admin admin | openssl base64 9 YWRtaW46e1NIQX0wRFBpS3VOSXJyVm1EOElVQ3V3MWhReE5xWmM9Cg== 10EOF
创建一个
Traefik
中间件,用于对请求启用BasicAuth
认证。1cat <<EOF | kubectl apply -f - > /dev/null 2apiVersion: traefik.io/v1alpha1 3kind: Middleware 4metadata: 5 name: traefik-basicauth 6 namespace: apps-choral 7spec: 8 basicAuth: 9 realm: traefik.local.choral.io 10 secret: traefik-basicauth-secret 11EOF
更新
Dashboard
的IngressRoute
,启用BasicAuth
中间件。1cat <<EOF | kubectl apply -f - > /dev/null 2apiVersion: traefik.io/v1alpha1 3kind: IngressRoute 4metadata: 5 name: traefik-dashboard 6 namespace: apps-choral 7spec: 8 entryPoints: 9 - web 10 routes: 11 - match: Host(\`traefik.local.choral.io\`) && (PathPrefix(\`/dashboard\`) || PathPrefix(\`/api\`)) 12 kind: Rule 13 services: 14 - name: api@internal 15 kind: TraefikService 16 middlewares: 17 - name: traefik-basicauth 18EOF
七层反向代理¶
HTTP应用示例¶
-
部署
whoami
应用创建
Deployment
,部署whoami
应用。1cat <<EOF | kubectl apply -f - > /dev/null 2apiVersion: apps/v1 3kind: Deployment 4metadata: 5 name: whoami 6 namespace: apps-choral 7spec: 8 replicas: 3 9 selector: 10 matchLabels: 11 app: whoami 12 template: 13 metadata: 14 labels: 15 app: whoami 16 spec: 17 containers: 18 - name: whoami 19 image: traefik/whoami:latest 20 imagePullPolicy: IfNotPresent 21 ports: 22 - containerPort: 80 23EOF
创建一个用于访问
whoami
应用的服务。1cat <<EOF | kubectl apply -f - > /dev/null 2apiVersion: v1 3kind: Service 4metadata: 5 name: whoami 6 namespace: apps-choral 7spec: 8 type: ClusterIP 9 ports: 10 - protocol: TCP 11 port: 80 12 selector: 13 app: whoami 14EOF
创建一个
Ingress
,用于配置whoami
应用的入口规则。1cat <<EOF | kubectl apply -f - > /dev/null 2apiVersion: networking.k8s.io/v1 3kind: Ingress 4metadata: 5 name: whoami 6 namespace: apps-choral 7 annotations: 8 traefik.ingress.kubernetes.io/router.entrypoints: web 9spec: 10 rules: 11 - host: local.choral.io 12 http: 13 paths: 14 - path: / 15 pathType: Prefix 16 backend: 17 service: 18 name: whoami 19 port: 20 number: 80 21EOF
启用TLS(HTTPS)¶
本次演练使用静态证书配置TLS,该证书被手动创建,应用于local.choral.io
和*.local.choral.io
域名。
有关自动证书管理功能的实现,可参考笔者另一篇笔记《Kubernetes环境cert-manager部署与应用》。
-
更新Traefik运行参数
1# additionalArguments[2]=--entrypoints.websecure.http.tls 为websecure默认启用TLS 2# ports.web.redirectTo.port=websecure 启用web跳转至websecure 3helm upgrade --install --namespace kube-system \ 4 --set image.tag=v3.1.4 \ 5 --set image.registry=quay.io \ 6 --set image.repository=choral-k8s/traefik \ 7 --set deployment.replicas=3 \ 8 --set ingressRoute.dashboard.enabled=false \ 9 --set ingressClass.enabled=true \ 10 --set ingressClass.isDefaultClass=true \ 11 --set service.single=false \ 12 --set service.spec.externalTrafficPolicy=Local \ 13 --set service.annotationsTCP."metallb\.universe\.tf/loadBalancerIPs"=10.0.0.201 \ 14 --set additionalArguments[0]=--entryPoints.web.proxyProtocol.trustedIPs=10.0.0.0/24 \ 15 --set additionalArguments[1]=--entryPoints.websecure.proxyProtocol.trustedIPs=10.0.0.0/24 \ 16 --set additionalArguments[2]=--entrypoints.websecure.http.tls=true \ 17 --set ports.web.redirectTo.port=websecure \ 18 traefik traefik/traefik --version v32.0.0
-
创建TLS证书Secret
从已准备好的证书
key
文件和crt
文件创建Secret
。1kubectl create secret tls local-choral-io-tls -n apps-choral \ 2 --key=local.choral.io.key --cert=local.choral.io.crt
-
更新
Dashboard
的IngressRoute
更新
Dashboard
的IngressRoute
,启用TLS
配置。1cat <<EOF | kubectl apply -f - > /dev/null 2apiVersion: traefik.io/v1alpha1 3kind: IngressRoute 4metadata: 5 name: traefik-dashboard 6 namespace: apps-choral 7spec: 8 entryPoints: 9 - websecure 10 routes: 11 - match: Host(\`traefik.local.choral.io\`) && (PathPrefix(\`/dashboard\`) || PathPrefix(\`/api\`)) 12 kind: Rule 13 services: 14 - name: api@internal 15 kind: TraefikService 16 middlewares: 17 - name: traefik-basicauth 18 tls: 19 secretName: local-choral-io-tls 20EOF
-
更新
whoami
的Ingress
更新
whoami
的Ingress
,启用TLS
配置。1cat <<EOF | kubectl apply -f - > /dev/null 2apiVersion: networking.k8s.io/v1 3kind: Ingress 4metadata: 5 name: whoami 6 namespace: apps-choral 7 annotations: 8 traefik.ingress.kubernetes.io/router.entrypoints: websecure 9spec: 10 tls: 11 - secretName: local-choral-io-tls 12 rules: 13 - host: local.choral.io 14 http: 15 paths: 16 - path: / 17 pathType: Prefix 18 backend: 19 service: 20 name: whoami 21 port: 22 number: 80 23EOF
四层反向代理¶
TCP应用示例¶
-
更新Traefik运行参数
更新Traefik运行参数,创建新的
EntryPoint
。1# ports.whoamitcp.protocol=TCP 网络协议 2# ports.whoamitcp.port=8081 监听端口 3# ports.whoamitcp.exposedPort=8081 服务公开端口 4# ports.whoamitcp.expose.default=true 是否暴露端口 5helm upgrade --install --namespace kube-system \ 6 --set image.tag=v3.1.4 \ 7 --set image.registry=quay.io \ 8 --set image.repository=choral-k8s/traefik \ 9 --set deployment.replicas=3 \ 10 --set ingressRoute.dashboard.enabled=false \ 11 --set ingressClass.enabled=true \ 12 --set ingressClass.isDefaultClass=true \ 13 --set service.single=false \ 14 --set service.spec.externalTrafficPolicy=Local \ 15 --set service.annotationsTCP."metallb\.universe\.tf/loadBalancerIPs"=10.0.0.201 \ 16 --set additionalArguments[0]=--entryPoints.web.proxyProtocol.trustedIPs=10.0.0.0/24 \ 17 --set additionalArguments[1]=--entryPoints.websecure.proxyProtocol.trustedIPs=10.0.0.0/24 \ 18 --set additionalArguments[2]=--entrypoints.websecure.http.tls=true \ 19 --set ports.web.redirectTo.port=websecure \ 20 --set ports.whoamitcp.protocol=TCP \ 21 --set ports.whoamitcp.port=8081 \ 22 --set ports.whoamitcp.exposedPort=8081 \ 23 --set ports.whoamitcp.expose.default=true \ 24 traefik traefik/traefik --version v32.0.0
-
部署
whoamitcp
应用创建
Deployment
,部署whoamitcp
应用。1cat <<EOF | kubectl apply -f - > /dev/null 2apiVersion: apps/v1 3kind: Deployment 4metadata: 5 name: whoamitcp 6 namespace: apps-choral 7spec: 8 replicas: 3 9 selector: 10 matchLabels: 11 app: whoamitcp 12 template: 13 metadata: 14 labels: 15 app: whoamitcp 16 spec: 17 containers: 18 - name: whoamitcp 19 image: traefik/whoamitcp:latest 20 imagePullPolicy: IfNotPresent 21 ports: 22 - protocol: TCP 23 containerPort: 8080 24EOF
创建一个用于访问
whoamitcp
应用的服务。1cat <<EOF | kubectl apply -f - > /dev/null 2apiVersion: v1 3kind: Service 4metadata: 5 name: whoamitcp 6 namespace: apps-choral 7spec: 8 type: ClusterIP 9 ports: 10 - protocol: TCP 11 port: 8080 12 selector: 13 app: whoamitcp 14EOF
创建一个
IngressRouteTCP
,用于配置whoamitcp
应用的入口规则。1cat <<EOF | kubectl apply -f - > /dev/null 2apiVersion: traefik.io/v1alpha1 3kind: IngressRouteTCP 4metadata: 5 name: whoamitcp 6 namespace: apps-choral 7spec: 8 entryPoints: 9 - whoamitcp 10 routes: 11 - match: HostSNI(\`*\`) 12 services: 13 - name: whoamitcp 14 port: 8080 15EOF
验证反向代理和服务运行状态。
1# `10.0.0.201`是`traefik`服务的负载均衡器地址(kubectl get svc traefik -n kube-system) 2echo "Hello" | socat - tcp4:10.0.0.201:8081 3# 终端回显如下内容 4Received: Hello
UDP应用示例¶
-
更新Traefik运行参数
更新Traefik运行参数,创建新的
EntryPoint
。1# ports.whoamiudp.protocol=UDP 网络协议 2# ports.whoamiudp.port=8082 监听端口 3# ports.whoamiudp.exposedPort=8082 服务公开端口 4# ports.whoamiudp.expose.default=true 是否暴露端口 5# service.annotationsUDP."metallb\.universe\.tf/loadBalancerIPs"=10.0.0.202 设置UDP服务负载均衡地址 6helm upgrade --install --namespace kube-system \ 7 --set image.tag=v3.1.4 \ 8 --set image.registry=quay.io \ 9 --set image.repository=choral-k8s/traefik \ 10 --set deployment.replicas=3 \ 11 --set ingressRoute.dashboard.enabled=false \ 12 --set ingressClass.enabled=true \ 13 --set ingressClass.isDefaultClass=true \ 14 --set service.single=false \ 15 --set service.spec.externalTrafficPolicy=Local \ 16 --set service.annotationsTCP."metallb\.universe\.tf/loadBalancerIPs"=10.0.0.201 \ 17 --set additionalArguments[0]=--entryPoints.web.proxyProtocol.trustedIPs=10.0.0.0/24 \ 18 --set additionalArguments[1]=--entryPoints.websecure.proxyProtocol.trustedIPs=10.0.0.0/24 \ 19 --set additionalArguments[2]=--entrypoints.websecure.http.tls=true \ 20 --set ports.web.redirectTo.port=websecure \ 21 --set ports.whoamitcp.protocol=TCP \ 22 --set ports.whoamitcp.port=8081 \ 23 --set ports.whoamitcp.exposedPort=8081 \ 24 --set ports.whoamitcp.expose.default=true \ 25 --set ports.whoamiudp.protocol=UDP \ 26 --set ports.whoamiudp.port=8082 \ 27 --set ports.whoamiudp.exposedPort=8082 \ 28 --set ports.whoamiudp.expose.default=true \ 29 --set service.annotationsUDP."metallb\.universe\.tf/loadBalancerIPs"=10.0.0.202 \ 30 traefik traefik/traefik --version v32.0.0
-
部署
whoamiudp
应用创建
Deployment
,部署whoamiudp
应用。1cat <<EOF | kubectl apply -f - > /dev/null 2apiVersion: apps/v1 3kind: Deployment 4metadata: 5 name: whoamiudp 6 namespace: apps-choral 7spec: 8 replicas: 3 9 selector: 10 matchLabels: 11 app: whoamiudp 12 template: 13 metadata: 14 labels: 15 app: whoamiudp 16 spec: 17 containers: 18 - name: whoamiudp 19 image: traefik/whoamiudp:latest 20 imagePullPolicy: IfNotPresent 21 ports: 22 - protocol: UDP 23 containerPort: 8080 24EOF
创建一个用于访问
whoamiudp
应用的服务。1cat <<EOF | kubectl apply -f - > /dev/null 2apiVersion: v1 3kind: Service 4metadata: 5 name: whoamiudp 6 namespace: apps-choral 7spec: 8 type: ClusterIP 9 ports: 10 - protocol: UDP 11 port: 8080 12 selector: 13 app: whoamiudp 14EOF
创建一个
IngressRouteUDP
,用于配置whoamiudp
应用的入口规则。1cat <<EOF | kubectl apply -f - > /dev/null 2apiVersion: traefik.io/v1alpha1 3kind: IngressRouteUDP 4metadata: 5 name: whoamiudp 6 namespace: apps-choral 7spec: 8 entryPoints: 9 - whoamiudp 10 routes: 11 - services: 12 - name: whoamiudp 13 port: 8080 14EOF
验证反向代理和服务运行状态。
1# `10.0.0.202`是`traefik-udp`服务的负载均衡器地址(kubectl get svc traefik-udp -n kube-system) 2echo "Hello" | socat - udp4:10.0.0.202:8082 3# 终端回显如下内容 4Received: Hello