跳转至

Kubernetes

Kubernetes 的 Ingress Controller。

Traefik 的 Kubernetes Ingress provider 是一个 Kubernetes Ingress Controller;也就是说,它通过支持 Ingress 规范来管理对集群服务的访问。

开启 Ingress provider

通常,我们可以通过静态配置来启用 Kubernetes Ingress Provider:

[providers.kubernetesIngress]
providers:
  kubernetesIngress: {}
--providers.kubernetesingress=true

然后这个 provider 回去 watch 传入 ingress 的事件,比如下面的示例,并且从中获取相应的动态配置信息,依次创建对应的路由、服务、处理程序等等。

kind: Ingress
apiVersion: extensions/v1beta1
metadata:
  name: "foo"
  namespace: production
spec:
  rules:
    - host: foo.com
      http:
        paths:
          - path: /bar
            backend:
              serviceName: service1
              servicePort: 80
          - path: /foo
            backend:
              serviceName: service1
              servicePort: 80

Provider 配置

endpoint

可选, 默认为空

[providers.kubernetesIngress]
  endpoint = "http://localhost:8080"
  # ...
providers:
  kubernetesIngress:
    endpoint = "http://localhost:8080"
    # ...
--providers.kubernetesingress.endpoint="http://localhost:8080"

Kubernetes 服务端点作为 URL,则仅在以下基于环境变量的方式无效的时候才使用。

当部署到 Kubernetes 集群中时,Traefik 会读取环境变量 KUBERNETES_SERVICE_HOSTKUBERNETES_SERVICE_PORT 或者 KUBECONFIG 来构造 Kubernetes 的服务端点。

访问的 token 位于容器中/var/run/secrets/kubernetes.io/serviceaccount/token 以及 SSL 的 CA 证书 /var/run/secrets/kubernetes.io/serviceaccount/ca.crt。这两个文件都是 Traefik 部署后自动 mount 到 Pod 里面去的,所以默认就可以获得。

当找不到环境变量时,Traefik 会尝试使用外部集群客户端连接到 Kubernetes APIServer。这种情况下面,endpoint 选项就是必须设置的了。

具体来说,可以将其设置为 kubectl proxy 的 URL 来使用关联的 kubeconfig 授予的身份验证和授权连接到 Kubernetes 集群。

token

可选的, 默认为空

[providers.kubernetesIngress]
  token = "mytoken"
  # ...
providers:
  kubernetesIngress:
    token = "mytoken"
    # ...
--providers.kubernetesingress.token="mytoken"

用于 Kubernetes 客户端配置的 Bearer Token。

certAuthFilePath

可选的,默认为空

[providers.kubernetesIngress]
  certAuthFilePath = "/my/ca.crt"
  # ...
providers:
  kubernetesIngress:
    certAuthFilePath: "/my/ca.crt"
    # ...
--providers.kubernetesingress.certauthfilepath="/my/ca.crt"

CA 证书文件路径,用于 Kubernetes 客户端配置。

disablePassHostHeaders

可选,默认为 false

[providers.kubernetesIngress]
  disablePassHostHeaders = true
  # ...
providers:
  kubernetesIngress:
    disablePassHostHeaders: true
    # ...
--providers.kubernetesingress.disablepasshostheaders=true

是否禁用 PassHost 头信息。

namespaces

可选, 默认: 所有 namespaces (空数组)

[providers.kubernetesIngress]
  namespaces = ["default", "production"]
  # ...
providers:
  kubernetesIngress:
    namespaces:
      - "default"
      - "production"
    # ...
--providers.kubernetesingress.namespaces="default,production"

要 watch 的命名空间数组。

labelSelector

可选,默认为空 (处理所有的 Ingresses)

[providers.kubernetesIngress]
  labelSelector = "A and not B"
  # ...
providers:
  kubernetesIngress:
    labelselector: "A and not B"
    # ...
--providers.kubernetesingress.labelselector="A and not B"

默认情况下,Traefik 处理配置的命名空间下面的所有 Ingress 对象,也可以通过指定一个 label seletor 来过滤特定的 Ingress 对象。

点击查看更多 label-selectors 详细信息。

ingressClass

可选,默认为空

[providers.kubernetesIngress]
  ingressClass = "traefik-internal"
  # ...
providers:
  kubernetesIngress:
    ingressClass: "traefik-internal"
    # ...
--providers.kubernetesingress.ingressclass="traefik-internal"

标记被处理的 Ingress 对象的 annotation kubernetes.io/ingress.class 的值。如果该参数只非空,则只处理包含具有相同值的 annotation 的 Ingress 对象。否则,将处理没有 annotation 注解,或者值为空或者为 traefik 的 Ingress 对象。

ingressEndpoint

hostname

可选,默认为空

[providers.kubernetesIngress.ingressEndpoint]
  hostname = "foo.com"
  # ...
providers:
  kubernetesIngress:
    ingressEndpoint:
      hostname: "foo.com"
    # ...
--providers.kubernetesingress.ingressendpoint.hostname="foo.com"

用于 Kubernetes Ingress 端点的主机名。

ip

可选,默认为空

[providers.kubernetesIngress.ingressEndpoint]
  ip = "1.2.3.4"
  # ...
providers:
  kubernetesIngress:
    ingressEndpoint:
      ip: "1.2.3.4"
    # ...
--providers.kubernetesingress.ingressendpoint.ip="1.2.3.4"

用于 Kubernetes Ingress 端点的 IP。

publishedService

可选,默认为空

[providers.kubernetesIngress.ingressEndpoint]
  publishedService = "foo-service"
  # ...
providers:
  kubernetesIngress:
    ingressEndpoint:
      publishedService: "foo-service"
    # ...
--providers.kubernetesingress.ingressendpoint.publishedservice="foo-service"

用来复制状态的已发布的 Kubernetes Service。

throttleDuration

可选,默认为0 (没有限流)

[providers.kubernetesIngress]
  throttleDuration = "10s"
  # ...
providers:
  kubernetesIngress:
    throttleDuration: "10s"
    # ...
--providers.kubernetesingress.throttleDuration="10s"

未来

如果你想进一步了解 Traefik 支持的 Ingress 的规范,可以在 Traefik 代码仓的测试 数据 中了解更多信息。