Traefik & Kubernetes

Kubernetes入口控制器,自定义资源方式.

Traefik过去仅通过Kubernetes Ingress提供程序来支持Kubernetes,从严格意义上讲,它是Kubernetes Ingress控制器.

但是,由于社区表示需要利用Traefik功能而无需借助(大量)注释,因此我们最终为下面定义的IngressRoute类型编写了一个自定义资源定义 (以下简称CRD),以便提供一个配置对Kubernetes集群的访问权限的更好方法.

Resource Configuration

请参阅路由中的专用部分.

LetsEncrypt Support with the Custom Resource Definition Provider

根据设计,Traefik是无状态的应用程序,这意味着它仅从其运行的环境中获取其配置,而无需其他配置. 因此,用户可以同时运行Traefik的多个实例以实现HA,这是kubernetes生态系统中的常见模式.

当将Traefik的单个实例与LetsEncrypt一起使用时,不会遇到任何问题,但是这可能是单点故障. 不幸的是,不可能在启用LetsEncrypt的情况下运行Traefik 2.0的多个实例,因为无法确保正确的Traefik实例将接收质询请求和后续响应. Traefik的早期版本使用KV商店来尝试实现此目的,但是由于次佳性能,2.0中的一项功能被删除.

如果您在kubernetes环境中需要带有HA的LetsEncrypt,我们建议使用TraefikEE ,其中分布式LetsEncrypt是受支持的功能.

如果您想继续运行Traefik Community Edition,可以使用证书控制器(例如Cert-Manager)来实现LetsEncrypt HA. 使用Cert-Manager管理证书时,它将在您的命名空间中创建秘密,这些秘密可以在您的入口对象中称为TLS秘密. 使用Traefik Ku​​bernetes CRD Provider时,不幸的是Cert-Manager 不能直接与CRD交互,但是我们的团队正在努力. 一种解决方法是使Kubernetes Ingress提供程序能够允许Cert-Manager创建入口对象来完成挑战. 请注意,这仍然需要人工干预才能通过Cert-Manager创建证书,但是一旦创建,Cert-Manager将保持证书的续订.

Provider Configuration

endpoint

可选,默认=空

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

Kubernetes服务器端点作为URL.

当部署到Kubernetes中时,Traefik将读取环境变量KUBERNETES_SERVICE_HOSTKUBERNETES_SERVICE_PORTKUBECONFIG来构造端点.

访问令牌将在/var/run/secrets/kubernetes.io/serviceaccount/token查找,SSL CA证书将在/var/run/secrets/kubernetes.io/serviceaccount/ca.crt查找. 两者都部署在Kubernetes中时会自动安装.

可以指定端点以覆盖集群内部的环境变量值.

当找不到环境变量时,Traefik将尝试使用外部集群客户端连接到Kubernetes API服务器. 在这种情况下,端点是必需的. 具体来说,可以将其设置为使用关联的kubeconfig的授予的身份验证和授权, kubectl proxy用来连接到Kubernetes集群的URL.

token

可选,默认=空

[providers.kubernetesCRD]
  token = "mytoken"
  # ...
providers:
  kubernetesCRD:
    token = "mytoken"
    # ...
--providers.kubernetescrd.token=mytoken

用于Kubernetes客户端配置的承载令牌.

certAuthFilePath

可选,默认=空

[providers.kubernetesCRD]
  certAuthFilePath = "/my/ca.crt"
  # ...
providers:
  kubernetesCRD:
    certAuthFilePath: "/my/ca.crt"
    # ...
--providers.kubernetescrd.certauthfilepath=/my/ca.crt

证书颁发机构文件的路径. 用于Kubernetes客户端配置.

namespaces

可选,默认值:所有名称空间(空数组)

[providers.kubernetesCRD]
  namespaces = ["default", "production"]
  # ...
providers:
  kubernetesCRD:
    namespaces:
    - "default"
    - "production"
    # ...
--providers.kubernetescrd.namespaces=default,production

要监视的名称空间数组.

labelselector

可选,默认值:空(处理所有入口)

[providers.kubernetesCRD]
  labelselector = "A and not B"
  # ...
providers:
  kubernetesCRD:
    labelselector: "A and not B"
    # ...
--providers.kubernetescrd.labelselector="A and not B"

默认情况下,Traefik处理配置的名称空间中的所有Ingress对象. 可以将标签选择器定义为仅对特定的Ingress对象进行过滤.

有关详细信息,请参见标签选择器 .

ingressClass

可选,默认:空

[providers.kubernetesCRD]
  ingressClass = "traefik-internal"
  # ...
providers:
  kubernetesCRD:
    ingressClass: "traefik-internal"
    # ...
--providers.kubernetescrd.ingressclass=traefik-internal

kubernetes.io/ingress.class批注的值,该值标识要处理的Ingress对象.

如果参数为非空,则仅处理包含具有相同值的注释的Ingress. 否则,将处理缺少注释,具有空值或值traefik .

throttleDuration

可选,默认值:0(无限制)

[providers.kubernetesCRD]
  throttleDuration = "10s"
  # ...
providers:
  kubernetesCRD:
    throttleDuration: "10s"
    # ...
--providers.kubernetescrd.throttleDuration=10s

Further

另请参阅"加密"的完整示例 .