一、概述

Traefik 是一个开源的可以使服务发布变得轻松有趣的边缘路由器。它负责接收你系统的请求,然后使用合适的组件来对这些请求进行处理。

除了众多的功能之外,Traefik 的与众不同之处还在于它会自动发现适合你服务的配置。当 Traefik 在检查你的服务时,会找到服务的相关信息并找到合适的服务来满足对应的请求。

Traefik 兼容所有主流的集群技术,比如 Kubernetes,Docker,Docker Swarm,AWS,Mesos,Marathon,等等;并且可以同时处理多种方式。(甚至可以用于在裸机上运行的比较旧的软件。)

有了Traefik,就不需要维护和同步一个单独的配置文件:一切都会自动、实时地发生(没有重新启动,没有连接中断)。使用Traefik,您可以花时间在系统中开发和部署新特性,而不是配置和维护其工作状态。

二、概念

Edge Router

Traefik 是一个边缘路由器,是你整个平台的大门,拦截并路由每个传入的请求:它知道所有的逻辑和规则,这些规则确定哪些服务处理哪些请求;传统的反向代理需要一个配置文件,其中包含路由到你服务的所有可能路由,而 Traefik 会实时检测服务并自动更新路由规则,可以自动服务发现。

Auto Service Discovery

传统的边缘路由器(或反向代理)需要一个包含到服务的每个可能路由的配置文件,Traefik从服务本身获取它们。

在部署您的服务时,您需要附加一些信息,告诉Traefik服务可以处理的请求的特征。

这意味着在部署服务时,Traefik会立即检测到它并实时更新路由规则。反之亦然:当您从基础设施中删除服务时,路由将相应地消失。

您不再需要创建和同步混杂着IP地址或其他规则的配置文件。

核心概念

  • Providers 用来自动发现平台上的服务,可以是编排工具、容器引擎或者 key-value 存储等,比如 Docker、Kubernetes、File
  • Entrypoints 监听传入的流量(端口等…),是网络入口点,它们定义了接收请求的端口(HTTP 或者 TCP)。
  • Routers 分析请求(host, path, headers, SSL, …),负责将传入请求连接到可以处理这些请求的服务上去。
  • Services 将请求转发给你的应用(load balancing, …),负责配置如何获取最终将处理传入请求的实际服务。
  • Middlewares 中间件,用来修改请求或者根据请求来做出一些判断(authentication, rate limiting, headers, …),中间件被附件到路由上,是一种在请求发送到你的服务之前(或者在服务的响应发送到客户端之前)调整请求的一种方法。

三、安装

由于 Traefik 2.X 版本和之前的 1.X 版本不兼容,而且1.X 已经停止更新了。这里选择功能更加强大的 2.X 版本来和大家进行讲解,使用的镜像是 traefik:2.3.7。

创建 traefik-crd.yaml 文件

在 traefik v2.1 版本后,开始使用 CRD(Custom Resource Definition)来完成路由配置等,所以需要提前创建 CRD 资源。

  1. ## IngressRoute
  2. apiVersion: apiextensions.k8s.io/v1beta1
  3. kind: CustomResourceDefinition
  4. metadata:
  5. name: ingressroutes.traefik.containo.us
  6. spec:
  7. scope: Namespaced
  8. group: traefik.containo.us
  9. version: v1alpha1
  10. names:
  11. kind: IngressRoute
  12. plural: ingressroutes
  13. singular: ingressroute
  14. ---
  15. ## IngressRouteTCP
  16. apiVersion: apiextensions.k8s.io/v1beta1
  17. kind: CustomResourceDefinition
  18. metadata:
  19. name: ingressroutetcps.traefik.containo.us
  20. spec:
  21. scope: Namespaced
  22. group: traefik.containo.us
  23. version: v1alpha1
  24. names:
  25. kind: IngressRouteTCP
  26. plural: ingressroutetcps
  27. singular: ingressroutetcp
  28. ---
  29. ## Middleware
  30. apiVersion: apiextensions.k8s.io/v1beta1
  31. kind: CustomResourceDefinition
  32. metadata:
  33. name: middlewares.traefik.containo.us
  34. spec:
  35. scope: Namespaced
  36. group: traefik.containo.us
  37. version: v1alpha1
  38. names:
  39. kind: Middleware
  40. plural: middlewares
  41. singular: middleware
  42. ---
  43. apiVersion: apiextensions.k8s.io/v1beta1
  44. kind: CustomResourceDefinition
  45. metadata:
  46. name: tlsoptions.traefik.containo.us
  47. spec:
  48. scope: Namespaced
  49. group: traefik.containo.us
  50. version: v1alpha1
  51. names:
  52. kind: TLSOption
  53. plural: tlsoptions
  54. singular: tlsoption
  55. ---
  56. ## TraefikService
  57. apiVersion: apiextensions.k8s.io/v1beta1
  58. kind: CustomResourceDefinition
  59. metadata:
  60. name: traefikservices.traefik.containo.us
  61. spec:
  62. scope: Namespaced
  63. group: traefik.containo.us
  64. version: v1alpha1
  65. names:
  66. kind: TraefikService
  67. plural: traefikservices
  68. singular: traefikservice
  69. ---
  70. ## TraefikTLSStore
  71. apiVersion: apiextensions.k8s.io/v1beta1
  72. kind: CustomResourceDefinition
  73. metadata:
  74. name: tlsstores.traefik.containo.us
  75. spec:
  76. scope: Namespaced
  77. group: traefik.containo.us
  78. version: v1alpha1
  79. names:
  80. kind: TLSStore
  81. plural: tlsstores
  82. singular: tlsstore
  83. ---
  84. ## IngressRouteUDP
  85. apiVersion: apiextensions.k8s.io/v1beta1
  86. kind: CustomResourceDefinition
  87. metadata:
  88. name: ingressrouteudps.traefik.containo.us
  89. spec:
  90. scope: Namespaced
  91. group: traefik.containo.us
  92. version: v1alpha1
  93. names:
  94. kind: IngressRouteUDP
  95. plural: ingressrouteudps
  96. singular: ingressrouteudp
  1. # 部署 CRD 资源
  2. # kubectl create -f traefik-crd.yaml
  3. Warning: apiextensions.k8s.io/v1beta1 CustomResourceDefinition is deprecated in v1.16+, unavailable in v1.22+; use apiextensions.k8s.io/v1 CustomResourceDefinition
  4. customresourcedefinition.apiextensions.k8s.io/ingressroutes.traefik.containo.us created
  5. customresourcedefinition.apiextensions.k8s.io/ingressroutetcps.traefik.containo.us created
  6. customresourcedefinition.apiextensions.k8s.io/middlewares.traefik.containo.us created
  7. customresourcedefinition.apiextensions.k8s.io/tlsoptions.traefik.containo.us created
  8. customresourcedefinition.apiextensions.k8s.io/traefikservices.traefik.containo.us created
  9. customresourcedefinition.apiextensions.k8s.io/tlsstores.traefik.containo.us created
  10. customresourcedefinition.apiextensions.k8s.io/ingressrouteudps.traefik.containo.us created

创建rbac权限

Kubernetes 在 1.6 以后的版本中引入了基于角色的访问控制(RBAC)策略,方便对 Kubernetes 资源和 API 进行细粒度控制。Traefik 需要一定的权限,所以这里提前创建好 Traefik ServiceAccount 并分配一定的权限。

  1. # cat traefik-rbac.yaml
  2. apiVersion: v1
  3. kind: ServiceAccount
  4. metadata:
  5. name: traefik-ingress-controller
  6. namespace: kube-system
  7. ---
  8. kind: ClusterRole
  9. apiVersion: rbac.authorization.k8s.io/v1beta1
  10. metadata:
  11. name: traefik-ingress-controller
  12. rules:
  13. - apiGroups:
  14. - ""
  15. resources:
  16. - services
  17. - endpoints
  18. - secrets
  19. verbs:
  20. - get
  21. - list
  22. - watch
  23. - apiGroups:
  24. - extensions
  25. - networking.k8s.io
  26. resources:
  27. - ingresses
  28. - ingressclasses
  29. verbs:
  30. - get
  31. - list
  32. - watch
  33. - apiGroups:
  34. - extensions
  35. resources:
  36. - ingresses/status
  37. verbs:
  38. - update
  39. - apiGroups:
  40. - traefik.containo.us
  41. resources:
  42. - middlewares
  43. - ingressroutes
  44. - traefikservices
  45. - ingressroutetcps
  46. - ingressrouteudps
  47. - tlsoptions
  48. - tlsstores
  49. verbs:
  50. - get
  51. - list
  52. - watch
  53. ---
  54. kind: ClusterRoleBinding
  55. apiVersion: rbac.authorization.k8s.io/v1beta1
  56. metadata:
  57. name: traefik-ingress-controller
  58. roleRef:
  59. apiGroup: rbac.authorization.k8s.io
  60. kind: ClusterRole
  61. name: traefik-ingress-controller
  62. subjects:
  63. - kind: ServiceAccount
  64. name: traefik-ingress-controller
  65. namespace: kube-system
  1. # 部署 Traefik RBAC 资源
  2. # kubectl create -f traefik-rbac.yaml
  3. serviceaccount/traefik-ingress-controller created
  4. Warning: rbac.authorization.k8s.io/v1beta1 ClusterRole is deprecated in v1.17+, unavailable in v1.22+; use rbac.authorization.k8s.io/v1 ClusterRole
  5. clusterrole.rbac.authorization.k8s.io/traefik-ingress-controller created
  6. Warning: rbac.authorization.k8s.io/v1beta1 ClusterRoleBinding is deprecated in v1.17+, unavailable in v1.22+; use rbac.authorization.k8s.io/v1 ClusterRoleBinding
  7. clusterrolebinding.rbac.authorization.k8s.io/traefik-ingress-controller created

另一种写法:

  1. apiVersion: v1
  2. kind: ServiceAccount
  3. metadata:
  4. namespace: kube-system
  5. name: traefik-ingress-controller
  6. ---
  7. kind: ClusterRole
  8. apiVersion: rbac.authorization.k8s.io/v1beta1
  9. metadata:
  10. name: traefik-ingress-controller
  11. rules:
  12. - apiGroups: [""]
  13. resources: ["services","endpoints","secrets"]
  14. verbs: ["get","list","watch"]
  15. - apiGroups: ["extensions"]
  16. resources: ["ingresses","networking.k8s.io"]
  17. verbs: ["get","list","watch"]
  18. - apiGroups: ["extensions"]
  19. resources: ["ingresses/status"]
  20. verbs: ["update"]
  21. - apiGroups: ["traefik.containo.us"]
  22. resources: ["middlewares"]
  23. verbs: ["get","list","watch"]
  24. - apiGroups: ["traefik.containo.us"]
  25. resources: ["ingressroutes","traefikservices"]
  26. verbs: ["get","list","watch"]
  27. - apiGroups: ["traefik.containo.us"]
  28. resources: ["ingressroutetcps","ingressrouteudps"]
  29. verbs: ["get","list","watch"]
  30. - apiGroups: ["traefik.containo.us"]
  31. resources: ["tlsoptions","tlsstores"]
  32. verbs: ["get","list","watch"]
  33. ---
  34. kind: ClusterRoleBinding
  35. apiVersion: rbac.authorization.k8s.io/v1beta1
  36. metadata:
  37. name: traefik-ingress-controller
  38. roleRef:
  39. apiGroup: rbac.authorization.k8s.io
  40. kind: ClusterRole
  41. name: traefik-ingress-controller
  42. subjects:
  43. - kind: ServiceAccount
  44. name: traefik-ingress-controller
  45. namespace: kube-system

创建 Traefik 配置文件

在 Traefik 中的配置可以使用两种不同的方式:

  • 动态配置:完全动态的路由配置
  • 静态配置:启动配置

静态配置中的元素(这些元素不会经常更改)连接到 providers 并定义 Treafik 将要监听的 entrypoints。

在 Traefik 中有三种方式定义静态配置:在配置文件中、在命令行参数中、通过环境变量传递

动态配置包含定义系统如何处理请求的所有配置内容,这些配置是可以改变的,而且是无缝热更新的,没有任何请求中断或连接损耗。

由于 Traefik 配置很多,使用 CLI 定义操作过于繁琐,尽量使用将其配置选项放到配置文件中,然后存入 ConfigMap,将其挂入 traefik 中。

  1. # cat traefik-config.yaml
  2. kind: ConfigMap
  3. apiVersion: v1
  4. metadata:
  5. name: traefik-config
  6. namespace: kube-system
  7. data:
  8. traefik.yaml: |-
  9. serversTransport:
  10. insecureSkipVerify: true ## Traefik 忽略验证代理服务的 TLS 证书
  11. api:
  12. insecure: true ## 允许 HTTP 方式访问 API
  13. dashboard: true ## 启用 Dashboard
  14. debug: true ## 启用 Debug 调试模式
  15. metrics:
  16. prometheus: metrics ## 配置 Prometheus 监控指标数据,并使用默认配置
  17. entryPoints:
  18. web:
  19. address: ":80" ## 配置 80 端口,并设置入口名称为 web
  20. websecure:
  21. address: ":443" ## 配置 443 端口,并设置入口名称为 websecure
  22. traefik:
  23. address: ":8090" ## 配置 8090 端口,并设置入口名称为 dashboard
  24. metrics:
  25. address: ":8082" ## 配置 8082 端口,作为metrics收集入口
  26. tcpep:
  27. address: ":8000" ## 配置 8000 端口,作为tcp入口
  28. udpep:
  29. address: ":9000/udp" ## 配置 9000 端口,作为udp入口
  30. providers:
  31. kubernetescrd: ## 启用 Kubernetes CRD 方式来配置路由规则
  32. ingressclass: traefik-v2.3
  33. kubernetesingress: ## 启动 Kubernetes Ingress 方式来配置路由规则
  34. ingressclass: traefik-v2.3
  35. log:
  36. filePath: "/etc/traefik/logs/traefik.log" ## 设置调试日志文件存储路径,如果为空则输出到控制台
  37. level: error ## 设置调试日志级别
  38. format: json ## 设置调试日志格式
  39. accessLog:
  40. filePath: "/etc/traefik/logs/access.log" ## 设置访问日志文件存储路径,如果为空则输出到控制台
  41. format: json ## 设置访问调试日志格式
  42. bufferingSize: 0 ## 设置访问日志缓存行数
  43. filters:
  44. #statusCodes: ["200"] ## 设置只保留指定状态码范围内的访问日志
  45. retryAttempts: true ## 设置代理访问重试失败时,保留访问日志
  46. minDuration: 20 ## 设置保留请求时间超过指定持续时间的访问日志
  47. fields: ## 设置访问日志中的字段是否保留(keep 保留、drop 不保留)
  48. defaultMode: keep ## 设置默认保留访问日志字段
  49. names: ## 针对访问日志特别字段特别配置保留模式
  50. ClientUsername: drop
  51. headers: ## 设置 Header 中字段是否保留
  52. defaultMode: keep ## 设置默认保留 Header 中字段
  53. names: ## 针对 Header 中特别字段特别配置保留模式
  54. User-Agent: redact
  55. Authorization: drop
  56. Content-Type: keep
  1. # 部署 Traefik ConfigMap 资源
  2. # kubectl create -f traefik-config.yaml
  3. configmap/traefik-config created

部署 Traefik

提前给节点设置Label,当程序部署Pod会自动调度到设置 Label的node节点上。

  1. # kubectl label nodes develop-master-1 IngressProxy=traefik2.3
  2. node/develop-master-1 labeled
  3. # kubectl label nodes develop-worker-1 IngressProxy=traefik2.3
  4. node/develop-worker-1 labeled
  5. # kubectl label nodes develop-worker-2 IngressProxy=traefik2.3
  6. node/develop-worker-2 labeled
  7. # 验证节点标签是否成功
  8. # kubectl get node --show-labels
  9. NAME STATUS ROLES AGE VERSION LABELS
  10. develop-master-1 Ready control-plane,etcd,master,worker 98d v1.20.4 IngressProxy=traefik2.3,beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=develop-master-1,kubernetes.io/os=linux,node-role.kubernetes.io/control-plane=,node-role.kubernetes.io/etcd=,node-role.kubernetes.io/master=,node-role.kubernetes.io/worker=
  11. develop-worker-1 Ready worker 98d v1.20.4 IngressProxy=traefik2.3,beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=develop-worker-1,kubernetes.io/os=linux,node-role.kubernetes.io/worker=
  12. develop-worker-2 Ready worker 98d v1.20.4 IngressProxy=traefik2.3,beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=develop-worker-2,kubernetes.io/os=linux,node-role.kubernetes.io/worker=,worker=worker2
  13. # 节点删除Label标签
  14. # kubectl label nodes develop-master-1 IngressProxy-
  15. # kubectl label nodes develop-worker-1 IngressProxy-
  16. # kubectl label nodes develop-worker-2 IngressProxy-
  1. # cat traefik-deploy.yaml
  2. apiVersion: apps/v1
  3. kind: Deployment
  4. metadata:
  5. name: traefik-v2
  6. namespace: kube-system
  7. labels:
  8. app: traefik-v2
  9. spec:
  10. replicas: 2
  11. selector:
  12. matchLabels:
  13. app: traefik-v2
  14. template:
  15. metadata:
  16. labels:
  17. app: traefik-v2
  18. spec:
  19. serviceAccountName: traefik-ingress-controller
  20. terminationGracePeriodSeconds: 1
  21. containers:
  22. - name: traefik-v2
  23. image: traefik:v2.3
  24. args:
  25. - --configfile=/config/traefik.yaml
  26. ports:
  27. - name: web
  28. containerPort: 80
  29. hostPort: 80 #hostPort方式,将端口暴露到集群节点
  30. - name: websecure
  31. containerPort: 443
  32. hostPort: 443 #hostPort方式,将端口暴露到集群节点
  33. - name: admin
  34. containerPort: 8090
  35. - name: tcpep
  36. containerPort: 8000
  37. - name: udpep
  38. containerPort: 9000
  39. resources:
  40. limits:
  41. cpu: 500m
  42. memory: 1024Mi
  43. requests:
  44. cpu: 300m
  45. memory: 1024Mi
  46. securityContext:
  47. capabilities: ## 只开放网络权限
  48. drop:
  49. - ALL
  50. add:
  51. - NET_BIND_SERVICE
  52. volumeMounts:
  53. - mountPath: "/config"
  54. name: "config"
  55. - mountPath: /etc/traefik/logs
  56. name: logdir
  57. - mountPath: /etc/localtime
  58. name: timezone
  59. readOnly: true
  60. volumes:
  61. - name: config
  62. configMap:
  63. name: traefik-config
  64. - name: logdir
  65. hostPath:
  66. path: /data/traefik/logs
  67. type: "DirectoryOrCreate"
  68. - name: timezone
  69. hostPath:
  70. path: /etc/localtime
  71. type: File
  72. tolerations:
  73. - operator: "Exists" ## 设置容忍所有污点,防止节点被设置污点
  74. hostNetwork: true ## 开启host网络,提高网络入口的网络性能
  75. nodeSelector: ## 设置node筛选器,在特定label的节点上启动
  76. IngressProxy: "traefik2.3"
  77. ---
  78. apiVersion: v1
  79. kind: Service
  80. metadata:
  81. name: traefik-v2
  82. namespace: kube-system
  83. spec:
  84. type: LoadBalancer
  85. selector:
  86. app: traefik-v2
  87. ports:
  88. - protocol: TCP
  89. port: 80
  90. name: web
  91. targetPort: 80
  92. - protocol: TCP
  93. port: 443
  94. name: websecure
  95. targetPort: 443
  96. - protocol: TCP
  97. port: 8090
  98. name: admin
  99. targetPort: 8090
  100. - protocol: TCP
  101. port: 8000
  102. name: tcpep
  103. targetPort: 8000
  104. ---
  105. apiVersion: v1
  106. kind: Service
  107. metadata:
  108. name: traefikudp-v2
  109. namespace: kube-system
  110. spec:
  111. type: LoadBalancer
  112. selector:
  113. app: traefik-v2
  114. ports:
  115. - protocol: UDP
  116. port: 9000
  117. name: udpep
  118. targetPort: 9000

使用Deployment类型部署,以便于在多服务器间扩展,使用 hostport 方式占用服务器 80、443 端口,方便流量进入。

  1. # 部署 Traefik
  2. # kubectl create -f traefik-deploy.yaml
  3. deployment.apps/traefik-v2 created
  4. service/traefik-v2 created
  5. service/traefikudp-v2 created

到此 Traefik v2.3 应用已经部署完成。

这时候就可以通过节点http://IP:8090,可以看到dashboard相关信息

四、路由配置

1、配置 HTTP 路由规则 (Traefik Dashboard 为例)

Traefik 应用已经部署完成,但是想让外部访问 Kubernetes 内部服务,还需要配置路由规则,这里开启了 Traefik Dashboard 配置,所以首先配置 Traefik Dashboard 看板的路由规则,使外部能够访问 Traefik Dashboard。

创建 Traefik Dashboard 路由规则文件 traefik-dashboard-route.yaml

因为静态配置文件指定了ingressclass,所以这里的annotations 要指定,否则访问会404

  1. # cat traefik-dashboard-route.yaml
  2. apiVersion: traefik.containo.us/v1alpha1
  3. kind: IngressRoute
  4. metadata:
  5. name: traefik-dashboard
  6. namespace: kube-system
  7. annotations:
  8. kubernetes.io/ingress.class: traefik-v2.3
  9. spec:
  10. entryPoints:
  11. - web
  12. routes:
  13. - match: Host(`www.traefiktest.com`)
  14. kind: Rule
  15. services:
  16. - name: api@internal
  17. kind: TraefikService
  1. # 部署Traefik Dashboard 路由规则对象
  2. # kubectl create -f traefik-dashboard-route.yaml
  3. ingressroute.traefik.containo.us/traefik-dashboard created

客户端通过域名访问服务,必须要进行 DNS 解析,可以通过 DNS 服务器进行域名解析,也可以修改 hosts 文件将 Traefik 指定节点的 IP 和自定义 host 绑定

  1. # cat hosts
  2. 192.168.2.163 www.traefiktest.com

打开任意浏览器输入地址:http://www.traefiktest.com进行访问,打开 Traefik Dashboard.

此处没有配置验证登录,如果想配置验证登录,使用middleware即可。

2、配置 HTTP 路由规则

Traefik 已经部署完成,但是想让外部访问 Kubernetes 内部服务,还需要配置路由规则,这里用whoami 举例。

  1. # 首先创建whoami 的 deployment
  2. # cat whoami.yaml
  3. ## 创建一个http应用
  4. apiVersion: apps/v1
  5. kind: Deployment
  6. metadata:
  7. name: whoami
  8. namespace: default
  9. labels:
  10. app: traefiklabs
  11. name: whoami
  12. spec:
  13. replicas: 2
  14. selector:
  15. matchLabels:
  16. app: traefiklabs
  17. task: whoami
  18. template:
  19. metadata:
  20. labels:
  21. app: traefiklabs
  22. task: whoami
  23. spec:
  24. containers:
  25. - name: whoami
  26. image: traefik/whoami
  27. ports:
  28. - containerPort: 80
  29. ---
  30. ## http应用的service
  31. apiVersion: v1
  32. kind: Service
  33. metadata:
  34. name: whoami
  35. namespace: default
  36. spec:
  37. ports:
  38. - name: http
  39. port: 80
  40. selector:
  41. app: traefiklabs
  42. task: whoami
  43. ---
  44. ## 创建一个tcp应用
  45. kind: Deployment
  46. apiVersion: apps/v1
  47. metadata:
  48. name: whoamitcp
  49. namespace: default
  50. labels:
  51. app: traefiklabs
  52. name: whoamitcp
  53. spec:
  54. replicas: 2
  55. selector:
  56. matchLabels:
  57. app: traefiklabs
  58. task: whoamitcp
  59. template:
  60. metadata:
  61. labels:
  62. app: traefiklabs
  63. task: whoamitcp
  64. spec:
  65. containers:
  66. - name: whoamitcp
  67. image: traefik/whoamitcp
  68. ports:
  69. - containerPort: 8080
  70. ---
  71. ## tcp应用的service
  72. apiVersion: v1
  73. kind: Service
  74. metadata:
  75. name: whoamitcp
  76. namespace: default
  77. spec:
  78. ports:
  79. - protocol: TCP
  80. port: 8080
  81. selector:
  82. app: traefiklabs
  83. task: whoamitcp
  84. ---
  85. ## 创建一个ucp应用
  86. kind: Deployment
  87. apiVersion: apps/v1
  88. metadata:
  89. name: whoamiudp
  90. namespace: default
  91. labels:
  92. app: traefiklabs
  93. name: whoamiudp
  94. spec:
  95. replicas: 2
  96. selector:
  97. matchLabels:
  98. app: traefiklabs
  99. task: whoamiudp
  100. template:
  101. metadata:
  102. labels:
  103. app: traefiklabs
  104. task: whoamiudp
  105. spec:
  106. containers:
  107. - name: whoamiudp
  108. image: traefik/whoamiudp:latest
  109. ports:
  110. - containerPort: 8080
  111. ---
  112. ## ucp应用的service
  113. apiVersion: v1
  114. kind: Service
  115. metadata:
  116. name: whoamiudp
  117. namespace: default
  118. spec:
  119. ports:
  120. - port: 8080
  121. selector:
  122. app: traefiklabs
  123. task: whoamiudp
  1. # kubectl create -f whoami.yaml
  2. deployment.apps/whoami created
  3. service/whoami created
  4. deployment.apps/whoamitcp created
  5. service/whoamitcp created
  6. deployment.apps/whoamiudp created
  7. service/whoamiudp created
  1. # 创建 whoami 路由规则文件 whoami-ingreoute.yaml
  2. # cat whoami-ingreoute.yaml
  3. apiVersion: traefik.containo.us/v1alpha1
  4. kind: IngressRoute
  5. metadata:
  6. name: myingressroute
  7. namespace: default
  8. annotations:
  9. kubernetes.io/ingress.class: traefik-v2.3
  10. spec:
  11. entryPoints:
  12. - web # 跟ConfigMap中的保持一致
  13. routes:
  14. - match: Host(`whoami.foxchan.com`) && PathPrefix(`/`)
  15. kind: Rule
  16. services:
  17. - name: whoami
  18. port: 80
  1. # kubectl create -f whoami-ingreoute.yaml
  2. ingressroute.traefik.containo.us/myingressroute created

主机hosts文件添加如下解析

  1. 192.168.2.163 whoami.foxchan.com

查看效果,可以看到是同一个浏览器访问的是同一个pod ,这个跟下面使用kuboard来创建traefik ingressroute,同一个浏览器不停刷新访问不同的pod





问题

1.通过上述使用yaml文件创建的traefik ingressroute,可以访问使用,通过kuboard界面上也能查看到,不过位置是在集群管理-自定义资源-traefik.containo.us中



2.yaml文件部署的traefik ingressroute,访问是的时候指定pod了,但是通过kuboard界面部署的traefik ingressroute,访问的时候pod 来回变换

使用建议

应用部署到service后就可以了,然后使用kuboard来创建traefik ingressroute,记得设置annotations

  1. annotations:
  2. kubernetes.io/ingress.class: traefik-v2.3

3、配置 HTTPS 路由规则

用 HTTPS 来访问我们这个应用的话,就需要监听 websecure 这个入口点,也就是通过 443 端口来访问,同样用 HTTPS 访问应用必然就需要证书,用 openssl 来创建一个自签名的证书:

  1. # openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=whoami.foxchan.com"
  2. Generating a 2048 bit RSA private key
  3. ...................................+++
  4. ...........................................+++
  5. writing new private key to 'tls.key'
  6. -----
  7. # ll
  8. -rw-r--r-- 1 root root 1119 7 8 15:55 tls.crt
  9. -rw-r--r-- 1 root root 1704 7 8 15:55 tls.key

通过 Secret 对象来引用证书文件

  1. # 要注意证书文件名称必须是 tls.crt 和 tls.key
  2. # kubectl create secret tls who-tls --cert=tls.crt --key=tls.key
  3. secret/who-tls created
  1. # 另一种方式
  2. kubectl create secret generic who-tls --from-file=tls.crt --from-file=tls.key -n default

创建一个 HTTPS 访问应用的 IngressRoute 对象:

  1. # cat whoami-ingreoute-tls.yaml
  2. apiVersion: traefik.containo.us/v1alpha1
  3. kind: IngressRoute
  4. metadata:
  5. name: ingressroutetls
  6. annotations:
  7. kubernetes.io/ingress.class: traefik-v2.3
  8. spec:
  9. entryPoints:
  10. - websecure # 跟ConfigMap中的保持一致
  11. routes:
  12. - match: Host(`whoami.foxchan.com`)
  13. kind: Rule
  14. services:
  15. - name: whoami
  16. port: 80
  17. tls:
  18. secretName: who-tls
  1. # kubectl create -f whoami-ingreoute-tls.yaml
  2. ingressroute.traefik.containo.us/ingressroutetls created



使用建议

应用部署到service后就可以了,然后使用kuboard创建secret,然后来创建traefik ingressroute,记得设置annotations

  1. annotations:
  2. kubernetes.io/ingress.class: traefik-v2.3

4、配置 TCP 路由规则

  1. # cat whoami-tcp.yaml
  2. apiVersion: traefik.containo.us/v1alpha1
  3. kind: IngressRouteTCP
  4. metadata:
  5. name: ingressroutetcpwho
  6. annotations:
  7. kubernetes.io/ingress.class: traefik-v2.3
  8. spec:
  9. entryPoints:
  10. - tcpep # 跟ConfigMap中的保持一致
  11. routes:
  12. - match: HostSNI(`*`)
  13. services:
  14. - name: whoamitcp
  15. port: 8080

5、配置udp路由规则

  1. # whoami-udp.yaml
  2. apiVersion: traefik.containo.us/v1alpha1
  3. kind: IngressRouteUDP
  4. metadata:
  5. name: ingressrouteudpwho
  6. annotations:
  7. kubernetes.io/ingress.class: traefik-v2.3
  8. spec:
  9. entryPoints:
  10. - udpep # 跟ConfigMap中的保持一致
  11. routes:
  12. - services:
  13. - name: whoamiudp
  14. port: 8080

五、中间件

中间件是 Traefik2.0 中一个非常有特色的功能,可以根据自己的各种需求去选择不同的中间件来满足服务,Traefik 官方已经内置了许多不同功能的中间件,其中一些可以修改请求,头信息,一些负责重定向,一些添加身份验证等等,而且中间件还可以通过链式组合的方式来适用各种情况。

白名单举例

设置dashboard只能白名单的ip可以访问

  1. # 创建白名单中间件
  2. # cat middleware-ipwhitelist.yaml
  1. # 然后将这个中间件附加到 dashboard的服务上面去
  2. # cat traefik-dashboard-route.yaml
  3. apiVersion: traefik.containo.us/v1alpha1
  4. kind: IngressRoute
  5. metadata:
  6. name: traefik-dashboard
  7. namespace: kube-system
  8. annotations:
  9. kubernetes.io/ingress.class: traefik-v2.3
  10. spec:
  11. entryPoints:
  12. - web
  13. routes:
  14. - match: Host(`whoami.foxchan.com`)
  15. kind: Rule
  16. services:
  17. - name: api@internal
  18. kind: TraefikService
  19. middlewares: #这里添加中间件的名字
  20. - name: gs-ipwhitelist

这个时候我们再去访问dashboard,不在白名单的就会报403

六、路由配置(高级)

在开始traefik的高级用法之前,还需要了解一个TraefikService,通过把TraefikService注册到CRD来实现更复杂的请求设置。

TraefikService 目前能用于以下功能

  • servers load balancing.(负载均衡)
  • services Weighted Round Robin load balancing.(权重轮询)
  • services mirroring.(镜像)

1、负载均衡

  1. # 创建k8s service
  2. # cat svc-service.yaml
  3. apiVersion: v1
  4. kind: Service
  5. metadata:
  6. name: svc1
  7. namespace: default
  8. spec:
  9. ports:
  10. - name: http
  11. port: 80
  12. selector:
  13. app: v1
  14. ---
  15. apiVersion: v1
  16. kind: Service
  17. metadata:
  18. name: svc2
  19. namespace: default
  20. spec:
  21. ports:
  22. - name: http
  23. port: 80
  24. selector:
  25. app: v2
  1. # 创建IngressRoute
  2. # cat svc-service-ingressroute.yaml
  3. apiVersion: traefik.containo.us/v1alpha1
  4. kind: IngressRoute
  5. metadata:
  6. name: ingressroutelb
  7. namespace: default
  8. spec:
  9. entryPoints:
  10. - web
  11. routes:
  12. - match: Host(`whoami.foxchan.com`)
  13. kind: Rule
  14. services:
  15. - name: svc1
  16. namespace: default
  17. - name: svc2
  18. namespace: default

2、权重轮询

  1. # 创建TraefikService
  2. # cat wrr-service.yaml
  3. apiVersion: traefik.containo.us/v1alpha1
  4. kind: TraefikService
  5. metadata:
  6. name: wrr
  7. namespace: default
  8. spec:
  9. weighted:
  10. services:
  11. - name: svc1
  12. port: 80
  13. weight: 3 # 定义权重
  14. kind: Service # 可选,默认就是 Service
  15. - name: svc2
  16. port: 80
  17. weight: 1
  1. # 创建IngressRoute
  2. # 需要注意的是现在我们配置的 Service 不再是直接的 Kubernetes 对象了,而是上面我们定义的 TraefikService 对象
  3. # cat wrr-service-ingressout.yaml
  4. apiVersion: traefik.containo.us/v1alpha1
  5. kind: IngressRoute
  6. metadata:
  7. name: ingressroutewrr
  8. namespace: default
  9. spec:
  10. entryPoints:
  11. - web
  12. routes:
  13. - match: Host(`who.foxchan.com`)
  14. kind: Rule
  15. services:
  16. - name: wrr
  17. namespace: default
  18. kind: TraefikService

3、镜像

1.流量复制到k8s 的service

  1. # Mirroring from a k8s Service
  2. apiVersion: traefik.containo.us/v1alpha1
  3. kind: TraefikService
  4. metadata:
  5. name: mirror-k8s
  6. namespace: default
  7. spec:
  8. mirroring:
  9. name: svc1 # 发送 100% 的请求到 K8S 的 Service "v1"
  10. port: 80
  11. mirrors:
  12. - name: svc2 # 然后复制 20% 的请求到 v2
  13. port: 80
  14. percent: 20

2.流量从Traefik Service 导入

  1. # Mirroring from a Traefik Service
  2. apiVersion: traefik.containo.us/v1alpha1
  3. kind: TraefikService
  4. metadata:
  5. name: mirror-ts
  6. namespace: default
  7. spec:
  8. mirroring:
  9. name: mirror-k8s #流量入口从TraefikService 来
  10. kind: TraefikService
  11. mirrors:
  12. - name: svc2
  13. port: 80
  14. percent: 20

3.创建IngressRoute

  1. apiVersion: traefik.containo.us/v1alpha1
  2. kind: IngressRoute
  3. metadata:
  4. name: ingressroute-mirror
  5. namespace: default
  6. spec:
  7. entryPoints:
  8. - web
  9. routes:
  10. - match: Host(`who.foxchan.com`)
  11. kind: Rule
  12. services:
  13. - name: mirror-k8s
  14. namespace: default
  15. kind: TraefikService

yaml文件下载地址

https://files.cnblogs.com/files/sanduzxcvbnm/yaml文件.zip

traefik镜像版本升级

文档中使用的traefik镜像是traefik:v2.3,若是升级到traefik:v2.5,启动后则会报错如下:

  1. E0708 17:33:27.478347 1 reflector.go:138] pkg/mod/k8s.io/client-go@v0.20.2/tools/cache/reflector.go:167: Failed to watch *v1alpha1.MiddlewareTCP: failed to list *v1alpha1.MiddlewareTCP: middlewaretcps.traefik.containo.us is forbidden: User "system:serviceaccount:kube-system:traefik-ingress-controller" cannot list resource "middlewaretcps" in API group "traefik.containo.us" at the cluster scope

v2.3启动后日志显示

v2.5启动后日志显示

看来若是升级的话,得改yaml文件中的内容才行

参考资料:

https://blog.51cto.com/foxhound/2545116?source=dra

https://www.cnblogs.com/heian99/p/14608414.html

https://blog.51cto.com/u_13760351/2764008

kubernetes1.20 部署 traefik2.3的更多相关文章

  1. linux mysql 5.7.20 部署脚本+备份脚本

    一.官网下载源码包 源码包:mysql-5.7.20-linux-glibc2.12-x86_64.tar.gz 检查环境,卸载老版本mysql 二.自动部署脚本 进入文件目录,执行脚本 #!/bin ...

  2. Kubernetes1.15 部署 coredns

    coredns.yaml文件如下所示 # __MACHINE_GENERATED_WARNING__ apiVersion: v1 kind: ServiceAccount metadata: nam ...

  3. tomcat-9.0.20部署后输出窗口乱码解决方案

    问题:启动tomcat的时候,窗口乱码,默认都是UTF-8的,但是控制台是GBK的,要保持一致 可以通过控制台查看本机的编码: : 936  代表  GB2312 解决办法:打开tomcat目录下的c ...

  4. Kubernetes集群搭建 ver1.20.5

    目录 部署方式 1. 基础环境准备 1.1 基础初始化 1.2 安装docker 2. 部署harbor及haproxy高可用反向代理 2.1 镜像加速配置 2.2 高可用master可配置 3. 初 ...

  5. k8s mysql 单点部署

    参考官网:https://kubernetes.io/docs/tasks/run-application/run-replicated-stateful-application/ 20-nproc. ...

  6. k8s入坑之路(4)kubenetes安装

    三种安装方法: 1.kubeadm 2.kubespray 3.二进制安装 kubespray安装kubernetes集群 优点: 1.kuberspray对比kubeadm更加简洁内部集成了kube ...

  7. client-go实战之一:准备工作

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  8. kubeasz部署高可用kubernetes1.17.2 并实现traefik2.1.2部署

    模板机操作 # cat /etc/redhat-release CentOS Linux release 7.6.1810 (Core) # uname -a //内核升级到4.4.X以后, 关于如何 ...

  9. kubernetes学习与实践篇(二) kubernetes1.5 的安装和集群环境部署

    kubernetes 1.5 的安装和集群环境部署 文章转载自:http://www.cnblogs.com/tynia/p/k8s-cluster.html 简介: Docker:是一个开源的应用容 ...

随机推荐

  1. 攻防世界MISC进阶区 61-63

    61.肥宅快乐题 得到swf文件,但是用PotPlayer打不开,用浏览器应该可以打开,打开后可以在npc的对话中看到一段base64 解密后就可以得到flag 62.warmup 得到一张png和一 ...

  2. ACWing94. 递归实现排列型枚举

    题面 把 1∼n 这 n个整数排成一行后随机打乱顺序,输出所有可能的次序. 输入格式 一个整数 n. 输出格式 按照从小到大的顺序输出所有方案,每行 1 个. 首先,同一行相邻两个数用一个空格隔开. ...

  3. Sharding-jdbc + Seata + Nacos整合

    前置条件 先了解Sharding-jdbc.Seata.Nacos这三样东西各自的作用以及单独使用时的配置. 整合代码已放在github,详细步骤章节请搭配此项目看,欢迎start 思路 如果已经做过 ...

  4. 从零开始搭建Vue2.0项目(一)之快速开始

    从零开始搭建Vue2.0项目(一)之项目快速开始 前言 该样板适用于大型,严肃的项目,并假定您对Webpack和有所了解vue-loader.确保还阅读vue-loader的文档,了解常见的工作流程配 ...

  5. UE4.25 Slate源码解读

    概述 Slate系统是UE的一套UI解决方案,UMG系统也是依赖Slate系统实现的. 问题: Slate系统是如何组织的? 控件树的父子关系是如何绑定的? Slate系统是如何渲染的? slate渲 ...

  6. Python logging日志管理

    import logging logger = logging.getLogger("simple_example") logger.setLevel(logging.DEBUG) ...

  7. Luogu2858[USACO06FEB]奶牛零食Treats for the Cows (区间DP)

    我是个傻逼,这么水的题都会T #include <iostream> #include <cstdio> #include <cstring> #include & ...

  8. java-运算符以及简单运用

    运算符: 1)赋值运算符:= 2)算术运算符:+-*/%,++,-- 3)关系运算符:>,<,>=,<=,==,!= boolean 4)逻辑运算符:&&,|| ...

  9. java学习第二天多态.day09

    接口 接口总结 接口表示一种规约(规范.标准),它里面定义了一些列抽象方法(功能),它可以被多个类实现. 1接口名称首写字母用I,表示一个接口,后命名使用驼峰命名 2.接口中定义的都是抽象方法,所以可 ...

  10. 记录第一次给开源项目提 PR

    本文是深入浅出 ahooks 源码系列文章的第八篇,该系列已整理成文档-地址.觉得还不错,给个 star 支持一下哈,Thanks. 本篇文章算是该系列的一个彩蛋篇,记录一下第一次给开源项目提 PR ...