如何将 K8s 负载均衡器指向不同命名空间中的 pods

How to point K8s load balancer to pods in a different namespace

我在 Kubernetes 集群上使用 Scaleway 部署了一个入口 pod,它存在于 kube-system 命名空间中。我不小心在 default 命名空间上创建了一个负载均衡器服务,我不想删除它并在 kube-system 命名空间上重新创建一个新服务,所以我希望我的负载均衡器在 default命名空间将入口 pods 作为端点:

apiVersion: v1
kind: Service
metadata:
  name: ecom-loadbalancer
  labels:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
spec:
  selector:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
  ports:
    - port: 443
      targetPort: 443
  type: LoadBalancer

这可能吗?我应该在选择器字段中添加什么吗?


我尝试在与入口 pods 通信的 kube-system 命名空间中创建一个 clusterIP 服务,它成功了。

apiVersion: v1
kind: Service
metadata:
  name: ecom-loadbalancer
  namespace: kube-system
  labels:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
spec:
  selector:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
  ports:
    - port: 443
      targetPort: 443
  type: ClusterIP

然后,我尝试在默认命名空间中将该服务引用到我的 loadbalancer

apiVersion: v1
kind: Service
metadata:
  name: ecom-loadbalancer
spec:
  type: ExternalName
  externalName: ecom-loadbalancer.kube-system.svc.cluster.local
  ports:
    - port: 443
      targetPort: 443
  type: LoadBalancer

但是没有结果。 clusterIP 指向 Ingress pods,但负载均衡器仍然没有端点。

您需要正确重新创建它的至少三个原因(2 个技术和建议):

  1. ExternalName用于访问外部服务或其他命名空间中的服务。它的工作方式是在查找服务名称时,将返回 CNAME。所以换句话说,当请求应该被定向到其他地方时,它适用于出口连接。

    参见 service - externalname type and use cases Kubernetes Tips - Part 1 blog post from Alen Komljen

    您的用例不同。您希望从 kubernetes 集群外部获取请求到暴露的负载均衡器,然后将流量从它定向到集群内的另一个服务。内置的 kubernetes 条款是不可能的,因为服务可以是 LoadBalancerExternalName。您可以在上一个清单中看到 两种 类型根本不起作用。参见 service types

  2. 避免不必要的复杂性。由于将有越来越多的服务和其他部分,因此很难跟踪所有内容。

  3. 根据文档,使用 ExternalName 和某些协议通常可能会出现问题:

    Warning: You may have trouble using ExternalName for some common protocols, including HTTP and HTTPS. If you use ExternalName then the hostname used by clients inside your cluster is different from the name that the ExternalName references.

    For protocols that use hostnames this difference may lead to errors or unexpected responses. HTTP requests will have a Host: header that the origin server does not recognize; TLS servers will not be able to provide a certificate matching the hostname that the client connected to.

    Reference - Warning