在 Kubernetes 中使用 traefik 作为负载均衡器的问题
Problem using traefik as load balancer in Kubernetes
情况是我有两个连接在它们之间的 k8s 服务。两者都是烧瓶服务器。它们之间的连接如下,如果有人对第一个进行 POST,这将获取文本输入并将其 POST 发送到第二个服务器,第二个服务器将更多文本添加到发布的原始文本中由用户发送,最后,这两个文本一起返回到第一个服务器,它 returns 将最终文本返回给用户。
为了允许我的 k8s 服务(称为 master 和 slave,匹配标签 app-master 和 app-slave)之间的这种连接,我有以下网络策略:
kind: NetworkPolicy
apiVersion: extensions/v1beta1
metadata:
name: master-to-slave
namespace: innovation
spec:
podSelector:
matchLabels:
app: app-slave
ingress:
- ports:
- port: 5000
protocol: TCP
- port: 5001
protocol: TCP
- from:
- namespaceSelector:
matchLabels:
app: app-master
要从租户外部进行卷曲,我必须使用 traefik,因为我在一个已经将 traefik 作为 NodePort 的租户中工作,所以我不能将我的主服务公开为 nodePort 或将其转换为类型 LoadBalancer。这个应用程序的入口是下一个
kind: Ingress
apiVersion: extensions/v1beta1
metadata:
name: ingress-innovation
namespace: innovation
annotations:
traefik.frontend.rule.type: PathPrefixStrip
spec:
rules:
- http:
paths:
- path: /master
backend:
serviceName: master
servicePort: 5000
- path: /slave
backend:
serviceName: slave
servicePort: 5001
我还有一个 DNS,它允许我向地址 (https://name_in_the_DNS) 发出请求,而不是向我的租户的 IP 发出请求。问题是当我尝试执行以下请求时:
curl https://name_in_the_DNS/master -X POST -d texto
给我一个错误(网关超时)。而如果我使用 "kubectl port-forward" 应用程序按预期工作。知道如何解决这个问题吗?我想这与 networkPolicy 有关,因为我在租户中有其他应用程序并且 curl 请求适用于它们。
提前致谢!
查看服务和部署 yaml:
问题已经解决。问题是我们在其他名称空间中有 traefik,因此缺少另一个允许任何名称空间之间通信的网络策略。修复问题的 yaml 如下。
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
name: all-to-all
namespace: innovation
spec:
podSelector: {} #all pods in the namespace (innovation)
ingress:
- from:
- namespaceSelector: {} #from all namespaces, including the one in which traefik ingress is located
policyTypes:
- Ingress
情况是我有两个连接在它们之间的 k8s 服务。两者都是烧瓶服务器。它们之间的连接如下,如果有人对第一个进行 POST,这将获取文本输入并将其 POST 发送到第二个服务器,第二个服务器将更多文本添加到发布的原始文本中由用户发送,最后,这两个文本一起返回到第一个服务器,它 returns 将最终文本返回给用户。
为了允许我的 k8s 服务(称为 master 和 slave,匹配标签 app-master 和 app-slave)之间的这种连接,我有以下网络策略:
kind: NetworkPolicy
apiVersion: extensions/v1beta1
metadata:
name: master-to-slave
namespace: innovation
spec:
podSelector:
matchLabels:
app: app-slave
ingress:
- ports:
- port: 5000
protocol: TCP
- port: 5001
protocol: TCP
- from:
- namespaceSelector:
matchLabels:
app: app-master
要从租户外部进行卷曲,我必须使用 traefik,因为我在一个已经将 traefik 作为 NodePort 的租户中工作,所以我不能将我的主服务公开为 nodePort 或将其转换为类型 LoadBalancer。这个应用程序的入口是下一个
kind: Ingress
apiVersion: extensions/v1beta1
metadata:
name: ingress-innovation
namespace: innovation
annotations:
traefik.frontend.rule.type: PathPrefixStrip
spec:
rules:
- http:
paths:
- path: /master
backend:
serviceName: master
servicePort: 5000
- path: /slave
backend:
serviceName: slave
servicePort: 5001
我还有一个 DNS,它允许我向地址 (https://name_in_the_DNS) 发出请求,而不是向我的租户的 IP 发出请求。问题是当我尝试执行以下请求时:
curl https://name_in_the_DNS/master -X POST -d texto
给我一个错误(网关超时)。而如果我使用 "kubectl port-forward" 应用程序按预期工作。知道如何解决这个问题吗?我想这与 networkPolicy 有关,因为我在租户中有其他应用程序并且 curl 请求适用于它们。
提前致谢!
查看服务和部署 yaml:
问题已经解决。问题是我们在其他名称空间中有 traefik,因此缺少另一个允许任何名称空间之间通信的网络策略。修复问题的 yaml 如下。
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
name: all-to-all
namespace: innovation
spec:
podSelector: {} #all pods in the namespace (innovation)
ingress:
- from:
- namespaceSelector: {} #from all namespaces, including the one in which traefik ingress is located
policyTypes:
- Ingress