精华内容
下载资源
问答
  • traefik-helm-chart:Traefik v2掌舵图
  • traefik2-with-oauth2:在docker环境中全自动安装traefik 2和Google Oauth 2.0
  • Traefik2 LuaScript LuaScript是中间件,用于执行可访问API的lua脚本 使用的LUA VM 一个 在 关于 该中间件使您可以用LUA脚本编写业务逻辑 收到传入请求 添加/修改请求标头 添加/修改响应头 中断请求 对外部服务进行...
  • Traefik Service-Fabric-plugin 该提供程序插件允许Traefik查询Service Fabric管理API,以发现Service Fabric群集上当前正在运行哪些服务。 然后,提供程序将路由规则映射到这些服务实例。 提供者将考虑每个服务的...
  • helm3 部置traefik2

    2021-09-07 16:20:37
    一、添加traefik仓库 #添加 Traefik v2 helm chart helm repo add traefik ... # 更新下仓库 helm repo update #查询repo helm repo list ...二、部暑traefik2 # mkdir -p /data

    traefik详细说明:https://www.qikqiak.com/traefik-book/

    一、添加traefik仓库

    #添加 Traefik v2 helm chart
    helm repo add traefik https://containous.github.io/traefik-helm-chart
    
    # 更新下仓库
    helm repo update 
    
    #查询repo
    helm repo list
    traefik         https://containous.github.io/traefik-helm-chart 
    

    二、部暑traefik2

    #
    mkdir -p /data/traefik2
    cd /data/traefik2
    
    #下载traefik2
    helm pull traefik/traefik  --version=9.1.1
    
    #提取values.yaml文件
    tar zxvf traefik-9.1.1.tgz --strip-components 1 traefik/values.yaml 
    
    cat > /data/traefik2/start.sh << 'EOF'
    helm install traefik2 traefik-9.1.1.tgz -f values.yaml -n kube-system
    EOF
    
    bash /data/traefik2/start.sh
    

    三、更新traefik2

    #helm3 升级
    cat > /data/traefik2/upgrade.sh << 'EOF'
    helm upgrade traefik2 traefik-9.1.1.tgz -f values.yaml -n kube-system
    cp values.yaml values.yaml.bak_`date +%F_%R`
    EOF
    

    四、配置values.yaml
    选择部分配置

    deployment:
      #部暑的副本数量
      replicas: 1
    
    #let's encrypt配置
    #additionalArguments:
    # - "--certificatesresolvers.defalut.acme.storage=/data/acme.json"
    #  - --certificatesresolvers.default.acme.tlschallenge
    #  - --certificatesresolvers.default.acme.email=me@myself.com
    #  - --certificatesresolvers.default.acme.caserver=https://acme-staging-v02.api.letsencrypt.org/directory
    
    #日志相关配置
    logs:
      general:
        level: ERROR
      access:
        enabled: true
        format: json
        bufferingSize: 100
        filters: 
          statuscodes: "200,300-302"
          retryattempts: true
          minduration: 10ms
        fields:
          general:
            defaultmode: keep
            names: 
              ClientUsername: drop
          headers:
            defaultmode: drop
            names: 
              User-Agent: redact
              Authorization: drop
              Content-Type: keep
    
    #全局参数,开启dashboard,metrics等
    globalArguments:
      - "--global.checknewversion"
      - "--global.sendanonymoususage"
      - "--serversTransport.insecureSkipVerify=true"
      - "--api.insecure=true"
      - "--api.dashboard=true"
      - "--metrics.prometheus=true"
      - "--metrics.prometheus.buckets=0.100000, 0.300000, 1.200000, 5.000000"
      - "--metrics.prometheus.addEntryPointsLabels=true"
      - "--metrics.prometheus.addServicesLabels=true"
      - "--metrics.prometheus.entryPoint=metrics"
      - "--metrics.prometheus.manualrouting=true"
      #- "--entryPoints.metrics.address=:8020"
      #- "--metrics.prometheus.manualrouting=true"
      # zinkin tracing 配置
      - "--tracing.zipkin=true"
      - "--tracing.zipkin.httpEndpoint=http://localhost:9411/api/v2/spans"
      - "--tracing.zipkin.sameSpan=true"
      - "--tracing.zipkin.id128Bit=false"
      - "--tracing.zipkin.sampleRate=0.2"
    #端口暴露配置
    ports:
      traefik:
        port: 9000
        # hostPort: 9000
        # hostIP: 192.168.100.10
        expose: true
        exposedPort: 9000
        protocol: TCP
        nodePort: 29000
      web:
        port: 8000
        # hostPort: 8000
        expose: true
        exposedPort: 80
        protocol: TCP
        nodePort: 20080
        # redirectTo: websecure
      websecure:
        port: 8443
        # hostPort: 8443
        expose: true
        exposedPort: 443
        protocol: TCP
        nodePort: 20443
      #设置tcp代理  
      mongo:
        port: 27017
        expose: true
        exposedPort: 27017
        protocol: TCP
        #hostPort: 27017
        nodePort: 27017
    #资源限制
    resources:
      requests:
        cpu: "100m"
        memory: "50Mi"
      limits:
        cpu: "300m"
        memory: "150Mi"
    
    #端口暴露方式
    service:
      #type: LoadBalancer
      type: NodePort
    

    五、访问管理后台:
    http://192.168.11.211:29000/dashboard/#/

    在这里插入图片描述

    六 、把traefik的dashboard发布到http接口上

    cat > /data/traefik2/traefik_dashboard.yaml << 'EOF'
    apiVersion: traefik.containo.us/v1alpha1
    kind: IngressRoute
    metadata:
      name: traefik-dashboard-route
      namespace: kube-system      #配置命名空间
    spec:
      entryPoints:
        - web
    #  tls:
    #    secretName: cloudfe-cert-tls
      routes:
        - match: Host(`traefik.kids.cn`) && PathPrefix(`/`)  #配置域名
          kind: Rule
          services:
            - name: traefik2   #与sevicename对应
              port: 9000       #与serviceport对应
    EOF
    

    七、traefik中间件

    • 7.1basicauth验证

    帐号密码生成工具:http://web.chacuo.net/nethtpasswd

    cat > /data/traefik2/traefik_authsecret.yaml  << 'EOF'
    apiVersion: v1
    kind: Secret
    metadata:
      name: traefik-authsecret
      namespace: kube-system
    type: Opaque
    stringData:
      users: test:$apr1$XeP7Hl7a$HZggi6xLd5IlYFrOxFNpe1
    EOF
    

    配置 BasicAuth 中间件

    cat > /data/traefik2/traefik_basic_auth.yaml << 'EOF'
    apiVersion: traefik.containo.us/v1alpha1
    kind: Middleware
    metadata:
      name: traefik-basic-auth
      namespace: kube-system
    spec:
      basicAuth:
        secret: traefik-authsecret
    EOF
    

    重新配置 Ingress Route

    cat > /data/traefik2/traefik_dashboard.yaml << 'EOF'
    apiVersion: traefik.containo.us/v1alpha1
    kind: IngressRoute
    metadata:
      name: traefik-dashboard-route
      namespace: kube-system      #配置命名空间
    spec:
      entryPoints:
        - web
    #  tls:
    #    secretName: cloudfe-cert-tls
      routes:
        - match: Host(`traefik.kids.cn`)  #配置域名
          kind: Rule
          services:
            - name: traefik2   #与sevicename对应
              port: 9000       #与serviceport对应
          middlewares:
            - name: traefik-basic-auth
    EOF
    应用配置
    kubectl apply -f traefik_authsecret.yaml
    kubectl apply -f traefik_basic_auth.yaml
    kubectl apply -f traefik_dashboard.yaml
    

    访问地址:http://traefik.kids.cn:20080/dashboard/#/

    帐号,密码: test/test
    在这里插入图片描述

    • 7.2 https

    #自签证书

    cd /data/traefik2/
    #创建证书
    openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout traefik-tls.key -out traefik-tls.crt -subj "/CN=*.kids.cn"
    
    #通过 Secret 对象来引用证书文件
    kubectl create secret tls traefik-tls --cert=traefik-tls.crt --key=traefik-tls.key -n kube-system
    
    #修改 ingressroute
    cat  > /data/traefik2/traefik_dashboard_https.yaml << 'EOF'
    apiVersion: traefik.containo.us/v1alpha1
    kind: IngressRoute
    metadata:
      name: traefik-dashboard-route-tls
      namespace: kube-system      #配置命名空间
    spec:
      entryPoints:
        - websecure
      routes:
        - match: Host(`traefik.kids.cn`)  #配置域名
          kind: Rule
          services:
            - name: traefik2   #与sevicename对应
              port: 9000       #与serviceport对应
          middlewares:
            - name: traefik-basic-auth
      tls:
        secretName: traefik-tls
    EOF
    

    Let’s Encrypt 来进行自动化 HTTPS

    cat > /data/traefik2/certificatesresolvers.yaml << 'EOF'
    certificatesresolvers:
      default:
        acme:
          tlsChallenge: {}
          email: "xbzeng@163.com"
          storage: "acme.json"
    EOF
    
    #在IngressRoute中引用
      tls:
        certResolver: default
    

    7.3 希望用户通过 https 来访问应用

    cat > /data/traefik2/redirect-https.yaml << 'EOF'
    apiVersion: traefik.containo.us/v1alpha1
    kind: Middleware
    metadata:
      name: redirect-https
      namespace: kube-system
    spec:
      redirectScheme:
        scheme: https
        port: "20443"
        permanent: true
    EOF
    

    在IngressRoute中引用中间件

          middlewares:
            - name: redirect-https      #引用中间件
    

    7.4 替换路径

    apiVersion: traefik.containo.us/v1alpha1
    kind: Middleware
    metadata:
      name: test-replacepathregex
      namespace: kube-system
    spec:
      replacePathRegex:
        regex: ^/foo/(.*)
        replacement: /bar/$1
    

    在IngressRoute中引用中间件

          middlewares:
            - name: test-replacepathregex      #引用中间件
    

    7.5 去掉路径

    apiVersion: traefik.containo.us/v1alpha1
    kind: Middleware
    metadata:
      name: test-stripprefix
    spec:
      stripPrefix:
        prefixes:
          - /foobar
          - /fiibar
    

    在IngressRoute中引用中间件

          middlewares:
            - name: test-stripprefix      #引用中间件
    

    7.6 TCP代理

    cat > /data/traefik2/tcp_mongo.yaml << 'EOF'
    apiVersion: traefik.containo.us/v1alpha1
    kind: IngressRouteTCP
    metadata:
      name: mongo-route
      namespace: base      #配置命名空间
    spec:
      entryPoints:
        - mongo
      routes:
        - match: Host(`*`)  # TCP 路由配置需要 SNI,而 SNI 有是依赖 TLS 的,所以我们需要配置证书才行,但是如果没有证书的话,我们可以使用通配符 *
          kind: Rule
          services:
          - name: mongo   #与sevicename对应
            port: 27017       #与serviceport对应
    EOF
    
    或者
    cat > /data/traefik2/tcp_mongo_sni.yaml << 'EOF'
    apiVersion: traefik.containo.us/v1alpha1
    kind: IngressRouteTCP
    metadata:
      name: mongo-route
      namespace: base      #配置命名空间
    spec:
      entryPoints:
        - mongo
      routes:
        - match: Host(`mongo.kids.cn`)  #配置域名
          kind: Rule
          services:
          - name: mongo   #与sevicename对应
            port: 27017       #与serviceport对应
      tls:
        secretName: traefik-tls
        passthrough: true
    EOF
    
    展开全文
  • traefik迁移工具 从Traefik v1到Traefik v2的迁移工具。 特征: :sailboat: 将“ Ingress”迁移到Traefik“ IngressRoute”资源。 :locked: 将acme.json文件从Traefik v1迁移到Traefik v2。
  • 更简单的 Traefik 2 使用方式 经过一年多的实践,对于使用 Traefik 有了一些更深入的体会,本篇先来介绍如何简化使用,后续会逐步展开聊聊如何在云上使用这款“云原生”工具,以及结合它做一些提升业务效率和开发...

    更简单的 Traefik 2 使用方式

    经过一年多的实践,对于使用 Traefik 有了一些更深入的体会,本篇先来介绍如何简化使用,后续会逐步展开聊聊如何在云上使用这款“云原生”工具,以及结合它做一些提升业务效率和开发效率的实践。

    Traefik 2 使用指南,愉悦的开发体验配置基于Traefik v2的 Web 服务器 文章中,使用 Traefik 的方案引入了比较多的配置,如果你并不是在一个复杂场景使用,这样的配置是可以简化的。

    简化程序配置文件

    一般情况下将参数变为配置,更利于在版本控制软件中进行版本管理。在 v2 版本中,因为有了动态配置的概念,传统的固定配置,使用简写的参数来替换,并记录在容器启动配置中,可以在减少分发文件数量的情况下,达到相同的效果。

    使用参数取代 traefik.toml

    在之前的文章中,我提供了一般情况下,使用的默认配置内容:

    [global]
      checkNewVersion = false
      sendAnonymousUsage = false
    
    [log]
      level = "WARN"
      format = "common"
    
    [api]
      dashboard = true
      insecure = true
    
    [ping]
    
    [accessLog]
    
    [providers]
      [providers.docker]
        watch = true
        exposedByDefault = false
        endpoint = "unix:///var/run/docker.sock"
        swarmMode = false
        useBindPortIP = false
        network = "traefik"
      [providers.file]
        watch = true
        directory = "/etc/traefik/config"
        debugLogGeneratedTemplate = true
    
    [entryPoints]
      [entryPoints.http]
        address = ":80"
      [entryPoints.https]
        address = ":443"
    

    想要达到相同的效果,只需要在 command 字段内添加下面的内容即可:

    version: '3'
    
    services:
    
      traefik:
    ...
        command:
          - "--global.sendanonymoususage=false"
          - "--global.checknewversion=false"
          - "--entrypoints.http.address=:80"
          - "--entrypoints.https.address=:443"
          - "--api=true"
          - "--api.insecure=true"
          - "--api.dashboard=true"
          - "--api.debug=false"
          - "--ping=true"
          - "--log.level=warn"
          - "--log.format=common"
          - "--accesslog=false"
          - "--providers.docker=true"
          - "--providers.docker.watch=true"
          - "--providers.docker.exposedbydefault=false"
          - "--providers.docker.endpoint=unix:///var/run/docker.sock"
          - "--providers.docker.swarmMode=false"
          - "--providers.docker.useBindPortIP=false"
          - "--providers.docker.network=traefik"
          - "--providers.file=true"
          - "--providers.file.watch=true"
          - "--providers.file.directory=/etc/traefik/config"
          - "--providers.file.debugloggeneratedtemplate=true"
    ...
    

    现在,你就可以将 traefik.toml 配置文件删除掉了。

    简化 dashboard.toml

    前文中,我们将 Traefik 的内置 dashboard 等路由通过配置文件来定义,像下面这样。

    [http.middlewares.dash-compress.compress]
    [http.middlewares.dash-auth.basicAuth]
      users = [
        "test:$apr1$H6uskkkW$IgXLP6ewTrSuBkTrqE8wj/",
      ]
    
    [http.routers.dashboard-redirect-https]
      rule = "Host(`dashboard.lab.io`, `dashboard.lab.com`)"
      entryPoints = ["http"]
      service = "noop"
      middlewares = ["https-redirect"]
      priority = 100
    
    [http.routers.dashboard]
      rule = "Host(`dashboard.lab.io`, `dashboard.lab.com`)"
      entrypoints = ["https"]
      service = "dashboard@internal"
      middlewares = ["dash-compress"]
      [http.routers.dashboard.tls]
    
    [http.routers.api]
      rule = "Host(`dashboard.lab.io`, `dashboard.lab.com`) && PathPrefix(`/api`)"
      entrypoints = ["https"]
      service = "api@internal"
      middlewares = ["dash-compress"]
      [http.routers.api.tls]
    
    [http.routers.ping]
      rule = "Host(`dashboard.lab.io`, `dashboard.lab.com`) && PathPrefix(`/ping`)"
      entrypoints = ["https"]
      service = "ping@internal"
      middlewares = ["dash-compress"]
      [http.routers.ping.tls]
    

    其实,只需要将配置保留剩下这两条需要被预先定义的“中间件”即可,如果你不需要页面压缩,或者不需要访问密码,那么也可以不对下面的内容进行保存:

    [http.middlewares.dash-compress.compress]
    [http.middlewares.dash-auth.basicAuth]
      users = [
        "test:$apr1$H6uskkkW$IgXLP6ewTrSuBkTrqE8wj/",
      ]
    

    接着在容器配置中添加一些 traefik 能够解析处理的规则在 labels 字段中即可:

    version: '3'
    
    services:
    
      traefik:
    ...    
        labels:
          - "traefik.enable=true"
          - "traefik.docker.network=traefik"
          # 默认请求转发 https 端口
          - "traefik.http.routers.traefik-dash-default.middlewares=https-redirect@file"
          - "traefik.http.routers.traefik-dash-default.entrypoints=http"
          - "traefik.http.routers.traefik-dash-default.rule=Host(`dashboard.guava.lab.com`)"
          - "traefik.http.routers.traefik-dash-default.service=dashboard@internal"
          # 处理网页
          - "traefik.http.routers.traefik-dash-web.entrypoints=https"
          - "traefik.http.routers.traefik-dash-web.rule=Host(`dashboard.guava.lab.com`) && PathPrefix(`/`)"
          - "traefik.http.routers.traefik-dash-web.tls=true"
          - "traefik.http.routers.traefik-dash-web.service=dashboard@internal"
          # 处理接口
          - "traefik.http.routers.traefik-dash-api.entrypoints=https"
          - "traefik.http.routers.traefik-dash-api.rule=Host(`dashboard.guava.lab.com`) && (PathPrefix(`/api`) || PathPrefix(`/dashboard`))"
          - "traefik.http.routers.traefik-dash-api.tls=true"
          - "traefik.http.routers.traefik-dash-api.service=api@internal"
    ...
    

    单独抽象保存的 default.toml 配置

    虽然我们将 90% 的内容都迁移到了 compose 配置文件中,但是还是有一些内容暂时是不好进行重写的,比如下面提到的“内容Gzip压缩”和“HTTP转发HTTPS”:

    # 提供 Gzip 压缩
    [http.middlewares.gzip.compress]
    
    # tricks 实现,提供 HTTP 默认转发 HTTPS
    # https://github.com/containous/traefik/issues/4863#issuecomment-491093096
    [http.services]
      [http.services.noop.LoadBalancer]
         [[http.services.noop.LoadBalancer.servers]]
            url = "" # or url = "localhost"
    
    [http.routers]
      [http.routers.https-redirect]
        entryPoints = ["http"]
        rule = "HostRegexp(`{any:.*}`)"
        middlewares = ["https-redirect"]
        service = "noop"
    
    [http.middlewares.https-redirect.redirectScheme]
      scheme = "https"
    

    这里倒不是说不能够在应用内配置,而是如果这两个中间件在应用内配置,会出现每个应用都需要配置重复配置的问题。尽管独立的配置会让应用的可迁移性更好,然而这份配置可以提供不论是在本地、私有云,还是公有云 SLB 环境下的一致行为,维护一份配置,总比维护几份要来的方便,不是吗?

    完整的容器配置

    一如既往,这里给出完整的 compose 配置:

    version: '3'
    
    services:
    
      traefik:
        container_name: traefik
        image: traefik:v2.3.4
        restart: always
        ports:
          - 80:80
          - 443:443
        networks:
          - traefik
        command:
          - "--global.sendanonymoususage=false"
          - "--global.checknewversion=false"
          - "--entrypoints.http.address=:80"
          - "--entrypoints.https.address=:443"
          - "--api=true"
          - "--api.insecure=true"
          - "--api.dashboard=true"
          - "--api.debug=false"
          - "--ping=true"
          - "--log.level=warn"
          - "--log.format=common"
          - "--accesslog=false"
          - "--providers.docker=true"
          - "--providers.docker.watch=true"
          - "--providers.docker.exposedbydefault=false"
          - "--providers.docker.endpoint=unix:///var/run/docker.sock"
          - "--providers.docker.swarmMode=false"
          - "--providers.docker.useBindPortIP=false"
          - "--providers.docker.network=traefik"
          - "--providers.file=true"
          - "--providers.file.watch=true"
          - "--providers.file.directory=/etc/traefik/config"
          - "--providers.file.debugloggeneratedtemplate=true"
        volumes:
          # 仅限标准的 Linux 环境
          - /etc/localtime:/etc/localtime:ro
          - /etc/timezone:/etc/timezone:ro
          - /var/run/docker.sock:/var/run/docker.sock:ro
          - ./config/:/etc/traefik/config/:ro
          - ./ssl/:/data/ssl/:ro
        labels:
          - "traefik.enable=true"
          - "traefik.docker.network=traefik"
          # 默认请求转发 https 端口
          - "traefik.http.routers.traefik-dash-default.middlewares=https-redirect@file"
          - "traefik.http.routers.traefik-dash-default.entrypoints=http"
          - "traefik.http.routers.traefik-dash-default.rule=Host(`dashboard.guava.lab.com`)"
          - "traefik.http.routers.traefik-dash-default.service=dashboard@internal"
          # 处理网页
          - "traefik.http.routers.traefik-dash-web.entrypoints=https"
          - "traefik.http.routers.traefik-dash-web.rule=Host(`dashboard.guava.lab.com`) && PathPrefix(`/`)"
          - "traefik.http.routers.traefik-dash-web.tls=true"
          - "traefik.http.routers.traefik-dash-web.service=dashboard@internal"
          # 处理接口
          - "traefik.http.routers.traefik-dash-api.entrypoints=https"
          - "traefik.http.routers.traefik-dash-api.rule=Host(`dashboard.guava.lab.com`) && (PathPrefix(`/api`) || PathPrefix(`/dashboard`))"
          - "traefik.http.routers.traefik-dash-api.tls=true"
          - "traefik.http.routers.traefik-dash-api.service=api@internal"
        healthcheck:
          test: ["CMD-SHELL", "wget -q --spider --proxy off localhost:8080/ping || exit 1"]
          interval: 3s
          retries: 12
        logging:
          driver: "json-file"
          options:
            max-size: "1m"
    
    networks:
      traefik:
        external: true
    

    最后

    官方在前一阵推出了 https://traefik.io/traefik-pilot/,除了作为统一的管理中心之外,还提供了许多有用的中间件,比如请求/响应头改写、IP 禁止名单、IP地址转换、fail2ban 等等。

    因为暂时官方无意将 pilot 开源(可能也会是长期状况),如果你不介意“联公网”使用,可以试试注册 pilot 使用。

    –EOF


    我现在有一个小小的折腾群,里面聚集了一些喜欢折腾的小伙伴。

    在不发广告的情况下,我们在里面会一起聊聊软件、HomeLab、编程上的一些问题,也会在群里不定期的分享一些技术沙龙的资料。

    喜欢折腾的小伙伴欢迎扫码添加好友。(请注明来源和目的,否则不会通过审核)

    关于折腾群入群的那些事


    本文使用「署名 4.0 国际 (CC BY 4.0)」许可协议,欢迎转载、或重新修改使用,但需要注明来源。 署名 4.0 国际 (CC BY 4.0)

    本文作者: 苏洋

    创建时间: 2020年12月02日
    统计字数: 7102字
    阅读时间: 15分钟阅读
    本文链接: https://soulteary.com/2020/12/02/easier-way-to-use-traefik-2.html

    展开全文
  • 在kubernetes中安装traefik2

    千次阅读 2020-05-25 09:53:33
    traefik2 DaemonSet 云原生微服务中我们使用了traefik2来作为我们的网关,当然我们也是通过DaemonSet(也可以使用deployment)的方式来部署到Kubernetes集群中。 DaemonSet部署之后的pod有如下特征 Kubernetes集群中...

    traefik2 DaemonSet

    云原生微服务中我们使用了traefik2来作为我们的网关,当然我们也是通过DaemonSet(也可以使用deployment)的方式来部署到Kubernetes集群中。
    DaemonSet部署之后的pod有如下特征

    Kubernetes集群中的每个work node上都有这个pod(traefik2实例)
    每个work node上只有一个这样的pod实例
    当有新的work node加入Kubernetes集群后,该pod会自动在新加入的work node上被创建出来,而当旧的work node被删除后,它上面的pod也会被相应的删除掉。

    比如我们的traefik2的DaemonSet像下面这样

    traefik-ds.png

    需要注意的是args从configMap中引入了4个变量,其值分别如下:

    # 访问http端口
    web_port=80
    
    # 访问https端口
    websecure_port=443
    
    # traefik dashborad端口(默认)
    traefik_port=8080
    
    # 监控哪个namespace资源,如果有多个,则以逗号连接。默认是所有namespace
    watch_namespace=exmpale-beta
    

    如果你使用DaemonSet的方式安装两个相同的traefik,那么上面提及到的4个变量都要进行对应的修改
    一个traefik提供对内服务的访问,一个traefik提供对外服务的访问

    使用了kubernetes,流量路由就如下所示

        internet
            |
       [ Ingress ]
       --|-----|--
       [ Services ]
    
    

    这里定义的80/443端口就是外部的请求要通过这两个端口才能转发到Service(kubernetes)中。

    指定关注的的namespace

    如果我们不指定traefik2监控的是哪个namespace的资源(默认是所有的),那么当我们访问的时候就可能访问到其他namespace的资源

    curl -H 'Host: www.example-beta.com' www.example-rc.com
    

    example-beta.com部署在example-beta这个namespace,而example-rc.com部署在example-rc这个namespace,但是通过上面的访问方式就能访问到example-beta的资源,很明显这并不安全。

    traefik-ingressroute-1.png

    traefik ingress解析规则是根据Host头来解析的,如果我们偷天换日就会导致访问了另外一个namespace的资源。

    关于traefik ingress route我在下面还会提及

    使用traefik2 IngressRoute代替Kubernetes Ingress

    traefik2不仅可以作为网关,它还可以作为ingress controller(另一个比较出名的的nginx),有了它我们需要使用ingress route来配置我们的匹配规则而不再使用kubernetes的ingress。

    之前kubernetes 的ingress规则是这样的

    ingress.png

    而使用了ingress route之后则是这样的

    traefik-ingressroute-2.png

    为什么需要CRD?

    IngressRoute这个Kind是traefik提供的,kubernetes并不认识它呀,不过还好kubernetes支持CRD(Custom Resource Definitions)。我们只需要加上CRD即可。

    所有关于kubernetes的CRD配置请参考官方文档: https://docs.traefik.io/reference/dynamic-configuration/kubernetes-crd/

    访问集群资源(RBAC)

    这里着重需要说明的是RBAC: 基于角色的访问控制(Role-Based Access Control)的配置

    traefik-cluster-role.png

    traefik-cluster-role-binding-user.png

    RBAC实际上很简单,想想平时做的业务系统,你只要知道下面这几个概念你就知道了。

    Kubernetes中的service,ingress,configmap,secret等都是资源,一般是一个账号,属于什么角色,这个角色可以操控哪些资源

    比如HR可以查看员工工资,而员工只能知道自己的工资

    所以Kubernetes中也存在着三个基本概念

    1. Role : 角色,它其实是一组规则,定义了一组对Kubernetes API对象的操作权限
    2. Subject:被作用者,既可以是“人”,也可以是“机器”,也可以使你在Kubernetes里定义的“用
      户”。
    3. RoleBinding:定义了“被作用者”和“角色”的绑定关系

    role-binding-user.png

    Role对象的rules字段,就是它所定义的权限规则。在上面的例子里,这条规则的含义就是:允许“被作用者”,对mynamespace下面的Pod对象,进行GET、WATCH和LIST操作。

    RoleBinding对象里定义了一个subjects字段,即“被作用者”。它的类型是User,即Kubernetes里的用户。这个用户的名字是example-user。

    这里的User实际上是Kubernetes的内置账户ServiceAccount。

    在Kubernetes中Role和RoleBinding对象都是Namespaced对象,它们对权限的限制规则仅在它们自己的Namespace内有效。 对于非Namespaced(Non-namespaced)对象(比如:Node),或者,某一个Role想要作用于所有的Namespace的时候,就需要使用ClusterRole和ClusterRoleBinding这两个组合了。(也就是我们上面贴出来的配置)

    至此,traefik2已经安装完毕。

    总结

    对应安装第三方提供的组件,安装是存在固定流程的。

    1. 使用DaemonSet/Deployment的方式安装
    2. 指定CRD
    3. 指定RBAC

    对于traefik2而已,如果你想要在work node上安装两个traefik(一个对内,一个对外),那么你至少需要改变三个端口。

    展开全文
  • https://github.com/Voronenko/traefik2-compose-template 除了经典的docker化的项目之外,我还有其他的Kubernetes项目。尽管Kubernetes已经成为容器编排的事实标准,但是不得不承认Kubernetes是一个既消耗资源又...

    作者简介

    Vyacheslav,拥有运维和项目管理经验的软件工程师

    在这里插入图片描述

    这篇文章将承接我此前搭建的本地Docker开发环境,具体步骤已经放在在以下网址:

    https://github.com/Voronenko/traefik2-compose-template

    除了经典的docker化的项目之外,我还有其他的Kubernetes项目。尽管Kubernetes已经成为容器编排的事实标准,但是不得不承认Kubernetes是一个既消耗资源又消耗金钱的平台。由于我并不经常需要外部集群,因此我使用轻量级K3s发行版来进行Kubernetes本地开发。

    K3s是为IoT和边缘计算而构建的经过认证的Kubernetes发行版之一,还能够按产品规模部署到VM。

    我使用K3s的方式是这样的:在我的工作笔记本上本地安装K3s,尽管有时我需要在本地部署较重的测试工作负载,为此,我准备了两个神器——两个运行ESXi的外部Intel NUCs。

    默认情况下,K3s安装Traefik 1.x作为ingress,如果你对此十分满意,那么无需往下继续阅读了。

    在我的场景中,我同时会牵涉到好几个项目,特别是经典的docker和docker swarm,因此我经常遇到在独立模式下部署Traefik的情况。

    因此,本文其余部分将深入介绍如何将外部traefik2配置为K3s集群的ingress。

    安装Kubernetes K3s系列集群

    你可以按照常规方式使用命令curl -sfL https://get.k3s.io | sh -安装K3s,或者你可以使用轻量实用程序k3sup安装(https://github.com/alexellis/k3sup)。具体步骤在之前的文章介绍过。

    与我们的设置不同的是,我们使用命令--no-deploy traefik专门安装了不带traefik组件的K3s。

    export CLUSTER_MASTER=192.168.3.100
    export CLUSTER_DEPLOY_USER=slavko
    k3sup install --ip $CLUSTER_MASTER --user $CLUSTER_DEPLOY_USER --k3s-extra-args '--no-deploy traefik'
    

    执行后,你将获得使用kubectl所需的连接详细信息。安装K3s后,你可以快速检查是否可以看到节点。

    # Test your cluster with - export path to k3s cluster kubeconfig:
    export KUBECONFIG=/home/slavko/kubeconfig
    kubectl get node -o wide
    

    注:这里没有固定的安装模式,你甚至可以使用docker-compose自行启动它。

    server:
      image: rancher/k3s:v0.8.0
      command: server --disable-agent --no-deploy traefik
      environment:
        - K3S_CLUSTER_SECRET=somethingtotallyrandom
        - K3S_KUBECONFIG_OUTPUT=/output/kubeconfig.yaml
        - K3S_KUBECONFIG_MODE=666
      volumes:
        # k3s will generate a kubeconfig.yaml in this directory. This volume is mounted
        # on your host, so you can then 'export KUBECONFIG=/somewhere/on/your/host/out/kubeconfig.yaml',
        # in order for your kubectl commands to work.
        - /somewhere/on/your/host/out:/output
        # This directory is where you put all the (yaml) configuration files of
        # the Kubernetes resources.
        - /somewhere/on/your/host/in:/var/lib/rancher/k3s/server/manifests
      ports:
        - 6443:6443
    
    node:
      image: rancher/k3s:v0.8.0
      privileged: true
      links:
        - server
      environment:
        - K3S_URL=https://server:6443
        - K3S_CLUSTER_SECRET=somethingtotallyrandom
      volumes:
        # this is where you would place a alternative traefik image (saved as a .tar file with
        # 'docker save'), if you want to use it, instead of the traefik:v2.0 image.
        - /sowewhere/on/your/host/custom-image:/var/lib/rancher/k3s/agent/images
    

    配置Traefik 2,与Kubernetes一起使用

    在文章开头提到的链接中,我已经在我的系统中安装了Traefik 2,并根据该链接内容,服务于一些需求。现在是时候配置Traefik 2 Kubernetes后端了。

    Traefik 2使用CRD(自定义资源定义)来完成这一点。定义的最新示例可以在以下链接中找到,但这些示例仅适用于Traefik 2也作为Kubernetes工作负载的一部分执行的情况:

    https://docs.traefik.io/reference/dynamic-configuration/kubernetes-crd/

    对于外部Traefik 2,我们仅需要以下描述的定义子集。

    我们引入一系列自定义资源定义,以允许我们来描述我们的Kubernetes服务将会如何暴露到外部,traefik-crd.yaml

    apiVersion: apiextensions.k8s.io/v1beta1
    kind: CustomResourceDefinition
    metadata:
      name: ingressroutes.traefik.containo.us
    
    spec:
      group: traefik.containo.us
      version: v1alpha1
      names:
        kind: IngressRoute
        plural: ingressroutes
        singular: ingressroute
      scope: Namespaced
    
    ---
    apiVersion: apiextensions.k8s.io/v1beta1
    kind: CustomResourceDefinition
    metadata:
      name: ingressroutetcps.traefik.containo.us
    
    spec:
      group: traefik.containo.us
      version: v1alpha1
      names:
        kind: IngressRouteTCP
        plural: ingressroutetcps
        singular: ingressroutetcp
      scope: Namespaced
    
    ---
    apiVersion: apiextensions.k8s.io/v1beta1
    kind: CustomResourceDefinition
    metadata:
      name: middlewares.traefik.containo.us
    
    spec:
      group: traefik.containo.us
      version: v1alpha1
      names:
        kind: Middleware
        plural: middlewares
        singular: middleware
      scope: Namespaced
    
    ---
    apiVersion: apiextensions.k8s.io/v1beta1
    kind: CustomResourceDefinition
    metadata:
      name: tlsoptions.traefik.containo.us
    
    spec:
      group: traefik.containo.us
      version: v1alpha1
      names:
        kind: TLSOption
        plural: tlsoptions
        singular: tlsoption
      scope: Namespaced
    
    ---
    apiVersion: apiextensions.k8s.io/v1beta1
    kind: CustomResourceDefinition
    metadata:
      name: traefikservices.traefik.containo.us
    
    spec:
      group: traefik.containo.us
      version: v1alpha1
      names:
        kind: TraefikService
        plural: traefikservices
        singular: traefikservice
      scope: Namespaced  
    

    同时,我们需要集群角色traefik-ingress-controller,以提供对服务、端点和secret的只读访问权限以及自定义的traefik.containo.us组,traefik-clusterrole.yaml

    kind: ClusterRole
    apiVersion: rbac.authorization.k8s.io/v1beta1
    metadata:
      name: traefik-ingress-controller
    
    rules:
      - apiGroups:
          - ""
        resources:
          - services
          - endpoints
          - secrets
        verbs:
          - get
          - list
          - watch
      - apiGroups:
          - extensions
        resources:
          - ingresses
        verbs:
          - get
          - list
          - watch
      - apiGroups:
          - extensions
        resources:
          - ingresses/status
        verbs:
          - update
      - apiGroups:
          - traefik.containo.us
        resources:
          - middlewares
        verbs:
          - get
          - list
          - watch
      - apiGroups:
          - traefik.containo.us
        resources:
          - ingressroutes
        verbs:
          - get
          - list
          - watch
      - apiGroups:
          - traefik.containo.us
        resources:
          - ingressroutetcps
        verbs:
          - get
          - list
          - watch
      - apiGroups:
          - traefik.containo.us
        resources:
          - tlsoptions
        verbs:
          - get
          - list
          - watch
      - apiGroups:
          - traefik.containo.us
        resources:
          - traefikservices
        verbs:
          - get
          - list
          - watch
    

    最后,我们需要系统服务账号traefik-ingress-controller与之前创建的集群角色traefik-ingress-controller相关联。

    ---
    kind: ServiceAccount
    apiVersion: v1
    metadata:
      namespace: kube-system
      name: traefik-ingress-controller
    
    ---
    kind: ClusterRoleBinding
    apiVersion: rbac.authorization.k8s.io/v1beta1
    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: kube-system
    

    我们应用以上资源之后:

    apply:
      kubectl apply -f traefik-crd.yaml
      kubectl apply -f traefik-clusterrole.yaml
      kubectl apply -f traefik-service-account.yaml
    

    我们已经准备好开始调整Traefik 2

    将Traefik 2指向K3s集群

    根据Traefik文档的建议,当Traefik部署到Kubernetes中时,它将读取环境变量KUBERNETES_SERVICE_HOST和KUBERNETES_SERVICE_PORT或KUBECONFIG来构造端点。

    /var/run/secrets/kubernetes.io/serviceaccount/token中查找访问token,而SSL CA证书将在/var/run/secrets/kubernetes.io/serviceaccount/ca.crt.中查找。当部署到Kubernetes内部时,两者都会自动提供挂载。

    当无法找到环境变量时,Traefik会尝试使用external-cluster客户端连接到Kubernetes API server。这一情况下,需要设置endpoint。具体来说,可以将其设置为kubectl代理使用的URL,以使用相关的kubeconfig授予的身份验证和授权连接到Kubernetes集群。

    Traefik 2可以使用任何受支持的配置类型来静态配置-toml、yaml或命令行交换。

    [providers.kubernetesCRD]
      endpoint = "http://localhost:8080"
      token = "mytoken"
    
    providers:
      kubernetesCRD:
        endpoint = "http://localhost:8080"
        token = "mytoken"
        # ...
    
    --providers.kubernetescrd.endpoint=http://localhost:8080 
    --providers.kubernetescrd.token=mytoken
    

    第一次运行时,如果你在外部有Traefik,很有可能没有traefik-ingress-controller访问token来指定mytoken。那么,你需要执行以下命令:

    # Check all possible clusters, as your .KUBECONFIG may have multiple contexts:
    kubectl config view -o jsonpath='{"Cluster name\tServer\n"}{range .clusters[*]}{.name}{"\t"}{.cluster.server}{"\n"}{end}'
    
    # Output kind of
    # Alias tip: k config view -o jsonpath='{"Cluster name\tServer\n"}{range .clusters[*]}{.name}{"\t"}{.cluster.server}{"\n"}{end}'
    # Cluster name  Server
    # default  https://127.0.0.1:6443
    
    # You are interested in: "default", if you did not name it differently
    
    # Select name of cluster you want to interact with from above output:
    export CLUSTER_NAME="default"
    
    # Point to the API server referring the cluster name
    export APISERVER=$(kubectl config view -o jsonpath="{.clusters[?(@.name==\"$CLUSTER_NAME\")].cluster.server}")
    # usually https://127.0.0.1:6443
    
    # Gets the token value
    export TOKEN=$(kubectl get secrets -o jsonpath="{.items[?(@.metadata.annotations['kubernetes\.io/service-account\.name']=='traefik-ingress-controller')].data.token}" --namespace kube-system|base64 --decode)
    
    # Explore the API with TOKEN
    

    如果成功了,你应该收到以下响应:

    {
      "kind": "APIVersions",
      "versions": [
        "v1"
      ],
      "serverAddressByClientCIDRs": [
        {
          "clientCIDR": "0.0.0.0/0",
          "serverAddress": "192.168.3.100:6443"
        }
      ]
    

    以及一些事实,如token:

    eyJhbGciOiJSUzI1NiIsImtpZCI6IjBUeTQyNm5nakVWbW5PaTRRbDhucGlPeWhlTHhxTXZjUDJsRmNacURjVnMifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJ0cmFlZmlrLWluZ3Jlc3MtY29udHJvbGxlci10b2tlbi12emM3diIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50Lm5hbWUiOiJ0cmFlZmlrLWluZ3Jlc3MtY29udHJvbGxlciIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6ImQ5NTc3ZTkxLTdlNjQtNGMwNi1iZDgyLWNkZTk0OWM4MTI1MSIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDprdWJlLXN5c3RlbTp0cmFlZmlrLWluZ3Jlc3MtY29udHJvbGxlciJ9.Mk8EBS4soO8uX-uSnV3o4qZKR6Iw6bgeSmPhHbJ2fjuqFgLnLh4ggxa-N9AqmCsEWiYjSi5oKAu986UEC-_kGQh3xaCYsUwlkM8147fsnwCbomSeGIct14JztVL9F8JwoDH6T0BOEjn-J9uY8-fUKYL_Y7uTrilhFapuILPsj_bFfgIeOOapRD0XshKBQV9Qzg8URxyQyfzl68ilm1Q13h3jLj8CFE2RlgEUFk8TqYH4T4fhfpvV-gNdmKJGODsJDI1hOuWUtBaH_ce9w6woC9K88O3FLKVi7fbvlDFrFoJ2iVZbrRALPjoFN92VA7a6R3pXUbKebTI3aUJiXyfXRQ
    

    根据上次响应的API server的外部地址:https://192.168.3.100:6443

    同样,提供的token中没有任何特殊之处:这是JWT的token,你可以使用https://jwt.io/#debugger-io,检查它的内容。

    {
      "alg": "RS256",
      "kid": "0Ty426ngjEVmnOi4Ql8npiOyheLxqMvcP2lFcZqDcVs"
    }
    {
      "iss": "kubernetes/serviceaccount",
      "kubernetes.io/serviceaccount/namespace": "kube-system",
      "kubernetes.io/serviceaccount/secret.name": "traefik-ingress-controller-token-vzc7v",
      "kubernetes.io/serviceaccount/service-account.name": "traefik-ingress-controller",
      "kubernetes.io/serviceaccount/service-account.uid": "d9577e91-7e64-4c06-bd82-cde949c81251",
      "sub": "system:serviceaccount:kube-system:traefik-ingress-controller"
    }
    

    正确的配置非常重要,因此请确保对APISERVER的两个调用均返回合理的响应。

    export APISERVER=YOURAPISERVER
    export TOKEN=YOURTOKEN
    
    curl -X GET $APISERVER/api --header "Authorization: Bearer $TOKEN" --insecure
    
    curl -X GET $APISERVER/api/v1/endpoints --header "Authorization: Bearer $TOKEN" --insecure
    

    创建其他访问token

    控制器循环确保每个服务账户都有一个带有API token的secret,可以像我们之前那样被发现。

    此外,你还可以为一个服务账户创建额外的token,创建一个ServiceAccountToken类型的secret,并为服务账户添加一个注释,控制器会用生成的token来更新它。

    ---
    apiVersion: v1
    kind: Secret
    namespace: kube-system
    metadata:
      name: traefik-manual-token
      annotations:
        kubernetes.io/service-account.name: traefik-ingress-controller
    type: kubernetes.io/service-account-token
    
    # Any tokens for non-existent service accounts will be cleaned up by the token controller.
    
    # kubectl describe secrets/traefik-manual-token
    

    用以下命令创建:

    kubectl create -f ./traefik-service-account-secret.yaml
    kubectl describe secret traefik-manual-token
    

    删除/无效:

    kubectl delete secret traefik-manual-token
    

    对外部traefik 2的更改构成定义

    我们需要在文章开头给出的链接中获得的traefik2配置进行哪些更改?

    https://github.com/Voronenko/traefik2-compose-template

    a) 我们在新文件夹kubernetes_data中存储ca.crt文件,该文件用于验证对Kubernetes授权的调用。这是可以在kubeconfig文件的clusters-> cluster-> certificate-authority-data下找到的证书。

    该volume将映射在/var/run/secrets/kubernetes.io/serviceaccount下以获取官方Traefik 2镜像

    volumes:
        ...
          - ./kubernetes_data:/var/run/secrets/kubernetes.io/serviceaccount
    

    b) 调整Traefik 2 kubernetescrd后端以提供3个参数:endpoint、证书路径和token。请注意,作为外部Traefik作为docker容器,你需要指定正确的endpoint地址,并确保以安全的方式进行。

      - "--providers.kubernetescrd=true"
          - "--providers.kubernetescrd.endpoint=https://192.168.3.100:6443"
          - "--providers.kubernetescrd.certauthfilepath=/var/run/secrets/kubernetes.io/serviceaccount/ca.crt"
          - "--providers.kubernetescrd.token=YOURTOKENWITHOUTANYQUOTES
    

    如果你都执行正确了,那么你现在应该在Traefik UI上看到了一些希望。如果你没有看到traefik,或者在运行Traefik时有问题,你可以查看之后的故障排除部分。

    现在是时候通过Trafik 2暴露一些Kubernetes服务了,以确保Traefik 2能够作为ingress工作。让我们来看经典案例whoami服务,whoami-service.yaml

    apiVersion: v1
    kind: Service
    metadata:
      name: whoami
    
    spec:
      ports:
        - protocol: TCP
          name: web
          port: 80
      selector:
        app: whoami
    
    ---
    kind: Deployment
    apiVersion: apps/v1
    metadata:
      namespace: default
      name: whoami
      labels:
        app: whoami
    
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: whoami
      template:
        metadata:
          labels:
            app: whoami
        spec:
          containers:
            - name: whoami
              image: containous/whoami
              ports:
                - name: web
                  containerPort: 80
    
    

    并且以http或https的方式暴露它,whoami.k.voronenko.net全限定域名下的whoami-ingress-route.yaml

    apiVersion: traefik.containo.us/v1alpha1
    kind: IngressRoute
    metadata:
      name: ingressroute-notls
      namespace: default
    spec:
      entryPoints:
        - web
      routes:
        - match: Host(`whoami.k.voronenko.net`)
          kind: Rule
          services:
            - name: whoami
              port: 80
    
    ---
    apiVersion: traefik.containo.us/v1alpha1
    kind: IngressRoute
    metadata:
      name: ingressroute-tls
      namespace: default
    spec:
      entryPoints:
        - websecure
      routes:
        - match: Host(`whoami.k.voronenko.net`)
          kind: Rule
          services:
            - name: whoami
              port: 80
      tls:
        certResolver: default
    

    然后应用它:

    kubectl apply -f whoami-service.yaml
      kubectl apply -f whoami-ingress-route.yaml
    

    应用后,你应该会在Traefik dashboard上看到一些希望,即KubernetesCRD后端。

    正如你所看到的,Traefik已经检测到我们的K3s Kubernetes集群上运行的新工作负载,而且它与我们在同一个盒子上的经典Docker工作负载(如portainer)很好地共存。

    让我们检查一下Traefik 2是否将Traefik路由到了我们的Kubernetes工作负载:如你所见,你可以在http和https endpoint上成功地接触到whoami工作负载,浏览器接受你的证书为可信任的“绿标签”。

    我们的目标达到了!我们在本地笔记本上配置了Traefik 2。Traefik 2将你的docker或Kubernetes工作流暴露在http或https endpoint上。带可选的 letsencrypt 的 Traefik 2 将负责 https。

    故障排查

    正如你所知,在配置过程可能存在多个问题,你可以考虑使用一些分析工具,如:

    https://github.com/Voronenko/dotfiles/blob/master/Makefile#L185

    我特别建议:

    a) VMWare octant:这是一个基于Web的功能强大的Kubernetes dashboard,你可以在上面使用你的kubeconfig

    b) Rakess:这是一个独立工具也是一个kubectl插件,用于显示Kubernetes服务器资源的访问矩阵(https://github.com/corneliusweig/rakkess)

    检查系统账户的凭据

    rakkess --sa kube-system:traefik-ingress-controller
    

    c) kubectl

    检查哪些角色与服务账户相关联

    kubectl get clusterrolebindings -o json | jq -r '
      .items[] |
      select(
        .subjects // [] | .[] |
        [.kind,.namespace,.name] == ["ServiceAccount","kube-system","traefik-ingress-controller"]
      ) |
      .metadata.name'
    

    d) Traefik 文档:例如kubernetescrd后端提供了更多配置开关的方式。

    --providers.kubernetescrd  (Default: "false")
            Enable Kubernetes backend with default settings.
        --providers.kubernetescrd.certauthfilepath  (Default: "")
            Kubernetes certificate authority file path (not needed for in-cluster client).
        --providers.kubernetescrd.disablepasshostheaders  (Default: "false")
            Kubernetes disable PassHost Headers.
        --providers.kubernetescrd.endpoint  (Default: "")
            Kubernetes server endpoint (required for external cluster client).
        --providers.kubernetescrd.ingressclass  (Default: "")
            Value of kubernetes.io/ingress.class annotation to watch for.
        --providers.kubernetescrd.labelselector  (Default: "")
            Kubernetes label selector to use.
        --providers.kubernetescrd.namespaces  (Default: "")
            Kubernetes namespaces.
        --providers.kubernetescrd.throttleduration  (Default: "0")
            Ingress refresh throttle duration
        --providers.kubernetescrd.token  (Default: "")
            Kubernetes bearer token (not needed for in-cluster client).
        --providers.kubernetesingress  (Default: "false")
            Enable Kubernetes backend with default settings.
        --providers.kubernetesingress.certauthfilepath  (Default: "")
            Kubernetes certificate authority file path (not needed for in-cluster client).
        --providers.kubernetesingress.disablepasshostheaders  (Default: "false")
            Kubernetes disable PassHost Headers.
        --providers.kubernetesingress.endpoint  (Default: "")
            Kubernetes server endpoint (required for external cluster client).
        --providers.kubernetesingress.ingressclass  (Default: "")
            Value of kubernetes.io/ingress.class annotation to watch for.
        --providers.kubernetesingress.ingressendpoint.hostname  (Default: "")
            Hostname used for Kubernetes Ingress endpoints.
        --providers.kubernetesingress.ingressendpoint.ip  (Default: "")
            IP used for Kubernetes Ingress endpoints.
        --providers.kubernetesingress.ingressendpoint.publishedservice  (Default: "")
            Published Kubernetes Service to copy status from.
        --providers.kubernetesingress.labelselector  (Default: "")
            Kubernetes Ingress label selector to use.
        --providers.kubernetesingress.namespaces  (Default: "")
            Kubernetes namespaces.
        --providers.kubernetesingress.throttleduration  (Default: "0")
            Ingress refresh throttle duration
        --providers.kubernetesingress.token  (Default: "")
            Kubernetes bearer token (not needed for in-cluster client).
    

    e) 确保Traefik有足够的权限可以访问apiserver endpoint

    如果你希望Traefik为你查询信息:通过在配置中放置一些错误的apiserver地址,可以查看访问的endpoint和查询顺序。有了这些知识和你的Traefik Kubernetes token,你就可以使用Traefik凭证检查这些endpoint是否可以访问。

    traefik_1    | E0421 12:30:12.624877       1 reflector.go:125] pkg/mod/k8s.io/client-go@v0.0.0-20190718183610-8e956561bbf5/tools/cache/reflector.go:98: Failed to list *v1.Endpoints: Get https://192.168.3.101:6443/api/v1/endpoints?limit=500&resourceVersion=0:
    traefik_1    | E0421 12:30:12.625341       1 reflector.go:125] pkg/mod/k8s.io/client-go@v0.0.0-20190718183610-8e956561bbf5/tools/cache/reflector.go:98: Failed to list *v1.Service: Get https://192.168.3.101:6443/api/v1/services?limit=500&resourceVersion=0:
    traefik_1    | E0421 12:30:12.625395       1 reflector.go:125] pkg/mod/k8s.io/client-go@v0.0.0-20190718183610-8e956561bbf5/tools/cache/reflector.go:98: Failed to list *v1beta1.Ingress: Get https://192.168.3.101:6443/apis/extensions/v1beta1/ingresses?limit=500&resourceVersion=0:
    traefik_1    | E0421 12:30:12.625449       1 reflector.go:125] pkg/mod/k8s.io/client-go@v0.0.0-20190718183610-8e956561bbf5/tools/cache/reflector.go:98: Failed to list *v1alpha1.Middleware: Get https://192.168.3.101:6443/apis/traefik.containo.us/v1alpha1/middlewares?limit=500&resourceVersion=0:
    traefik_1    | E0421 12:30:12.625492       1 reflector.go:125] pkg/mod/k8s.io/client-go@v0.0.0-20190718183610-8e956561bbf5/tools/cache/reflector.go:98: Failed to list *v1alpha1.IngressRoute: Get https://192.168.3.101:6443/apis/traefik.containo.us/v1alpha1/ingressroutes?limit=500&resourceVersion=0:
    traefik_1    | E0421 12:30:12.625531       1 reflector.go:125] pkg/mod/k8s.io/client-go@v0.0.0-20190718183610-8e956561bbf5/tools/cache/reflector.go:98: Failed to list *v1alpha1.TraefikService: Get https://192.168.3.101:6443/apis/traefik.containo.us/v1alpha1/traefikservices?limit=500&resourceVersion=0:
    traefik_1    | E0421 12:30:12.625572       1 reflector.go:125] pkg/mod/k8s.io/client-go@v0.0.0-20190718183610-8e956561bbf5/tools/cache/reflector.go:98: Failed to list *v1alpha1.TLSOption: Get https://192.168.3.101:6443/apis/traefik.containo.us/v1alpha1/tlsoptions?limit=500&resourceVersion=0:
    traefik_1    | E0421 12:30:12.625610       1 reflector.go:125] pkg/mod/k8s.io/client-go@v0.0.0-20190718183610-8e956561bbf5/tools/cache/reflector.go:98: Failed to list *v1alpha1.IngressRouteTCP: Get https://192.168.3.101:6443/apis/traefik.containo.us/v1alpha1/ingressroutetcps?limit=500&resourceVersion=0:
    

    f) 记录K3s本身

    安装脚本将自动检测你的操作系统是使用systemd还是openrc并启动服务。使用openrc运行时,将在/var/log/k3s.log中创建日志。使用systemd运行时,将在/var/log/syslog中创建日志,并使用journalctl -u k3s查看。

    在那里,你可能会得到一些提示,例如:

    кві 21 15:42:44 u18d k3s[612]: E0421 15:42:44.936960     612 authentication.go:104] Unable to authenticate the request due to an error: invalid bearer token
    

    这将为你提供有关K8s Traefik起初使用时出现问题的线索,Enjoy your journey!

    相关代码你可以在以下链接中找到:

    https://github.com/Voronenko/k3s-mini

    展开全文
  • 本文使用「署名 4.0 国际 (CC BY 4.0)」许可协议,欢迎转载、或重新修改使用,但需要注明来源。 署名 4.0 国际 (CC BY 4.0) ...本文链接: https://soulteary.com/2020/02/01/configure-traefik-v2-based-web-se...
  • Traefik 2 基础授权验证(前篇) 我们经常会看到在访问应用前,系统提示用户进行鉴权操作,或出于某些原因,内部提供公网服务的应用需要藏在一些基础的鉴权认证后,避免直接向大众公开。 除了使用各种语言来实现鉴权...
  • 我从Traefik切换到因为Traefik太复杂了,无法满足我的需求。 此图像按原样工作。 如果您需要新功能,请随时分叉该项目。 Traefik的自定义错误页面 使用构建的Traefik的一堆自定义错误页面。 发展 安装依赖项 $ ...
  • 在Docker Swarm上部署Traefik2.x

    千次阅读 2020-02-05 18:07:34
    作者: wavesheep<...经过一番比较我决定使用Traefik2.x作为我的反向代理,负载均衡工具。由于目前主流docker集群是k8s, 导致找不到太多的资料,我在这上面花费了颇多时间,因此我决定写下这篇教程...
  • 在docker和docker-compose中具有traefik的Plex媒体服务器 安装 克隆仓库 $ git clone https://github.com/pierre-emmanuelJ/plex-traefik.git $ cd plex-traefik $ mkdir config \ && mkdir data \ && mkdir ...
  • - "traefik.docker.network=traefik" - "traefik.http.routers.phab0.middlewares=https-redirect@file" - "traefik.http.routers.phab0.entrypoints=http" - "traefik.http.routers.phab0.rule=Host(`...
  • 本文来自边缘计算k3s社区 作者简介 Cello Spring,瑞士人。...轻量级Kubernetes发行版K3s早在去年就已经内置Traefik,将其作为集群的默认反向代理和Ingress Controller。然而,在本文成文时K3s中的默认内置Traef...
  • Traefik2.x IngressController

    2020-11-19 18:17:42
    关于Traefik2.x IngressController 引言 主要想了解,外部流量如何请求到内部,并且做反向代理 正文 1. k8s外部流量如何请求到内部? 第一种方式比较容易想到,只要将service绑定好pod,并且将service的node...
  • 介绍 Traefik 是什么?...这篇文章对 Traefik 使用有不错的解释:我为什么要选择traefik2做网关? 准备工作 Helm V3 确保你已经安装了 Helm V3,上一节已经介绍如何安装它 -> Helm V3 的安装...
  • Traefik 2 使用指南,愉悦的开发体验 一文中的配置,在 traefik.toml 中添加一个新的入口点: [entryPoints] [entryPoints.http] address = ":80" [entryPoints.https] address = ":443" [entryPoints....
  • 关于ingress使用traefik作为控制器 traefik官网推荐使用ingressroute 是有traefik开发的组件,但是traefik也是支持ingress的。 我查了好多资料,发现要使用ingress必须要设置好两个东西 1、ingressclass 这个...
  • 使用 Traefik Ingressroute 导出 linkerd-web 管理面板 关于 traefik v2 的部署,这里不做赘述。 使用 kustomize 对 linkerd viz 部署进行更新 我这里使用的域名是 linkerd-web.hacker-linner.com。 导出 yaml 档:...
  • touch traefik/traefik/acme/acme.json chmod 600 traefik/traefik/acme/acme.json # create your admin user file htpasswd -B -C 12 -c traefik/basicAuth/.admin * your-username * htpasswd可以在软件包apache2...
  • 我们需要创建两组pod,我们希望通过 Traefik 来控制我们的流量,将 3⁄4 的流量路由到 appv1,1/4 的流量路由到 appv2 去,这个时候就可以利用 Traefik2.0 中提供的带权重的轮询(WRR)来实现该功能,首先在 ...
  • 我为什么要选择traefik2做网关?

    千次阅读 2020-03-13 09:36:39
    traefik的Middlewares真心好用,traefik建议升级到traefik2 并且traefik还可以作为Kubernetes ingress controller,可以完全替代我们之前说过的nginx controller 如何使用traefick作为网关进行用户验证 ingress route...
  • traefik-v2-reverse-proxy-for-docker Docker应用程序的Traefik v2反向代理文档 格里克辛尼姆勒 CentOS7 kurulu bir机芯 Önceliklemakinemizde码头工人yüklüolmalı。 Makinede docker-撰写yüklüolmalı。 ...
  • Traefik 2 使用指南,愉悦的开发体验

    千次阅读 2020-01-28 21:21:27
    本文使用「署名 4.0 国际 (CC BY 4.0)」许可协议,欢迎转载、或重新修改使用,但需要注明来源。 署名 4.0 国际 (CC BY 4.0) ...本文链接: https://soulteary.com/2020/01/28/traefik-2-user-guide-pleasant-dev...
  • 经过广泛调研,本项目采用广为流行的Traefik反向代理工具,结合Adminer数据库管理工具、Portainer容器管理工具和Let’s Encrypt证书管理工具,构建了一个开箱即用的Docker应用工具集。源代码可以在我的GitHub上下载...
  • Traefik 2 基础授权验证(后篇) 上篇文章中,我们提到了 Traefik 的 Forward Auth,本篇内容我们来展开聊聊如何使用它。 准备基础的 Web 服务Demo 这篇文章里,我们继续使用 whoami 作为 Web 服务,基础的配置文件...
  • 带有Docker Compose,Traefik 2,Google OAuth2和LetsEncrypt的Docker媒体服务器堆栈 设置: 安装Docker和Docker Compose 设置文件夹和子文件夹的特权: sudo setfacl -Rdm g:docker:rwx ~/htpc sudo chmod -R ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,103
精华内容 1,641
关键字:

traefik2