还不会Traefik?看这篇文章就够了!(一)

简介: 还不会Traefik?看这篇文章就够了!

大家好,我是乔克。


提到Traefik,有些人可能并不熟悉,但是提到Nginx,应该都耳熟能详。


暂且我们把Traefik当成和Nginx差不多的一类软件,待读完整篇文章,你就会对Traefik有不一样的认识。


本文主要带大家对Traefik有一个全面的认识,我将从下面几个方面作介绍。


640.png


本文基于Traefik 2.5.3进行介绍。


什么是Traefik


Traefik是一个开源的边缘路由网关,它简单易用并且功能全面。官方【1】的介绍是:Traefik is an [open-source]

(https://github.com/traefik/traefik) _Edge Router_ that makes publishing your services a fun and easy experience.


Traefik原生支持多种集群,如Kubernetes、Docker、Docker Swarm、AWS、Mesos、Marathon等;并且可以同时处理许多集群。


640.png


Traefik的核心概念及能力


Traefik是一个边缘路由器,它会拦截外部的请求并根据逻辑规则选择不同的操作方式,这些规则决定着这些请求到底该如何处理。Traefik提供自动发现能力,会实时检测服务,并自动更新路由规则。


640.png


从上图可知,请求首先会连接到entrypoints,然后分析这些请求是否与定义的rules匹配,如果匹配,则会通过一系列middlewares,再到对应的services上。


这就涉及到以下几个重要的核心组件。


  • Providers
  • Entrypoints
  • Routers
  • Services
  • Middlewares


Providers


Providers是基础组件,Traefik的配置发现是通过它来实现的,它可以是协调器,容器引擎,云提供商或者键值存储。


Traefik通过查询ProvidersAPI来查询路由的相关信息,一旦检测到变化,就会动态的更新路由。


Entrypoints


EntrypointsTraefik的网络入口,它定义接收请求的接口,以及是否监听TCP或者UDP。


Routers


Routers主要用于分析请求,并负责将这些请求连接到对应的服务上去,在这个过程中,Routers还可以使用Middlewares来更新请求,比如在把请求发到服务之前添加一些Headers。


Services


Services负责配置如何到达最终将处理传入请求的实际服务。


Middlewares


Middlewares用来修改请求或者根据请求来做出一些判断(authentication, rate limiting, headers, ...),中间件被附件到路由上,是一种在请求发送到你的服务之前(或者在服务的响应发送到客户端之前)调整请求的一种方法。


部署Traefik


Traefik的部署方式有多种,这里主要采用Helm方式进行部署管理。


Helm部署


环境:kubernetes: 1.22.3 helm: 3.7.1


1、添加traefik helm仓库


$ helm repo add traefik https://helm.traefik.io/traefik
$ helm repo update


2、将traefik包下载到本地进行管理


$ helm  search repo traefik
NAME            CHART VERSION APP VERSION DESCRIPTION                                  
traefik/traefik 10.6.0        2.5.3       A Traefik based Kubernetes ingress controller
$ helm pull traefik/traefik


3、部署Traefik


默认的value.yaml[2]配置文件配置比较多,可能需要花一定的时间去梳理,不过根据相关的注释还是可以很快的理解。


这里自定义一个配置文件my-value.yaml,如下:


service:
  type: NodePort 
ingressRoute:
  dashboard:
    enabled: false
ports:
  traefik:
    port: 9000
    expose: true
  web:
    port: 8000
    expose: true
  websecure:
    port: 8443
    expose: true
persistence:
  enabled: true
  name: data
  accessMode: ReadWriteOnce
  size: 5G
  storageClass: "openebs-hostpath"
  path: /data
additionalArguments:
  - "--serversTransport.insecureSkipVerify=true"
  - "--api.insecure=true"
  - "--api.dashboard=true"


进行部署,命令如下:


$ kubectl create ns traefik-ingress
$ helm install traefik -n traefik-ingress -f my-value.yaml .


这里不是使用的是默认的value.yaml[2]配置文件。


然后可以看到部署结果,如下:


# kubectl get all -n traefik-ingress 
NAME                           READY   STATUS    RESTARTS   AGE
pod/traefik-77ff894bb5-qqszd   1/1     Running   0          6m26s
NAME              TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)                                     AGE
service/traefik   NodePort   10.108.170.22   <none>        9000:32271/TCP,80:31728/TCP,443:30358/TCP   6m26s
NAME                      READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/traefik   1/1     1            1           6m26s
NAME                                 DESIRED   CURRENT   READY   AGE
replicaset.apps/traefik-77ff894bb5   1         1         1       6m26s


然后可以通过NodePort访问Dashboard页面,如下:


640.png


使用Traefik


创建第一个路由规则


我们上面访问Dashboard是采用的NodePort的方式,既然已经把Traefik部署好了,为什么不使用路由网关的方式呢?


下面我们就来创建第一个路由网关来访问Dashboard


Traefik创建路由规则有多种方式,比如:


  • 原生Ingress写法
  • 使用CRD IngressRoute方式
  • 使用GatewayAPI的方式


这里暂时介绍前面两种方式,关于GatewayAPI的方式在后续进行介绍。


原生Ingress路由规则


原生Ingress的路由规则,写法就比较简单,如下。


# cat traefik-ingress.yaml 
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: traefik-dashboard-ingress
  annotations:
    kubernetes.io/ingress.class: traefik  
    traefik.ingress.kubernetes.io/router.entrypoints: web
spec:
  rules:
  - host: traefik-web.coolops.cn 
    http:
      paths:
      - pathType: Prefix
        path: /
        backend:
          service:
            name: traefik
            port:
              number: 9000


创建路由规则,命令如下:


# kubectl apply -f traefik-ingress.yaml -n traefik-ingress 
ingress.networking.k8s.io/traefik-dashboard-ingress created


现在就可以通过域名http://traefik-web.coolops.cn:31728/dashboard/#/ 进行访问了(31728是80端口的映射端口),如下:


640.png


使用CRD方式配置路由规则


在早期版本,Traefik仅提供kubernetes ingress方式配置路由规则,社区认为采用开发一个自定义CRD的类型能够更好的提供Kubernetes的访问配置【3】。


IngressRoute的配置方式也比较简单,如下:


# cat traefik-ingressRoute.yaml 
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
  name: traefik-dashboard-route
spec:
  entryPoints:
  - web
  routes:
  - match: Host(`traefik-web2.coolops.cn`)
    kind: Rule
    services:
      - name: traefik
        port: 9000


部署命令如下:


# kubectl apply -f traefik-ingressRoute.yaml -n traefik-ingress 
ingressroute.traefik.containo.us/traefik-dashboard-route created


然后就可以通过http://traefik-web2.coolops.cn:31728/dashboard/#/ 进行访问了。


640.png

暴露HTTP服务


首先,部署一个简单的whoami[4]应用,YAML文件如下:


---
apiVersion: v1
kind: Pod
metadata:
  name: whoami
  labels:
    app: whoami
spec:
  containers:
    - name: whoami
      image: traefik/whoami:latest
      ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: whoami
spec:
  ports:
    - port: 80
      protocol: TCP
      targetPort: 80
  selector:
    app: whoami
  type: ClusterIP


部署成功后,创建一个路由规则,使外部可以访问。


# cat ingressroute.yaml 
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
  name: whoami-route
spec:
  entryPoints:
  - web
  routes:
  - match: Host(`whoami.coolops.cn`)
    kind: Rule
    services:
      - name: whoami
        port: 80


创建过后,就可以进行访问了,如下:


640.png

暴露HTTPS服务


上面的whoami应用,是通过HTTP进行访问的,如果要通过HTTPS进行访问,应该如何配置呢?


Traefik支持HTTPS和TLS,对于证书可以选择自有证书,也可以使用Let's Encrypt【5】自动生成证书。这里会分别介绍这两种方式。


自有证书配置HTTPS


现在公司基本都会自己购买更安全的证书,那对于自有证书配置HTTPS就会使用更加频繁,这里主要介绍这种配置方式。


1、申请或者购买证书


我这里是在腾讯云申请的免费证书。


640.png


然后下载对应的证书,并上传到服务器上。


2、将证书文件保存为Secret


# kubectl create secret tls whoami-tls --cert=1_whoami.coolops.cn_bundle.crt --key=2_whoami.coolops.cn.key


3、创建IngressRoute对象,使其可以通过TLS访问


# cat ingressroutetls.yaml 
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
  name: whoami-route-tls
spec:
  entryPoints:
  - websecure
  routes:
  - match: Host(`whoami.coolops.cn`)
    kind: Rule
    services:
      - name: whoami
        port: 80 
  tls:
    secretName: whoami-tls


创建完成后,就可以通过https://whoami.coolops.cn:30358/ 进行访问了(30358是443映射出来的端口)。


640.png

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。 &nbsp; &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
10月前
|
应用服务中间件 网络安全 nginx
轻松上手Nginx Proxy Manager:安装、配置与实战
Nginx Proxy Manager (NPM) 是一款基于 Nginx 的反向代理管理工具,提供直观的 Web 界面,方便用户配置和管理反向代理、SSL 证书等。本文档介绍了 NPM 的安装步骤,包括 Docker 和 Docker Compose 的安装、Docker Compose 文件的创建与配置、启动服务、访问 Web 管理界面、基本使用方法以及如何申请和配置 SSL 证书,帮助用户快速上手 NPM。
6085 1
|
11月前
|
API 微服务
Traefik 微服务 API 网关教程(全)
Traefik 微服务 API 网关教程(全)
|
Docker 容器
containerd快速安装指南🚀
本指南旨在提供一个简洁有效的方法来安装`containerd`。我们将通过一份易于理解的脚本步骤,指导您完成安装🔧。请根据您的实际需求,适当调整`containerd`版本及其相关依赖。
|
Kubernetes 中间件 数据安全/隐私保护
traefik配置用户登录,限制K8S的web服务访问
像Elastic-APM, Traefik-Dashboard等页面,是没有用户登录限制的,如果我们希望给他们加上用户登录限制,我们需要在traeifk里给对应的ingress添加登录用的Middleware,那么该如何添加呢?本文以给K8S部署的traefik dashboard为例进行添加
886 0
traefik配置用户登录,限制K8S的web服务访问
|
弹性计算 Kubernetes 安全
基于 Traefik 的 Basic Auth 配置
基于 Traefik 的 Basic Auth 配置
|
负载均衡 网络架构 Docker
Traefik
Traefik 是一款开源的反向代理和负载均衡工具,它可以自动地为容器化的应用程序提供动态路由和负载均衡服务。Traefik 支持多种后端服务,并且可以根据容器的标签和元数据自动发现和配置后端服务。
688 1
|
Prometheus 网络协议 NoSQL
还不会Traefik?看这篇文章就够了!(二)
还不会Traefik?看这篇文章就够了!
还不会Traefik?看这篇文章就够了!(二)
|
虚拟化 Docker 容器
Minikube - Kubernetes本地实验环境
为了方便大家本地开发和体验Kubernetes,社区提供了可以在本机部署的Minikube。本文介绍利用阿里云的镜像地址在Windows/Mac/Linux上来部署和配置Minikube
239189 71
Minikube - Kubernetes本地实验环境
|
存储 Kubernetes 负载均衡
从零开始:阿里云上Kubernetes集群的搭建与部署
Kubernetes (通常简称为K8s) 是一个用于自动化部署、扩展和管理容器化应用程序的开源平台。它最初由 Google 开发,现在由云原生计算基金会(CNCF)维护。Kubernetes 提供了一个可靠的容器编排环境,使得在多个节点上运行和管理容器化应用程序变得更加容易。它支持多种容器运行时,例如 Docker、rkt、CRI-O 等,可以在不同的云服务商、虚拟机或物理机上运行。Kubernetes 具有许多功能,例如自动化应用程序部署和扩展、负载均衡、自动容器重启、滚动更新、存储管理、自动发布和回滚等。它还提供了一些常见的应用程序模式,例如微服务、分布式系统和无状态应用程序,
13322 3
|
中间件 Go 网络架构
Traefik Middleware 插件实践
话说,作为一款开源的边缘路由器,Traefik 或多或少算是一款比较牛逼的新生代组件,其不仅可以作为接入层组件,实现流量转发等相关功能,同时也可以支撑网关层的相关功能,尤其是 2.x 版本中的自定义中间件功能。
617 0