Kubernetes 部署 Ingress 控制器 Traefik v2.4

Kubernetes 部署 Ingress 控制器 Traefik v2.4

文章目录

  !版权声明:本博客内容均为原创,每篇博文作为知识积累,写博不易,转载请注明出处。


系统环境:

  • Traefik 版本:v2.4.3
  • Kubernetes 版本:1.20.1

参考地址:

示例部署文件:

  • 示例部署文件 Github 地址:https://github.com/my-dlq/blog-example/tree/master/kubernetes/traefik-v2.4-deploy

一、Traefik 简介

       Traefik 是一款开源的边缘路由器,它可以让发布服务变得轻松有趣。它代表您的系统接收请求,并找出负责处理这些请求的组件。与众不同之处在于,除了它的许多特性之外,它还可以自动为您的服务发现正确的配置。当 Traefik 检查您的基础设施时,它会发现相关信息,并发现哪个服务为哪个请求提供服务。

       Traefik 与每个主要的集群技术都是原生兼容的,比如 Kubernetes、Docker、Docker Swarm、AWS、Mesos、Marathon 等等;并且可以同时处理多个。(它甚至适用于运行在裸机上的遗留软件。) 使用 Traefik,不需要维护和同步单独的配置文件:所有事情都是实时自动发生的(没有重启,没有连接中断)。使用 Traefik,只需要花费时间开发和部署新功能到您的系统,而不是配置和维护其工作状态。

二、Kubernetes Gateway API 简介

在 Traefik v2.4 版本中增加了对 Kubernetes Gateway API 的支持。所以这里我们简单介绍下 Kubernetes Gateway API。

1、Gateway API 是什么

Gateway API 是由 SIG-NETWORK 社区管理的一个开源项目。该项目的目标是在 Kubernetes 生态系统内发展服务网络 API。网关 API 提供了用于暴露 Kubernetes 应用程序的 Service、Ingress 等。

2、Gateway API 的目标

Gateway API 旨在通过提供可表达的,可扩展的,面向角色的接口来改善服务网络,这些接口已由许多供应商实施并获得了广泛的行业支持。

网关 API 是 API 资源(服务、网关类、网关、HTTPRoute、TCPRoute等)的集合。这些资源共同为各种网络用例建模。

Gateway API 如何根据 Ingress 等当前标准进行改进?

  • 更具表现力: 它们表达了更多的核心功能,比如基于 header 的匹配、traffic 流量加权,以及其他只能通过 Ingress 中自定义方式才能实现的功能。
  • 更具扩展性: 它们允许自定义资源在API的不同层上链接。这允许在API结构中的适当位置进行更细粒度的定制。。
  • 面向角色: 它们被分离成不同的 API 资源,这些 API 资源映射到 Kubernetes 上运行应用程序的公共角色。。
  • 通用: 这不是改进,而是应保持不变。就像Ingress是具有许多实现的通用规范一样,Gateway API也被设计为受许多实现支持的可移植规范。

其他一些值得注意的功能包括…

  • 共享网关: 通过允许独立的路由资源绑定到同一网关,它们可以共享负载衡器和 VIP。这使团队可以安全地共享基础结构,而无需直接协调。
  • 带类型的后端引用: 使用带类型的后端引用,路由可以引用Kubernetes Services,也可以引用任何类型的设计为网关后端的Kubernetes资源。
  • 跨命名空间引用: 跨不同 Namespace 的路由可以绑定到同一网关。这允许共享网络基础设施,尽管对工作负载进行了 Namespace 分割。
  • 类: GatewayClasses 形式化负载平衡实现的类型。这些类使用户可以轻松而明确地了解哪些功能可以用作资源模型本身。

如果想了解更多内容,可以访问 Kubernetes Gateway API 文档

三、Kubernetes 部署 Traefik

       Traefik 最新推出了 v2.4 版本,这里将 Traefik 升级到最新版本,简单的介绍了下如何在 Kubernetes 环境下安装与配置 Traefik v2.4。

       当部署完 Traefik 后还需要创建外部访问 Kubernetes 内部应用的路由规则,Traefik 目前支持三种方式创建路由规则方式,一种是创建 Traefik 自定义 Kubernetes CRD 资源,另一种是创建 Kubernetes Ingress 资源,还有就是 v2.4 版本对 Kubernetes 扩展 API Kubernetes Gateway API 适配的一种方式,创建 GatewayClassGatewayHTTPRoute 资源。

注意:这里 Traefik 是部署在 Kube-system Namespace 下,如果不想部署到配置的 Namespace,需要修改下面部署文件中的 Namespace 参数。

1、创建 CRD 资源

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

#创建 traefik-crd.yaml 文件

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

#创建 Traefik CRD 资源

1$ kubectl apply -f traefik-crd.yaml

2、创建 RBAC 权限

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

# 创建 traefik-rbac.yaml 文件:

  1## ServiceAccount
  2apiVersion: v1
  3kind: ServiceAccount
  4metadata:
  5  namespace: kube-system
  6  name: traefik-ingress-controller
  7---
  8## ClusterRole
  9kind: ClusterRole
 10apiVersion: rbac.authorization.k8s.io/v1beta1
 11metadata:
 12  name: traefik-ingress-controller
 13  namespace: kube-system
 14rules:
 15  - apiGroups:
 16      - ""
 17    resources:
 18      - services
 19      - endpoints
 20      - secrets
 21    verbs:
 22      - get
 23      - list
 24      - watch
 25  - apiGroups:
 26      - extensions
 27      - networking.k8s.io
 28    resources:
 29      - ingresses
 30      - ingressclasses
 31    verbs:
 32      - get
 33      - list
 34      - watch
 35  - apiGroups:
 36      - extensions
 37      - networking.k8s.io
 38    resources:
 39      - ingresses/status
 40    verbs:
 41      - update
 42  - apiGroups:
 43      - traefik.containo.us
 44    resources:
 45      - ingressroutes
 46      - ingressroutetcps
 47      - ingressrouteudps
 48      - middlewares
 49      - tlsoptions
 50      - tlsstores
 51      - traefikservices
 52      - serverstransports
 53    verbs:
 54      - get
 55      - list
 56      - watch
 57  - apiGroups:
 58      - networking.x-k8s.io
 59    resources:
 60      - gatewayclasses
 61      - gatewayclasses/status
 62      - gateways
 63    verbs:
 64      - get
 65      - list
 66      - watch
 67  - apiGroups:
 68      - networking.x-k8s.io
 69    resources:
 70      - gatewayclasses/status
 71    verbs:
 72      - get
 73      - patch
 74      - update
 75  - apiGroups:
 76      - networking.x-k8s.io
 77    resources:
 78      - gateways/status
 79    verbs:
 80      - get
 81      - patch
 82      - update
 83  - apiGroups:
 84      - networking.x-k8s.io
 85    resources:
 86      - httproutes
 87    verbs:
 88      - create
 89      - delete
 90      - get
 91      - list
 92      - patch
 93      - update
 94      - watch
 95  - apiGroups:
 96      - networking.x-k8s.io
 97    resources:
 98      - httproutes/status
 99    verbs:
100      - get
101      - patch
102      - update
103---
104## ClusterRoleBinding
105kind: ClusterRoleBinding
106apiVersion: rbac.authorization.k8s.io/v1beta1
107metadata:
108  name: traefik-ingress-controller
109roleRef:
110  apiGroup: rbac.authorization.k8s.io
111  kind: ClusterRole
112  name: traefik-ingress-controller
113subjects:
114  - kind: ServiceAccount
115    name: traefik-ingress-controller
116    namespace: kube-system

#创建 Traefik RBAC 资源

  • -n:指定部署的 Namespace
1$ kubectl apply -f traefik-rbac.yaml -n kube-system

3、创建 Traefik 配置文件

由于 Traefik 配置很多,通过 CLI 定义不是很方便,一般时候都会通过配置文件配置 Traefik 参数,然后存入 ConfigMap,将其挂入 Traefik 中。

#创建 traefik-config.yaml 文件

下面配置中可以通过配置 kubernetesCRDkubernetesIngresskubernetesGateway 三项参数,让 Traefik 支持 CRD、Ingress 与 kubernetesGateway 三种路由配置方式。

 1kind: ConfigMap
 2apiVersion: v1
 3metadata:
 4  name: traefik-config
 5data:
 6  traefik.yaml: |-
 7    ping: ""                    ## 启用 Ping
 8    serversTransport:
 9      insecureSkipVerify: true  ## Traefik 忽略验证代理服务的 TLS 证书
10    api:
11      insecure: true            ## 允许 HTTP 方式访问 API
12      dashboard: true           ## 启用 Dashboard
13      debug: false              ## 启用 Debug 调试模式
14    metrics:
15      prometheus: ""            ## 配置 Prometheus 监控指标数据,并使用默认配置
16    entryPoints:
17      web:
18        address: ":80"          ## 配置 80 端口,并设置入口名称为 web
19      websecure:
20        address: ":443"         ## 配置 443 端口,并设置入口名称为 websecure
21    providers:
22      kubernetesCRD: ""         ## 启用 Kubernetes CRD 方式来配置路由规则
23      kubernetesIngress: ""     ## 启用 Kubernetes Ingress 方式来配置路由规则
24      kubernetesGateway: ""     ## 启用 Kubernetes Gateway API
25    experimental:               
26      kubernetesGateway: true   ## 允许使用 Kubernetes Gateway API
27    log:
28      filePath: ""              ## 设置调试日志文件存储路径,如果为空则输出到控制台
29      level: error              ## 设置调试日志级别
30      format: json              ## 设置调试日志格式
31    accessLog:
32      filePath: ""              ## 设置访问日志文件存储路径,如果为空则输出到控制台
33      format: json              ## 设置访问调试日志格式
34      bufferingSize: 0          ## 设置访问日志缓存行数
35      filters:
36        #statusCodes: ["200"]   ## 设置只保留指定状态码范围内的访问日志
37        retryAttempts: true     ## 设置代理访问重试失败时,保留访问日志
38        minDuration: 20         ## 设置保留请求时间超过指定持续时间的访问日志
39      fields:                   ## 设置访问日志中的字段是否保留(keep 保留、drop 不保留)
40        defaultMode: keep       ## 设置默认保留访问日志字段
41        names:                  ## 针对访问日志特别字段特别配置保留模式
42          ClientUsername: drop  
43        headers:                ## 设置 Header 中字段是否保留
44          defaultMode: keep     ## 设置默认保留 Header 中字段
45          names:                ## 针对 Header 中特别字段特别配置保留模式
46            User-Agent: redact
47            Authorization: drop
48            Content-Type: keep
49    #tracing:                     ## 链路追踪配置,支持 zipkin、datadog、jaeger、instana、haystack 等 
50    #  serviceName:               ## 设置服务名称(在链路追踪端收集后显示的服务名)
51    #  zipkin:                    ## zipkin配置
52    #    sameSpan: true           ## 是否启用 Zipkin SameSpan RPC 类型追踪方式
53    #    id128Bit: true           ## 是否启用 Zipkin 128bit 的跟踪 ID
54    #    sampleRate: 0.1          ## 设置链路日志采样率(可以配置0.0到1.0之间的值)
55    #    httpEndpoint: http://localhost:9411/api/v2/spans     ## 配置 Zipkin Server 端点    

#创建 Traefik ConfigMap 资源

  • -n: 指定程序启的 Namespace
1$ kubectl apply -f traefik-config.yaml -n kube-system

4、节点设置 Label 标签

由于是 Kubernetes DeamonSet 这种方式部署 Traefik,所以需要提前给节点设置 Label,这样当程序部署时会自动调度到设置 Label 的节点上。

#节点设置 Label 标签

  • 格式:kubectl label nodes [节点名] [key=value]
1$ kubectl label nodes k8s-node-2-12 IngressProxy=true

#查看节点是否设置 Label 成功

1$ kubectl get nodes --show-labels
2
3NAME            STATUS ROLES  VERSION  LABELS
4k8s-master-2-11 Ready  master v1.20.1  kubernetes.io/hostname=k8s-master-2-11,node-role.kubernetes.io/master=
5k8s-node-2-12   Ready  <none> v1.20.1  kubernetes.io/hostname=k8s-node-2-12,IngressProxy=true
6k8s-node-2-13   Ready  <none> v1.20.1  kubernetes.io/hostname=k8s-node-2-13
7k8s-node-2-14   Ready  <none> v1.20.1  kubernetes.io/hostname=k8s-node-2-14

如果想删除标签,可以使用 "kubectl label nodes k8s-node-2-12 IngressProxy-" 命令

5、安装 Kubernetes Gateway CRD 资源

由于目前 Kubernetes 集群上默认没有安装 Service APIs,我们需要提前安装 Gateway API 的 CRD 资源,需要确保在 Traefik 安装之前启用 Service APIs 资源。

1$ kubectl apply -k "github.com/kubernetes-sigs/service-apis/config/crd?ref=v0.1.0"

参考于 traefik 博客 Traefik Kubernetes Service API 入门,详情可以进入该博客了解更多。

6、Kubernetes 部署 Traefik

下面将用 DaemonSet 方式部署 Traefik,便于在多服务器间扩展,用 hostport 方式绑定服务器 80443 端口,方便流量通过物理机进入 Kubernetes 内部。

#创建 traefik 部署 traefik-deploy.yaml 文件

 1apiVersion: v1
 2kind: Service
 3metadata:
 4  name: traefik
 5  labels:
 6    app: traefik
 7spec:
 8  ports:
 9    - name: web
10      port: 80
11    - name: websecure
12      port: 443
13    - name: admin
14      port: 8080
15  selector:
16    app: traefik
17---
18apiVersion: apps/v1
19kind: DaemonSet
20metadata:
21  name: traefik-ingress-controller
22  labels:
23    app: traefik
24spec:
25  selector:
26    matchLabels:
27      app: traefik
28  template:
29    metadata:
30      name: traefik
31      labels:
32        app: traefik
33    spec:
34      serviceAccountName: traefik-ingress-controller
35      terminationGracePeriodSeconds: 1
36      containers:
37        - image: traefik:v2.4.3
38          name: traefik-ingress-lb
39          ports:
40            - name: web
41              containerPort: 80
42              hostPort: 80         ## 将容器端口绑定所在服务器的 80 端口
43            - name: websecure
44              containerPort: 443
45              hostPort: 443        ## 将容器端口绑定所在服务器的 443 端口
46            - name: admin
47              containerPort: 8080  ## Traefik Dashboard 端口
48          resources:
49            limits:
50              cpu: 2000m
51              memory: 1024Mi
52            requests:
53              cpu: 1000m
54              memory: 1024Mi
55          securityContext:
56            capabilities:
57              drop:
58                - ALL
59              add:
60                - NET_BIND_SERVICE
61          args:
62            - --configfile=/config/traefik.yaml
63          volumeMounts:
64            - mountPath: "/config"
65              name: "config"
66          readinessProbe:
67            httpGet:
68              path: /ping
69              port: 8080
70            failureThreshold: 3
71            initialDelaySeconds: 10
72            periodSeconds: 10
73            successThreshold: 1
74            timeoutSeconds: 5
75          livenessProbe:
76            httpGet:
77              path: /ping
78              port: 8080
79            failureThreshold: 3
80            initialDelaySeconds: 10
81            periodSeconds: 10
82            successThreshold: 1
83            timeoutSeconds: 5    
84      volumes:
85        - name: config
86          configMap:
87            name: traefik-config 
88      tolerations:              ## 设置容忍所有污点,防止节点被设置污点
89        - operator: "Exists"
90      nodeSelector:             ## 设置node筛选器,在特定label的节点上启动
91        IngressProxy: "true"

#Kubernetes 部署 Traefik

1$ kubectl apply -f traefik-deploy.yaml -n kube-system

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

四、配置路由规则

       Traefik 应用已经部署完成,但是想让外部访问 Kubernetes 内部服务,还需要配置路由规则,上面部署 Traefik 时开启了 Traefik Dashboard,这是 Traefik 提供的视图看板,所以,首先配置基于 HTTPTraefik Dashboard 路由规则,使外部能够访问 Traefik Dashboard。然后,再配置基于 HTTPSKubernetes Dashboard 的路由规则,这里分别使用 CRDIngressKubernetes Gateway API 三种方式进行演示。

1、方式一:使用 CRD 方式配置 Traefik 路由规则

使用 CRD 方式创建路由规则可言参考 Traefik 文档 Kubernetes IngressRoute

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

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

 1apiVersion: traefik.containo.us/v1alpha1
 2kind: IngressRoute
 3metadata:
 4  name: traefik-dashboard-route
 5spec:
 6  entryPoints:
 7  - web
 8  routes:
 9  - match: Host(`traefik.mydlq.club`)
10    kind: Rule
11    services:
12      - name: traefik
13        port: 8080

#创建 Traefik Dashboard 路由规则对象

1$ kubectl apply -f traefik-dashboard-route.yaml -n kube-system

(2)、配置 HTTPS 路由规则(Kubernetes Dashboard 为例)

这里我们创建 KubernetesDashboard 看板创建路由规则,它是 Https 协议方式,由于它是需要使用 Https 请求,所以我们配置基于 Https 的路由规则并指定证书。

#创建私有证书 tls.key、tls.crt 文件

1# 创建自签名证书
2$ openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=kubernetes.mydlq.club"
3
4# 将证书存储到 Kubernetes Secret 中
5$ kubectl create secret generic cloud-mydlq-tls --from-file=tls.crt --from-file=tls.key -n kube-system

#创建 Traefik Dashboard CRD 路由规则 kubernetes-dashboard-route.yaml 文件

 1apiVersion: traefik.containo.us/v1alpha1
 2kind: IngressRoute
 3metadata:
 4  name: kubernetes-dashboard-route
 5spec:
 6  entryPoints:
 7  - websecure
 8  tls:
 9    secretName: cloud-mydlq-tls
10  routes:
11  - match: Host(`kubernetes.mydlq.club`) 
12    kind: Rule
13    services:
14      - name: kubernetes-dashboard
15        port: 443

#创建 Kubernetes Dashboard 路由规则对象

1$ kubectl apply -f kubernetes-dashboard-route.yaml -n kube-system

2、方式二:使用 Ingress 方式配置 Traefik 路由规则

使用 Ingress 方式创建路由规则可言参考 Traefik 文档 Kubernetes Ingress

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

#创建 Traefik Ingress 路由规则 traefik-dashboard-ingress.yaml 文件

 1apiVersion: networking.k8s.io/v1
 2kind: Ingress
 3metadata:
 4  name: traefik-dashboard-ingress
 5  namespace: kube-system
 6  annotations:
 7    kubernetes.io/ingress.class: traefik  
 8    traefik.ingress.kubernetes.io/router.entrypoints: web
 9spec:
10  rules:
11  - host: traefik.mydlq.club 
12    http:
13      paths:
14      - pathType: Prefix
15        path: /
16        backend:
17          service:
18            name: traefik
19            port:
20              number: 8080

#创建 Traefik Dashboard Ingress 路由规则对象

1$ kubectl apply -f traefik-dashboard-ingress.yaml -n kube-system

(2)、配置 HTTPS 路由规则(Kubernetes Dashboard 为例)

跟上面以 CRD 方式创建路由规则一样,也需要创建使用证书,然后再以 Ingress 方式创建路由规则。

#创建私有证书 tls.key、tls.crt 文件

1# 创建自签名证书
2$ openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=kubernetes.mydlq.club"
3
4# 将证书存储到 Kubernetes Secret 中
5$ kubectl create secret generic cloud-mydlq-tls --from-file=tls.crt --from-file=tls.key -n kube-system

#创建 Traefik Dashboard Ingress 路由规则 kubernetes-dashboard-ingress.yaml 文件

 1apiVersion: networking.k8s.io/v1
 2kind: Ingress
 3metadata:
 4  name: kubernetes-dashboard-ingress
 5  namespace: kube-system
 6  annotations:
 7    kubernetes.io/ingress.class: traefik                  
 8    traefik.ingress.kubernetes.io/router.tls: "true"
 9    traefik.ingress.kubernetes.io/router.entrypoints: websecure
10spec:
11  tls:
12  - hosts:
13      - kubernetes.mydlq.club
14    secretName: cloud-mydlq-tls
15  rules:
16  - host: kubernetes.mydlq.club
17    http:
18      paths:
19      - path: /
20        pathType: Prefix
21        backend:
22          service:
23            name: kubernetes-dashboard
24            port:
25              number: 443

#创建 Traefik Dashboard 路由规则对象

1$ kubectl apply -f kubernetes-dashboard-ingress.yaml -n kube-system

3、方式三:使用 Kubernetes Gateway API

在 Traefik v2.4 版本后支持 Kubernetes Gateway API 提供的 CRD 方式创建路由规则,上面已经简单介绍了 Gateway 是什么,这里根据该 CRD 资源创建路由规则进行演示。

  • GatewayClass: GatewayClass 是基础结构提供程序定义的群集范围的资源。此资源表示可以实例化的网关类。一般该资源是用于支持多个基础设施提供商用途的,这里我们只部署一个即可。
  • Gateway: Gateway 与基础设施配置的生命周期是 1:1。当用户创建网关时,GatewayClass 控制器会提供或配置一些负载平衡基础设施。
  • HTTPRoute: HTTPRoute 是一种网关 API 类型,用于指定 HTTP 请求从网关侦听器到 API 对象(即服务)的路由行为。

详情可以参考:https://doc.traefik.io/traefik/v2.4/routing/providers/kubernetes-gateway/

(1)、创建 GatewayClass

#创建 GatewayClass 资源 kubernetes-gatewayclass.yaml 文件

1apiVersion: networking.x-k8s.io/v1alpha1
2kind: GatewayClass
3metadata:
4  name: traefik
5spec:
6  controller: traefik.io/gateway-controller

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

#创建 Gateway 资源 http-gateway.yaml 文件

 1apiVersion: networking.x-k8s.io/v1alpha1
 2kind: Gateway
 3metadata: 
 4  name: http-gateway
 5  namespace: kube-system
 6spec: 
 7  gatewayClassName: traefik
 8  listeners: 
 9    - protocol: HTTP
10      port: 80
11      routes: 
12        kind: HTTPRoute
13        namespaces:
14          from: All
15        selector:
16          matchLabels:
17            app: traefik

#创建 HTTPRoute 资源 traefik-httproute.yaml 文件

 1apiVersion: networking.x-k8s.io/v1alpha1
 2kind: HTTPRoute
 3metadata:
 4  name: traefik-dashboard-httproute
 5  namespace: kube-system
 6  labels:
 7    app: traefik
 8spec:
 9  hostnames:
10    - "traefik.mydlq.club"
11  rules:
12    - matches:
13        - path:
14            type: Prefix
15            value: /
16      forwardTo:
17        - serviceName: traefik
18          port: 8080
19          weight: 1

(3)、配置 HTTPS 路由规则(Kubernetes Dashboard 为例)

跟上面创建两种路由方式一样,也需要创建使用证书,然后再结合 GatewayHTTPRoute 方式创建路由规则。

#创建私有证书 tls.key、tls.crt 文件

1# 创建自签名证书
2$ openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=kubernetes.mydlq.club"
3
4# 将证书存储到 Kubernetes Secret 中
5$ kubectl create secret generic cloud-mydlq-tls --from-file=tls.crt --from-file=tls.key -n kube-system

#创建 Gateway 资源 https-gateway.yaml 文件

 1apiVersion: networking.x-k8s.io/v1alpha1
 2kind: Gateway
 3metadata:
 4  name: https-gateway
 5spec:
 6  gatewayClassName: traefik
 7  listeners:
 8  - protocol: HTTPS
 9    port: 443
10    hostname: kubernetes.mydlq.club
11    tls:
12      certificateRef:
13        kind: Secret
14        group: core
15        name: cloud-mydlq-tls
16      routeOverride:
17        certificate: Deny
18    routes:
19      kind: HTTPRoute
20      namespaces:
21        from: All
22      selector:
23        matchLabels:
24          app: traefik

#创建 HTTPRoute 资源 kubernetes-httproute.yaml 文件

 1apiVersion: networking.x-k8s.io/v1alpha1
 2kind: HTTPRoute
 3metadata:
 4  name: kubernetes-dashboard-httproute
 5  namespace: kube-system
 6  labels:
 7    app: traefik
 8spec:
 9  hostnames:
10    - "kubernetes.mydlq.club"
11  rules:
12    - matches:
13        - path:
14            type: Prefix
15            value: /
16      forwardTo:
17        - serviceName: kubernetes-dashboard
18          port: 443
19          weight: 1

五、方式创建路由规则后的应用

1、配置 Host 文件

客户端想通过域名访问服务,必须要进行 DNS 解析,由于这里没有 DNS 服务器进行域名解析,所以修改 hosts 文件将 Traefik 所在节点服务器的 IP 和自定义 Host 绑定。打开电脑的 Hosts 配置文件,往其加入下面配置:

1192.168.2.12  traefik.mydlq.club kubernetes.mydlq.club

2、访问对应应用

#访问 Traefik Dashboard

打开浏览器输入地址:http://traefik.mydlq.club 打开 Traefik Dashboard。

#访问 Traefik Dashboard

打开浏览器输入地址:https://cloud.mydlq.club 打开 Dashboard Dashboard。

到此文章结束,可以访问我的 Github 下载 部署文件,别忘点颗 Start!!

---End---

如果本文对你有帮助,可以关注我的公众号"小豆丁技术栈"了解最新动态,顺便也请帮忙 github 点颗星哦~感谢~


  !版权声明:本博客内容均为原创,每篇博文作为知识积累,写博不易,转载请注明出处。