kubernetes 使用 Traefik 2.x 公开服务作为 CRD 的入口

kubernetes expose services with Traefik 2.x as ingress with CRD

我有什么工作

我有一个 Kubernetes 集群如下:



在我部署的这个集群上(遵循来自 traefik https://docs.traefik.io/user-guides/crd-acme/ 的文档):

我想要什么

我在集群中有多个服务 运行,我想使用 Ingress 将它们暴露给外部。 更准确地说,我想使用新的 Traefik 2.x CDR 入口方法。

我的最终目标是使用新的 traefiks 2.x CRD 使用 IngressRoute 自定义资源定义

在端口 80、443、8080 上公开资源

有什么问题

如果我理解得很好,经典的 Ingress 控制器允许向外界展示我们想要的每个端口(包括 80、8080 和 443)。

但是使用新的 traefik CDR 入口方法它自己根本不导出任何东西。 一种解决方案是将 Traefik 服务定义为负载均衡器类型的服务,然后公开一些端口。但是你被迫使用 30000-32767 端口范围(与 nodeport 相同),我不想在反向代理前面添加反向代理以能够暴露端口 80 和 443...

我还从新的 igress CRD (https://docs.traefik.io/user-guides/crd-acme/) 的文档中了解到:

kubectl port-forward --address 0.0.0.0 service/traefik 8000:8000 8080:8080 443:4443 -n default

是必需的,我现在明白了。您需要将主机端口映射到服务端口。 但是以这种方式映射端口感觉笨拙且违反直觉。我不想在 yaml 中包含部分服务描述,同时必须记住我需要使用 kubectl.

映射端口

我很确定这个问题有一个简洁明了的解决方案,但我不明白如何让事情变得简单。你们有使用新的 traefik 2.x CRD 配置的 kubernetes 经验吗?

apiVersion: v1
kind: Service
metadata:
  name: traefik

spec:
  ports:
    - protocol: TCP
      name: web
      port: 80
      targetPort: 8000
    - protocol: TCP
      name: admin
      port: 8080
      targetPort: 8080
    - protocol: TCP
      name: websecure
      port: 443
      targetPort: 4443
  selector:
    app: traefik

您是否尝试过使用 tragetPort,其中每个请求都从 80 重定向到 8000,但是当您使用端口转发时,您需要始终使用服务而不是 pod

您可以尝试使用 LoadBalancer 服务类型在端口 80、443 和 8080 上公开 Traefik 服务。我已经测试了您在 GKE 中提供的 link 的 yaml,它可以工作。

您需要更改 'traefik' 服务上的端口并添加 'LoadBalancer' 作为服务类型:

kind: Service
metadata:
  name: traefik
spec:
  ports:
    - protocol: TCP
      name: web
      port: 80 <== Port to receive HTTP connections
    - protocol: TCP
      name: admin
      port: 8080 <== Administration port
    - protocol: TCP
      name: websecure
      port: 443 <== Port to receive HTTPS connections
  selector:
    app: traefik
  type: LoadBalancer <== Define the type load balancer

Kubernetes 将为您创建一个负载均衡器服务,您可以使用端口 80 和 443 访问您的应用程序。

$ curl https://35.111.XXX.XX/tls -k
Hostname: whoami-5df4df6ff5-xwflt
IP: 127.0.0.1
IP: 10.60.1.11
RemoteAddr: 10.60.1.13:55262
GET /tls HTTP/1.1
Host: 35.111.XXX.XX
User-Agent: curl/7.66.0
Accept: */*
Accept-Encoding: gzip
X-Forwarded-For: 10.60.1.1
X-Forwarded-Host: 35.111.XXX.XX
X-Forwarded-Port: 443
X-Forwarded-Proto: https
X-Forwarded-Server: traefik-66dd84c65c-4c5gp
X-Real-Ip: 10.60.1.1

$ curl http://35.111.XXX.XX/notls   
Hostname: whoami-5df4df6ff5-xwflt
IP: 127.0.0.1
IP: 10.60.1.11
RemoteAddr: 10.60.1.13:55262
GET /notls HTTP/1.1
Host: 35.111.XXX.XX
User-Agent: curl/7.66.0
Accept: */*
Accept-Encoding: gzip
X-Forwarded-For: 10.60.1.1
X-Forwarded-Host: 35.111.XXX.XX
X-Forwarded-Port: 80
X-Forwarded-Proto: http
X-Forwarded-Server: traefik-66dd84c65c-4c5gp
X-Real-Ip: 10.60.1.1

好吧,过了一段时间我决定在 kubernetes 集群前面放一个 haproxy。这似乎是唯一的解决方案 ATM。