IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    Traefik全面使用指南:部署篇

    ysicing (i@ysicing.me)发表于 2024-03-09 04:30:02
    love 0

    本文聊聊如何通过k3s如何部署Traefik

    什么是Traefik

    Traefik 是一个用于反向代理和负载均衡的现代化 HTTP 反向代理服务器和负载均衡器。

    主要特性

    仅列出我使用的特性

    • 自动发现和动态配置 可以与容器管理平台如Docker、Kubernetes集成,并根据服务的变化自动更新路由规则
    • 负载均衡
    • 动态路由
    • 内置的 Let's Encrypt 集成
    • 丰富的插件和中间件机制, 如IP白名单等

    部署

    其实,官网文档已经很全了,这里仅列出一些个性化的设置。

    helm repo add traefik https://traefik.github.io/charts
    helm repo update
    

    添加官网helm仓库,并更新

    自定义配置

    image:
      registry: ccr.ccs.tencentyun.com
      repository: k7scn/traefik
    
    ingressClass:
      isDefaultClass: false
    
    ingressRoute:
      healthcheck:
        enabled: true
    
    providers:
      kubernetesCRD:
        enabled: true
        allowCrossNamespace: true
        allowExternalNameServices: true
        allowEmptyServices: true
    
      kubernetesIngress:
        enabled: true
        allowExternalNameServices: true
        allowEmptyServices: true
        publishedService:
          enabled: true
    
    additionalArguments:
      - "--certificatesresolvers.myresolver.acme.email=traefik-tls@ysicing.net"
      - "--certificatesresolvers.myresolver.acme.storage=/data/acme.json"
      - "--certificatesresolvers.myresolver.acme.httpchallenge=true"
      - "--certificatesresolvers.myresolver.acme.httpchallenge.entrypoint=web"
      - "--api=true"
    
    ports:
      traefik:
        port: 9000
        expose: true
      web:
        port: 8000
        hostPort: 80
      websecure:
        port: 8443
        hostPort: 443
        http3:
          enabled: true
      metrics:
        expose: true
    
    nodeSelector:
      node-role.kubernetes.io/bj: "true"
    tolerations: []
    
    persistence:
      enabled: true
    
    log:
      access:
        enabled: true
    

    其实也添加tls相关及限定了调度到哪台机器上。

    部署

    也可以不指定版本。如果不指定版本需要去掉values.yaml关于registry部分的配置

    kubectl create ns traefik-v2
    helm upgrade -i traefik traefik/traefik -n traefik-v2 -f ./values.yaml --version 26.0.0
    

    其他问题

    可能会提示对/data/acme.json 没有权限,手动处理一下这个权限。

    由于我是多云集群,默认全局sc是hostpath,直接去相关节点手动新建这个文件即可, 路径大概是/var/lib/rancher/k3s/storage/[traefik-pvc], 具体pvc需要自行看下,如果没跑服务应该就1个就是traefik的

    touch ./acme.json
    chmod -v 600 ./acme.json
    chown 65532.65532 acme.json
    

    这个也可以通过initContainer去处理, 具体可以参考 traefik/values.yaml#L65

    测试

    这里我提供一个测试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:
      name: whoami
      labels:
        app: whoami
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: whoami
      template:
        metadata:
          labels:
            app: whoami
        spec:
          nodeSelector:
            node-role.kubernetes.io/bj: "true"
          containers:
            - name: whoami
              image: h2.ysicing.net/containous/whoami
              resources:
                limits:
                  cpu: 100m
                  memory: 128M
              ports:
                - name: web
                  containerPort: 80
    ---
    apiVersion: traefik.containo.us/v1alpha1
    kind: IngressRoute
    metadata:
      name: whoami-http
    spec:
      entryPoints:
        - web
      routes:
        - match: Host(`whoami.bjslb.ysicing.net`) && PathPrefix(`/notls`)
          kind: Rule
          services:
            - name: whoami
              port: 80
    ---
    apiVersion: traefik.containo.us/v1alpha1
    kind: IngressRoute
    metadata:
      name: whoami-https
    spec:
      entryPoints:
        - websecure
      routes:
        - match: Host(`whoami.bjslb.ysicing.net`) && PathPrefix(`/tls`)
          kind: Rule
          services:
            - name: whoami
              port: 80
      tls:
       certResolver: myresolver
    


沪ICP备19023445号-2号
友情链接