Traefik v2.9-IngressRoute

news2025/7/24 5:10:17

文章目录

      • 简介
      • 资源交付
        • 创建CRD和RBAC
        • 创建ConfigMap
        • 创建Deployment
        • 创建Service
        • 创建traefik-dashboard-ingressroute

简介

The Kubernetes Ingress Controller, The Custom Resource Way.

In early versions, Traefik supported Kubernetes only through the Kubernetes Ingress provider, which is a Kubernetes Ingress controller in the strict sense of the term.

However, as the community expressed the need to benefit from Traefik features without resorting to (lots of) annotations, the Traefik engineering team developed a Custom Resource Definition (CRD) for an IngressRoute type, defined below, in order to provide a better way to configure access to a Kubernetes cluster.

资源交付

创建CRD和RBAC

https://doc.traefik.io/traefik/providers/kubernetes-crd/

The apiextensions.k8s.io/v1beta1 CustomResourceDefinition is deprecated in Kubernetes v1.16+ and will be removed in v1.22+.For Kubernetes v1.16+, please use the Traefik apiextensions.k8s.io/v1 CRDs instead.

# Install Traefik Resource Definitions:
kubectl apply -f https://raw.githubusercontent.com/traefik/traefik/v2.9/docs/content/reference/dynamic-configuration/kubernetes-crd-definition-v1.yml

# Install RBAC for Traefik:
kubectl apply -f https://raw.githubusercontent.com/traefik/traefik/v2.9/docs/content/reference/dynamic-configuration/kubernetes-crd-rbac.yml

示例yml:
cat kubernetes-crd-rbac.yml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: traefik-ingress-controller

rules:
  - apiGroups:
      - ""
    resources:
      - services
      - endpoints
      - secrets
    verbs:
      - get
      - list
      - watch
  - apiGroups:
      - extensions
      - networking.k8s.io
    resources:
      - ingresses
      - ingressclasses
    verbs:
      - get
      - list
      - watch
  - apiGroups:
      - extensions
      - networking.k8s.io
    resources:
      - ingresses/status
    verbs:
      - update
  - apiGroups:
      - traefik.containo.us
    resources:
      - middlewares
      - middlewaretcps
      - ingressroutes
      - traefikservices
      - ingressroutetcps
      - ingressrouteudps
      - tlsoptions
      - tlsstores
      - serverstransports
    verbs:
      - get
      - list
      - watch

---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: traefik-ingress-controller

roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: traefik-ingress-controller
subjects:
  - kind: ServiceAccount
    name: traefik-ingress-controller
    namespace: traefik

在这里插入图片描述

创建ConfigMap

cat traefik-config.yaml 
kind: ConfigMap
apiVersion: v1
metadata:
  name: traefik-config
  namespace: traefik
data:
  traefik.yaml: |-
    global:
      checkNewVersion: false    # 周期性的检查是否有新版本发布
      sendAnonymousUsage: false # 周期性的匿名发送使用统计信息
    serversTransport:
      insecureSkipVerify: true  # Traefik忽略验证代理服务的TLS证书
    api:
      insecure: true            # 允许HTTP 方式访问API
      dashboard: true           # 启用Dashboard
      debug: false              # 启用Debug调试模式
    metrics:
      prometheus:               # 配置Prometheus监控指标数据,并使用默认配置
        addRoutersLabels: true  # 添加routers metrics
        entryPoint: "metrics"   # 指定metrics监听地址
    entryPoints:
      web:
        address: ":80"          # 配置80端口,并设置入口名称为web
        forwardedHeaders: 
          insecure: true        # 信任所有的forward headers
      websecure:
        address: ":443"         # 配置443端口,并设置入口名称为 websecure
        forwardedHeaders: 
          insecure: true
      traefik:
        address: ":9000"        # 配置9000端口,并设置入口名称为 dashboard
      metrics:
        address: ":9101"        # 配置9100端口,作为metrics收集入口
      tcpep:
        address: ":9200"        # 配置9200端口,作为tcp入口
      udpep:
        address: ":9300/udp"    # 配置9300端口,作为udp入口
    providers:
      kubernetesCRD:            # 启用Kubernetes CRD方式来配置路由规则
        ingressClass: ""
        allowCrossNamespace: true   #允许跨namespace
        allowEmptyServices: true    #允许空endpoints的service
    log:
      filePath: "/etc/traefik/logs/traefik.log" # 设置调试日志文件存储路径,如果为空则输出到控制台
      level: "INFO"             # 设置调试日志级别
      format: "common"          # 设置调试日志格式
    accessLog:
      filePath: "/etc/traefik/logs/access.log" # 设置访问日志文件存储路径,如果为空则输出到控制台
      format: "common"          # 设置访问调试日志格式
      bufferingSize: 0          # 设置访问日志缓存行数
      filters:
        statusCodes: ["200"]   # 设置只保留指定状态码范围内的访问日志
        retryAttempts: true     # 设置代理访问重试失败时,保留访问日志
        minDuration: 20         # 设置保留请求时间超过指定持续时间的访问日志
      fields:                   # 设置访问日志中的字段是否保留(keep保留、drop不保留)
        defaultMode: keep       # 设置默认保留访问日志字段
        names:                  # 针对访问日志特别字段特别配置保留模式
          ClientUsername: drop
          StartUTC: drop        # 禁用日志timestamp使用UTC
        headers:                # 设置Header中字段是否保留
          defaultMode: keep     # 设置默认保留Header中字段
          names:                # 针对Header中特别字段特别配置保留模式
            #User-Agent: redact # 可以针对指定agent
            Authorization: drop
            Content-Type: keep

创建Deployment

cat traefik-deployment.yaml 
apiVersion: v1
kind: ServiceAccount
metadata:
  namespace: traefik
  name: traefik-ingress-controller
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: traefik-ingress-controller
  namespace: traefik
  labels:
    app: traefik
spec:
  replicas: 1 
  selector:
    matchLabels:
      app: traefik
  template:
    metadata:
      name: traefik
      labels:
        app: traefik
    spec:
      serviceAccountName: traefik-ingress-controller
      terminationGracePeriodSeconds: 1
      containers:
      - name: traefik
        image: traefik:v2.9
        env:
        - name: KUBERNETES_SERVICE_HOST       # 手动指定k8s api地址,避免网络组件不稳定。
          value: "x.x.x.x"
        - name: KUBERNETES_SERVICE_PORT_HTTPS # API server端口
          value: "6443"
        - name: KUBERNETES_SERVICE_PORT       # API server端口
          value: "6443"
        - name: TZ                            # 指定时区
          value: "Asia/Shanghai"
        ports:
          - name: web
            containerPort: 80
            hostPort: 80                      # 将容器端口绑定所在服务器的 80 端口
          - name: websecure
            containerPort: 443
            hostPort: 443                     # 将容器端口绑定所在服务器的 443 端口
          - name: admin
            containerPort: 9000               # Traefik Dashboard 端口
          - name: metrics
            containerPort: 9101               # metrics端口
          - name: tcpep
            containerPort: 9200               # tcp端口
          - name: udpep
            containerPort: 9300               # udp端口
        securityContext:                      # 只开放网络权限  
          capabilities:
            drop:
              - ALL
            add:
              - NET_BIND_SERVICE
        args:
          - --configfile=/etc/traefik/config/traefik.yaml
        volumeMounts:
        - mountPath: /etc/traefik/config
          name: config
        - mountPath: /etc/traefik/logs
          name: logdir
        - mountPath: /etc/localtime
          name: timezone
          readOnly: true
      volumes:
        - name: config
          configMap:
            name: traefik-config 
        - name: logdir
          hostPath:
            path: /data/traefik/logs
            type: "DirectoryOrCreate"
        - name: timezone                       #挂载时区文件
          hostPath:
            path: /etc/localtime
            type: File
      tolerations:                             # 设置容忍所有污点,防止节点被设置污点
        - operator: "Exists"
      hostNetwork: true                        # 开启host网络,提高网络入口的网络性能
      nodeSelector:                            # 设置node筛选器,在特定label的节点上启动
        IngressProxy: "true"                   # 调度至IngressProxy: "true"的节点

创建Service

cat traefik-svc.yaml 
apiVersion: v1
kind: Service
metadata:
  name: traefik
  namespace: traefik
spec:
  type: NodePort    # 官网示例为ClusterIP,此处为NodePort
  selector:
    app: traefik
  ports:
    - name: web
      protocol: TCP
      port: 80
      targetPort: 80
    - name: websecure
      protocol: TCP
      port: 443
      targetPort: 443
    - name: admin
      protocol: TCP
      port: 9000
      targetPort: 9000
    - name: metrics
      protocol: TCP
      port: 9101
      targetPort: 9101
    - name: tcpep
      protocol: TCP
      port: 9200
      targetPort: 9200
    - name: udpep
      protocol: UDP
      port: 9300
      targetPort: 9300

在这里插入图片描述

通过NodePort暴露的端口进行访问即可!
Traefik创建路由规则有以下三种方式,相较于原生Ingress规则,ingressRoute是2.1以后新增功能,简单来说,他们都支持路径(path)路由和域名(host)HTTP路由,以及HTTPS配置,区别在于IngressRoute需要定义CRD扩展,但是它支持了TCP、UDP路由以及中间件等高级特性,强烈推荐使用ingressRoute

在这里插入图片描述

创建traefik-dashboard-ingressroute

# cat traefik-dashboard-ingressroute.yaml
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
  name: traefik-dashboard-route
  namespace: traefik
spec:
  entryPoints:
    - web
  routes:
    - match: Host(`traefik.dashboard.com`)
      kind: Rule
      services:
        - name: api@internal
          kind: TraefikService

测试通过绑定hosts解析,访问域名即可!

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/394857.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android SurfaceTexture说明

what 1. SurfaceTexture用来捕获视频流中的图像帧,视频流可以是相机预览或者是视频解码数据。 里边承接图像数据的也是GraphicBuffer, GLConsumer 作为其BufferQueue的消费方,取得数据后可以通过eglImage挂到opengles texture 里边对其做纹理采样。 ho…

学习笔记三:容器,镜像相关操作,并部署nginx

这里写目录标题镜像相关命令从dockerhub查找镜像容器相关操作以交互式方式启动并进入容器以守护进程方式启动容器查看正在运行的容器通过docker部署nginx服务在docker里安装nginx创建静态页面访问docker里的nginx服务流量走向:镜像相关命令 从dockerhub查找镜像 d…

mTip 输入法状态跟踪提示 ,可以更改热键等

ImTip ( 输入法状态跟踪提示 )最新版本是 v4.4 :免费开源,仅 715 KB。单文件绿色软件,无任何外部依赖,兼容 XP,Vista,Win7,Win8,Win10,Win11 …… 等所有流行桌面操作系统。源代码: …

Java设计模式笔记——六个创建型模式

系列文章目录 Java设计模式笔记——七大设计原则 文章目录系列文章目录一、简单工厂模式1.概念2.案例分析3.使用简单工厂模式进行改进4.总结二、工厂方法模式1.概念2.案例分析3.使用工厂方法模式进行改进4.总结三、抽象工厂模式1.概念2.案例分析3.使用抽象工厂模式改进4.总结四…

跨端技术或许是提升软件运维效率的利器

凡是代码,难免有 bug。 开发者们的日常,除了用一行行代码搭产品外,便是找出代码里的虫,俗称 debug。 ​随着移动互联网的快速发展,App 已经成为日常生活中不可或缺的一部分。但是在开发者/运维人员的眼里简直就是痛苦…

Win YAPI + Jenkins 实现接口自动化测试

自动化测试 传统的接口自动化测试成本高,大量的项目没有使用自动化测试保证接口的质量,仅仅依靠手动测试,是非常不可靠和容易出错的。 为了解决这个问题,使用YAPI接口自动化测试功能,只需要配置每个接口的入参和对 RE…

网络类型以及数据链路层协议

网络类型以及数据链路层协议网络类型是根据我们数据链路层所运行的协议及规则来划分网络类型的分类P2P --- 点到点 --- point to pointMA --- 多点接入网络BMA --- 广播型多点接入网络NBMA --- 非广播型多点接入网络数据链路层协议MA网络以太网协议特点:需要使用MAC…

Java代码弱点与修复之——Explicit null dereferenced(显式空间接引用)

弱点描述 Explicit null dereferenced, 显示空间接引用。是 Coverity 静态代码分析工具检测到的一种中风险缺陷。这种缺陷通常发生在尝试使用空指针引用调用对象上的方法或访问属性时。 Explicit null dereferenced的缺陷可能会导致程序崩溃或产生不可预测的结果。 在Java语…

0102 MySQL05

1.约束 1.约束(constraint):在创建表时,可以给表中的字段加上一些约束,保证表中数据的完整性,有效性 常见的约束? 非空约束:not null 唯一性约束:unique 主键约束&am…

在VM16.X虚拟机上安装Android-X86 9.0

前提:电脑已安装好VM虚拟机, 第一步:下载好安卓9.0系统 https://www.fosshub.com/Android-x86.html 第二步:开始安装 1、新建虚拟机(按图片上的点一下步) 点浏览,确定虚拟机位置 处理器配置建…

深度剖析C语言预处理

致前行的人: 人生像攀登一座山,而找寻出路,却是一种学习的过程,我们应当在这过程中,学习稳定冷静,学习如何从慌乱中找到生机。 目录 1.程序翻译过程: 2.字符串宏常量 3.用宏定义充当注释符号 4…

【笔记】若依不分离的$.modal.open()打开多个子窗口,关闭子窗口刷新父窗口问题

前言 如题所述,当前遇到的问题是:我在若依不分离版的一个普通HTML页面A使用 $.modal.open()打开一个子窗口B,且在这个子窗口里再次使用 这个函数打开一个子窗口C,这时的情况就是 A 界面有子窗口 B, B 窗口又有一个子…

《系统架构设计》-06-面向领域思想和策略设计

文章目录1 面向领域思想1.1 架构设计与领域驱动1.1.1 领域驱动设计1.1.2 使用领域驱动设计的条件1.2 领域驱动设计核心概念1.2.1 策略维度1.2.2 技术维度2. 面向领域的策略设计2.1 通用语言2.2 领域与上下文2.2.1 架构轮回2.2.2 系统拆分子域界限上下文系统拆分策略2.2.3 上下文…

Mysql—主从复制

主从复制 创建mysql 基于docker创建2个mysql容器 1、拉取mysql镜像,这里拉取最新的8.0.20 docker pull mysql:latest2、使用镜像运行两个mysql容器:mysql 和 mysql-2 docker run -itd --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORDroot mysql …

Ubuntu系统升级16.04升级18.04

一、需求说明 作为Linux发行版中的后起之秀,Ubuntu 在短短几年时间里便迅速成长为从Linux初学者到实验室用计算机/服务器都适合使用的发行版,目前官网最新版本是22.04。Ubuntu16.04是2016年4月发行的版本,于2019年4月停止更新维护。很多软件支…

C++学习笔记之提高

目录C提高一.模板1.1.函数模板1.1.1语法1.1.2.普通函数与函数模板的区别1.1.3.普通函数与函数模板的调用规则1.1.4.模板的局限性1.2.类模板1.2.1.类模板与函数模板的区别1.2.2.类模板中的成员函数的创建时机1.2.3.类模板做函数的参数1.2.4.类模板与继承1.2.5.类模板成员函数类外…

cesium——飞行定位

Cesium的飞行定位,主要通过Viewer、Camera这两个类实现的。其中viewer.flyTo()、camera.flyTo()、camera.flyToBoundingSphere()这三个方法会有一个飞行动画的效果,所以会有飞行持续时间参数duration,默认是3秒。一、viewerflyTotarget&#…

电子台账:定义产品的行业代码和产品代码

1 简介水平过滤模板和垂直过滤模板定义好后,就可以进行数据抓取了。首次数据抓取后,用产品名称对产品代码表进行填充,程序会提示补充完善产品代码表,需要人工对产品代码表中的信息进行完善。产品代码表补充完整后,以后…

【微信小程序】如何使用阿里巴巴的icon自定义图标以及简单的下拉框组件实现全过程

前言 小编我将用CSDN记录软件开发之路上所学的心得与知识,有兴趣的小伙伴可以关注一下!也许一个人独行,可以走的很快,但是一群人结伴而行,才能走的更远!让我们在成长的道路上互相学习,让我们共…

CUDA By Example笔记--线程协作

1--使用线程实现GPU上的矢量求和 完整代码&#xff1a; # include <iostream> # define N (33 * 1024)__global__ void add(int* a, int* b, int* c){int tid threadIdx.x blockIdx.x * blockDim.x;while (tid < N){c[tid] a[tid] b[tid];tid blockDim.x * grid…