kubernetes 部署 traefik2.3

I. Resumen

Traefik es un enrutador de borde de código abierto que puede hacer que la publicación de servicios sea fácil y divertida. Es responsable de recibir solicitudes de su sistema y luego utilizar los componentes apropiados para procesar estas solicitudes.

Además de las numerosas funciones, Traefik es único porque descubrirá automáticamente la configuración que se adapta a su servicio. Cuando Traefik esté verificando su servicio, encontrará información sobre el servicio y encontrará el servicio adecuado para satisfacer la solicitud correspondiente.

Traefik es compatible con todas las tecnologías de clúster convencionales, como Kubernetes, Docker, Docker Swarm, AWS, Mesos, Marathon, etc .; y puede manejar múltiples métodos al mismo tiempo. (Incluso se puede usar para software antiguo que se ejecuta en bare metal).

Con Traefik, no es necesario mantener y sincronizar un archivo de configuración separado: todo sucede automáticamente y en tiempo real (sin reiniciar, sin interrupción de la conexión). Con Traefik, puede dedicar tiempo a desarrollar e implementar nuevas funciones en el sistema en lugar de configurar y mantener su estado de funcionamiento.

Arquitectura

<! - más ->

2. Concepto

Enrutador de borde

Traefik es un enrutador de borde, la puerta a toda su plataforma, que intercepta y enruta cada solicitud entrante: conoce toda la lógica y las reglas, y estas reglas determinan qué servicios manejan qué solicitudes; el proxy inverso tradicional requiere un archivo de configuración, Contiene todas las rutas posibles a su servicio, y Traefik detectará el servicio en tiempo real y actualizará automáticamente las reglas de enrutamiento, que se pueden descubrir automáticamente.

La puerta a su infraestructura

Descubrimiento de servicio automático

Un enrutador de borde tradicional (o proxy inverso) requiere un archivo de configuración que contiene todas las rutas posibles al servicio, y Traefik las obtiene del propio servicio.

Al implementar su servicio, debe adjuntar cierta información para decirle a Traefik las características de la solicitud que el servicio puede manejar.

Esto significa que cuando se implemente el servicio, Traefik lo detectará inmediatamente y actualizará las reglas de enrutamiento en tiempo real. Lo contrario también es cierto: cuando elimina un servicio de la infraestructura, el enrutamiento desaparecerá en consecuencia.

Ya no es necesario crear y sincronizar archivos de configuración mezclados con direcciones IP u otras reglas.

Arquitectura

Antes de comprender Traefik, hay varios conceptos básicos que debemos comprender:

  • Providers Se utiliza para descubrir automáticamente servicios en la plataforma, que pueden ser herramientas de orquestación, motores de contenedores o almacenamiento de valor clave, como Docker, Kubernetes, File
  • Entrypoints Escuchar el tráfico entrante (puertos, etc.) es el punto de entrada a la red, y ellos definen el puerto (HTTP o TCP) para recibir solicitudes.
  • Routers Analice las solicitudes (host, ruta, encabezados, SSL,…) y conecte las solicitudes entrantes a los servicios que pueden manejar estas solicitudes.
  • Services Reenvíe la solicitud a su aplicación (balanceo de carga,…), responsable de configurar cómo obtener el servicio real que eventualmente manejará la solicitud entrante.
  • MiddlewaresEl middleware se usa para modificar la solicitud o hacer algunos juicios basados ​​en la solicitud (autenticación, limitación de velocidad, encabezados, ...). El middleware se adjunta a la ruta, que es una especie de antes de que la solicitud se envíe a su servicio (o en el servicio Un método para ajustar la solicitud antes de que se envíe la respuesta al cliente.

Tres, instalación

Porque la versión 2.X de Traefik no es compatible con la versión 1.X anterior y la versión 1.X ha dejado de actualizarse. Aquí elegimos la versión 2.X más potente para explicarle, la imagen que usamos aquí es traefik:2.3.2.

Este documento utiliza KubernetesCRDcomo provider, por lo que debe crear un CRD

3.1 Crear archivo traefik-crd.yaml

traefik-crd.yaml

# All resources definition must be declared
apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
  name: ingre***outes.traefik.containo.us

spec:
  group: traefik.containo.us
  version: v1alpha1
  names:
    kind: Ingre***oute
    plural: ingre***outes
    singular: ingre***oute
  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: ingre***outetcps.traefik.containo.us

spec:
  group: traefik.containo.us
  version: v1alpha1
  names:
    kind: Ingre***outeTCP
    plural: ingre***outetcps
    singular: ingre***outetcp
  scope: Namespaced

---
apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
  name: ingre***outeudps.traefik.containo.us

spec:
  group: traefik.containo.us
  version: v1alpha1
  names:
    kind: Ingre***outeUDP
    plural: ingre***outeudps
    singular: ingre***outeudp
  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: tlsstores.traefik.containo.us

spec:
  group: traefik.containo.us
  version: v1alpha1
  names:
    kind: TLSStore
    plural: tlsstores
    singular: tlsstore
  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

3.2 Crear permisos rbac

traefik-rbac.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
      - networking.k8s.io
    resources:
      - ingresses
      - ingressclasses
    verbs:
      - get
      - list
      - watch
  - apiGroups:
      - extensions
    resources:
      - ingresses/status
    verbs:
      - update
  - apiGroups:
      - traefik.containo.us
    resources:
      - middlewares
      - ingre***outes
      - traefikservices
      - ingre***outetcps
      - ingre***outeudps
      - tlsoptions
      - tlsstores
    verbs:
      - get
      - list
      - watch

---
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: default

3.3 Crear archivo de configuración traefik

La configuración en Traefik se puede utilizar de dos formas diferentes:

  • Configuración dinámica: configuración de enrutamiento completamente dinámica
  • Configuración estática: configuración de inicio

静态配置Los elementos en (estos elementos no cambian con frecuencia) se conectan a los proveedores y definen los puntos de entrada que Treafik monitoreará.

Hay tres formas de definir la configuración estática en Traefik: en el archivo de configuración, en los parámetros de la línea de comandos y pasando a través de variables de entorno

动态配置Contiene todo el contenido de la configuración que define cómo el sistema procesa las solicitudes. Estas configuraciones se pueden cambiar y se actualizan en caliente sin interrupciones ni pérdidas de conexión.

Aquí colocamos la configuración básica general en la configuración estática y la configmapimplementamos en el formulario

traefik-config-cm.yaml

kind: ConfigMap
apiVersion: v1
metadata:
  name: traefik-config
data:
  traefik.yaml: |-
    serversTransport:
      insecureSkipVerify: true  ## Traefik 忽略验证代理服务的 TLS 证书
    api:
      insecure: true            ## 允许 HTTP 方式访问 API
      dashboard: true           ## 启用 Dashboard
      debug: false              ## 启用 Debug 调试模式
    metrics:
      prometheus: metrics       ## 配置 Prometheus 监控指标数据,并使用默认配置
    entryPoints:
      web:
        address: ":80"          ## 配置 80 端口,并设置入口名称为 web
      websecure:
        address: ":443"         ## 配置 443 端口,并设置入口名称为 websecure
      traefik:
        address: ":8090"        ## 配置 8090 端口,并设置入口名称为 dashboard
      metrics:
        address: ":8082"        ## 配置 8082 端口,作为metrics收集入口
      tcpep:
        address: ":8000"        ## 配置 8000 端口,作为tcp入口
      udpep:
        address: ":9000/udp"    ## 配置 9000 端口,作为udp入口
    providers:
      kubernetescrd:            ## 启用 Kubernetes CRD 方式来配置路由规则
        ingressclass: traefik-v2.3
      kubernetesingress:        ## 启动 Kubernetes Ingress 方式来配置路由规则
        ingressclass: traefik-v2.3
    log:
      filePath: "/etc/traefik/logs/traefik.log"              ## 设置调试日志文件存储路径,如果为空则输出到控制台
      level: error              ## 设置调试日志级别
      format: ""                ## 设置调试日志格式
    accessLog:
      filePath: "/etc/traefik/logs/access.log"              ## 设置访问日志文件存储路径,如果为空则输出到控制台
      format: ""                ## 设置访问调试日志格式
      bufferingSize: 0          ## 设置访问日志缓存行数
      filters:
        #statusCodes: ["200"]   ## 设置只保留指定状态码范围内的访问日志
        retryAttempts: true     ## 设置代理访问重试失败时,保留访问日志
        minDuration: 20         ## 设置保留请求时间超过指定持续时间的访问日志
      fields:                   ## 设置访问日志中的字段是否保留(keep 保留、drop 不保留)
        defaultMode: keep       ## 设置默认保留访问日志字段
        names:                  ## 针对访问日志特别字段特别配置保留模式
          ClientUsername: drop  
        headers:                ## 设置 Header 中字段是否保留
          defaultMode: keep     ## 设置默认保留 Header 中字段
          names:                ## 针对 Header 中特别字段特别配置保留模式
            User-Agent: redact
            Authorization: drop
            Content-Type: keep

3.4 implementar traefik

traefik-deploy.yaml

apiVersion: v1
kind: ServiceAccount
metadata:
  name: traefik-ingress-controller

---
kind: Deployment
apiVersion: apps/v1
metadata:
  name: traefik-v2
  labels:
    app: traefik-v2

spec:
  replicas: 2
  selector:
    matchLabels:
      app: traefik-v2
  template:
    metadata:
      labels:
        app: traefik-v2
    spec:
      serviceAccountName: traefik-ingress-controller
      terminationGracePeriodSeconds: 1
      containers:
        - name: traefik-v2
          image: harbor.foxchan.com/traefik/traefik:v2.3
          args:
            - --configfile=/config/traefik.yaml
          ports:
            - name: web
              containerPort: 80
            - name: admin
              containerPort: 8090
            - name: tcpep
              containerPort: 8000
            - name: udpep
              containerPort: 9000
          securityContext:
            capabilities:              ## 只开放网络权限    
              drop:
                - ALL
              add:
                - NET_BIND_SERVICE
          volumeMounts:
          - mountPath: "/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: "traefik2.3"

---
apiVersion: v1
kind: Service
metadata:
  name: traefik-v2
spec:
  type: LoadBalancer
  selector:
    app: traefik-v2
  ports:
    - protocol: TCP
      port: 80
      name: web
      targetPort: 80
    - protocol: TCP
      port: 8090
      name: admin
      targetPort: 8090
    - protocol: TCP
      port: 8000
      name: tcpep
      targetPort: 8000

---
apiVersion: v1
kind: Service
metadata:
  name: traefikudp-v2
spec:
  type: LoadBalancer
  selector:
    app: traefik-v2
  ports:
    - protocol: UDP
      port: 9000
      name: udpep
      targetPort: 9000

En este momento, puede ver la dashboardinformación relevante a través del nodo http: // IP: 8090

kubernetes 部署 traefik2.3

Cuatro, configuración de enrutamiento

Traefik realiza modificaciones dinámicas de archivos de configuración a través de CRD

Los recursos personalizados disponibles se pueden encontrar en la siguiente tabla

Tipo Propósito Concepto detrás
Ingre *** oute Enrutamiento HTTP Enrutador HTTP
Middleware Ajusta las solicitudes HTTP antes de que se envíen a su servicio Middlewares HTTP
TraefikService Abstracción para el equilibrio / reflejo de carga HTTP Servicio HTTP
Ingre *** outeTCP Enrutamiento TCP Enrutador TCP
Ingre *** outeUDP Enrutamiento UDP Enrutador UDP
TLSOpciones Permite configurar algunos parámetros de la conexión TLS TLSOpciones
TLSStores Permite configurar la tienda TLS predeterminada TLSStores

4.1 Configurar reglas de enrutamiento HTTP

Se ha implementado Traefik, pero desea acceso externo al servicio interno de Kubernetes, también necesita configurar reglas de enrutamiento, aquí panel de control traefik y whoamiejemplos.

Primero crea el despliegue de whoami

whoami.yaml

kind: Deployment
apiVersion: apps/v1
metadata:
  name: whoami
  namespace: default
  labels:
    app: traefiklabs
    name: whoami

spec:
  replicas: 2
  selector:
    matchLabels:
      app: traefiklabs
      task: whoami
  template:
    metadata:
      labels:
        app: traefiklabs
        task: whoami
    spec:
      containers:
        - name: whoami
          image: traefik/whoami
          ports:
            - containerPort: 80

---
apiVersion: v1
kind: Service
metadata:
  name: whoami
  namespace: default

spec:
  ports:
    - name: http
      port: 80
  selector:
    app: traefiklabs
    task: whoami

---
kind: Deployment
apiVersion: apps/v1
metadata:
  name: whoamitcp
  namespace: default
  labels:
    app: traefiklabs
    name: whoamitcp

spec:
  replicas: 2
  selector:
    matchLabels:
      app: traefiklabs
      task: whoamitcp
  template:
    metadata:
      labels:
        app: traefiklabs
        task: whoamitcp
    spec:
      containers:
        - name: whoamitcp
          image: traefik/whoamitcp
          ports:
            - containerPort: 8080

---
apiVersion: v1
kind: Service
metadata:
  name: whoamitcp
  namespace: default

spec:
  ports:
    - protocol: TCP
      port: 8080
  selector:
    app: traefiklabs
    task: whoamitcp

---
kind: Deployment
apiVersion: apps/v1
metadata:
  name: whoamiudp
  namespace: default
  labels:
    app: traefiklabs
    name: whoamiudp

spec:
  replicas: 2
  selector:
    matchLabels:
      app: traefiklabs
      task: whoamiudp
  template:
    metadata:
      labels:
        app: traefiklabs
        task: whoamiudp
    spec:
      containers:
        - name: whoamiudp
          image: traefik/whoamiudp:latest
          ports:
            - containerPort: 8080

---
apiVersion: v1
kind: Service
metadata:
  name: whoamiudp
  namespace: default

spec:
  ports:
    - port: 8080
  selector:
    app: traefiklabs
    task: whoamiudp

dashboard.yaml

Debido a que el archivo de configuración estática especifica ingressclass, annotationsdebe especificarse aquí ; de lo contrario, el acceso será 404

apiVersion: traefik.containo.us/v1alpha1
kind: Ingre***oute
metadata:
  name: traefik-dashboard
  namespace: default
  annotations:
    kubernetes.io/ingress.class: traefik-v2.3     
spec:
  entryPoints:
    - web
  routes:
  - match: Host(`traefik.foxchan.com`) 
    kind: Rule
    services:
    - name: api@internal
      kind: TraefikService

whoami-ingre *** oute.yaml

apiVersion: traefik.containo.us/v1alpha1
kind: Ingre***oute
metadata:
  name: myingre***oute
  namespace: default
  annotations:
    kubernetes.io/ingress.class: traefik-v2.3   
spec:
  entryPoints:
    - web

  routes:
  - match: Host(`whoami.foxchan.com`) && PathPrefix(`/`)
    kind: Rule
    services:
    - name: whoami
      port: 80

A continuación, configure los Hosts. Si el cliente desea acceder al servicio a través del nombre de dominio, debe realizar la resolución DNS. Aquí, la resolución del nombre de dominio se puede realizar a través del servidor DNS. También puede modificar el archivo de hosts para vincular la IP del nodo designado por Traefik a un host personalizado.

4.2 Configurar reglas de enrutamiento HTTPS

Si necesitamos usar HTTPS para acceder a nuestra aplicación, entonces es necesario escuchar websecureeste punto de entrada, al cual se accede a través del puerto 443, lo mismo con el acceso HTTPS a aplicaciones que necesariamente requiere un certificado, aquí usamos opensslpara crear un certificado autofirmado:

$ openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=whoami.foxchan.com"

Luego, consulte el archivo de certificado a través del objeto secreto:

# 要注意证书文件名称必须是 tls.crt 和 tls.key
$ kubectl create secret tls who-tls --cert=tls.crt --key=tls.key
secret/who-tls created

En este momento, podemos crear un objeto Ingre *** oute para aplicaciones de acceso HTTPS:

apiVersion: traefik.containo.us/v1alpha1
kind: Ingre***oute
metadata:
  name: ingre***outetls
  annotations:
    kubernetes.io/ingress.class: traefik-v2.3   
spec:
  entryPoints:
    - websecure
  routes:
  - match: Host(`whoami.foxchan.com`) 
    kind: Rule
    services:
    - name: whoami
      port: 80
  tls:
    secretName: who-tls

4.3 Configurar reglas de enrutamiento TCP

whoami-tcp.yaml

apiVersion: traefik.containo.us/v1alpha1
kind: Ingre***outeTCP
metadata:
  name: ingre***outetcpwho
  annotations:
    kubernetes.io/ingress.class: traefik-v2.3 
spec:
  entryPoints:
    - tcpep
  routes:
  - match: HostSNI(`*`)
    services:
    - name: whoamitcp
      port: 8080

4.4 Configurar las reglas de enrutamiento de udp

whoami-udp.yaml

apiVersion: traefik.containo.us/v1alpha1
kind: Ingre***outeUDP
metadata:
  name: ingre***outeudpwho
  annotations:
    kubernetes.io/ingress.class: traefik-v2.3   
spec:
  entryPoints:                  
    - udpep
  routes:                      
  - services:                  
    - name: whoamiudp                 
      port: 8080                           

Cinco, middleware

El middleware es una característica muy distintiva en Traefik 2.0. Podemos elegir diferentes middleware para satisfacer nuestras necesidades de acuerdo con nuestras diversas necesidades. Traefik oficialmente tiene un middleware integrado con muchas funciones diferentes, algunas de las cuales pueden modificarse. Información de encabezado, algunos son responsables de la redirección, algunos agregan autenticación, etc., y el middleware también se puede aplicar a varias situaciones a través de la combinación de cadenas.

kubernetes 部署 traefik2.3

Ejemplo de lista blanca

El tablero de arriba es información importante, podemos configurar la IP a la que solo se puede acceder mediante la lista blanca

Crear middleware de lista blanca

middleware-ipwhitelist.yaml

apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
  name: gs-ipwhitelist
spec:
  ipWhiteList:
    sourceRange:
      - 127.0.0.1
      - 10.244.0.0/16
      - 10.96.0.0/12
      - 192.168.0.0/24

Luego, adjunte este middleware al servicio del panel

apiVersion: traefik.containo.us/v1alpha1
kind: Ingre***oute
metadata:
  name: traefik-dashboard
  namespace: default
  annotations:
    kubernetes.io/ingress.class: traefik-v2.3
spec:
  entryPoints:
    - web
  routes:
  - match: Host(`traefik.foxchan.com`) 
    kind: Rule
    services:
    - name: api@internal
      kind: TraefikService
    middlewares:                                         #这里添加中间件的名字
      - name: gs-ipwhitelist

En este momento, visitaremos el panel nuevamente, y aquellos que no están en la lista blanca informarán 403. Para más uso de middleware, consulte Traefik Docs .

6. Configuración de enrutamiento (avanzado)

En el entorno de producción real, además del negocio en línea, existen requisitos de uso más complejos.

Antes de comenzar el uso avanzado de traefik, debe comprender uno más TraefikService, que es TraefikServicerealizar configuraciones de solicitud más complicadas registrándose en el CRD.

TraefikService Actualmente se puede utilizar para las siguientes funciones

6.1 Equilibrio de carga

Crear servicio k8s

apiVersion: v1
kind: Service
metadata:
  name: svc1
  namespace: default

spec:
  ports:
    - name: http
      port: 80
  selector:
    app: v1
---
apiVersion: v1
kind: Service
metadata:
  name: svc2
  namespace: default

spec:
  ports:
    - name: http
      port: 80
  selector:
    app: v2

Crear Ingre *** oute

apiVersion: traefik.containo.us/v1alpha1
kind: Ingre***oute
metadata:
  name: ingre***outelb
  namespace: default

spec:
  entryPoints:
    - web
  routes:
  - match: Host(`whoami.foxchan.com`)
    kind: Rule
    services:
    - name: svc1
      namespace: default
    - name: svc2
      namespace: default

6.2 Sondeo de peso

Crear TraefikService

apiVersion: traefik.containo.us/v1alpha1
kind: TraefikService
metadata:
  name: wrr
  namespace: default

spec:
  weighted:
    services:
      - name: svc1    
        port: 80
        weight: 3          # 定义权重
        kind: Service      # 可选,默认就是 Service 
      - name: svc2
        port: 80     
        weight: 1

Crear Ingre *** oute

Cabe señalar que el servicio que configuramos ya no es un objeto directo de Kubernetes, sino el objeto TraefikService que definimos anteriormente

apiVersion: traefik.containo.us/v1alpha1
kind: Ingre***oute
metadata:
  name: ingre***outewrr
  namespace: default

spec:
  entryPoints:
    - web
  routes:
  - match: Host(`who.foxchan.com`)
    kind: Rule
    services:
    - name: wrr
      namespace: default
      kind: TraefikService

6.3 Espejo

Aquí hay dos tipos de demostraciones de replicación de tráfico

El tráfico se copia al servicio k8s

# Mirroring from a k8s Service
apiVersion: traefik.containo.us/v1alpha1
kind: TraefikService
metadata:
  name: mirror-k8s
  namespace: default

spec:
  mirroring:
    name: svc1       # 发送 100% 的请求到 K8S 的 Service "v1"
    port: 80
    mirrors:
      - name: svc2   # 然后复制 20% 的请求到 v2
        port: 80
        percent: 20

El tráfico se importa desde Traefik Service

# Mirroring from a Traefik Service
apiVersion: traefik.containo.us/v1alpha1
kind: TraefikService
metadata:
  name: mirror-ts
  namespace: default

spec:
  mirroring:
    name: mirror-k8s          #流量入口从TraefikService 来
    kind: TraefikService
     mirrors:
       - name: svc2
         port: 80
         percent: 20

Crear Ingre *** oute

apiVersion: traefik.containo.us/v1alpha1
kind: Ingre***oute
metadata:
  name: ingre***oute-mirror
  namespace: default

spec:
  entryPoints:
    - web
  routes:
  - match: Host(`who.foxchan.com`) 
    kind: Rule
    services:
    - name: mirror-k8s          
      namespace: default
      kind: TraefikService

Supongo que te gusta

Origin blog.51cto.com/foxhound/2545116
Recomendado
Clasificación