kubernetes 使用 Traefik 2.x 公开服务作为 CRD 的入口
kubernetes expose services with Traefik 2.x as ingress with CRD
我有什么工作
我有一个 Kubernetes 集群如下:
- 单个控制平面(但计划扩展到 3 个控制平面以实现 HA)
- 2 个工作节点
在我部署的这个集群上(遵循来自 traefik https://docs.traefik.io/user-guides/crd-acme/ 的文档):
创建两个 pods 的部署:
- traefik 本身:它将负责暴露端口 80、8080 的路由
- whoami:响应 http 请求的简单 http 服务器
两项服务
- traefik 服务:
- whoami 服务:
一个traefik IngressRoute:
我想要什么
我在集群中有多个服务 运行,我想使用 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。
我有什么工作
我有一个 Kubernetes 集群如下:
- 单个控制平面(但计划扩展到 3 个控制平面以实现 HA)
- 2 个工作节点
在我部署的这个集群上(遵循来自 traefik https://docs.traefik.io/user-guides/crd-acme/ 的文档):
创建两个 pods 的部署:
- traefik 本身:它将负责暴露端口 80、8080 的路由
- whoami:响应 http 请求的简单 http 服务器
两项服务
- traefik 服务:
- whoami 服务:
- traefik 服务:
一个traefik IngressRoute:
我想要什么
我在集群中有多个服务 运行,我想使用 Ingress 将它们暴露给外部。 更准确地说,我想使用新的 Traefik 2.x CDR 入口方法。
我的最终目标是使用新的 traefiks 2.x CRD 使用 IngressRoute
自定义资源定义
有什么问题
如果我理解得很好,经典的 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。