【问题标题】:GKE Ingress pointing to ExternalName service doesn't work指向 ExternalName 服务的 GKE Ingress 不起作用
【发布时间】:2021-08-01 05:48:22
【问题描述】:

首先,我要构建的内容就在下面。

如上图,我希望 Ingress 将流量分配给位于同一集群中其他命名空间 me 的服务。 (Ingress 在main 命名空间中)但是Ingress 不允许直接指向dns,我做ExternalName Service 指向me-service dns me-service.me.svc.cluster.local 然后Ingress 指向它。

它的Yaml是

main.k8s.yaml

apiVersion: v1
kind: Namespace
metadata:
  name: main
---
apiVersion: v1
kind: Service
metadata:
  name: me-service
  namespace: main
spec:
  externalName: me-service.me.svc.cluster.local
  type: ExternalName
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    kubernetes.io/ingress.class: gce
  name: main-router
  namespace: main
spec:
  rules:
  - host: some-domain.me
    http:
      paths:
      - backend:
          service:
            name: me-service
            port:
              number: 80
        path: /
        pathType: ImplementationSpecific

me.k8s.yaml

apiVersion: v1
kind: Namespace
metadata:
  labels:
    stag: production
  name: me
---
apiVersion: v1
kind: Service  # <-- this is the service I want to point
metadata:
  labels:
    app: me
    stag: production
  name: me-service
  namespace: me
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: me
    stag: production
  type: ClusterIP
---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: me
    stag: production
  name: me-deployment
  namespace: me
spec:
  replicas: 2
  selector:
    matchLabels:
      app: me
      stag: production
  template:
    metadata:
      labels:
        app: me
        stag: production
    spec:
      containers:
      - image: gcr.io/me:latest
        name: me
        ports:
        - containerPort: 80
        resources:
          limits:
            cpu: 300m
            memory: 512M
          requests:
            cpu: 250m
            memory: 512M

我检查了 dns 地址是否有效,但未创建 Ingress 对象并显示错误消息

me-service:80 (<error: endpoints "me-service" not found>)
 Type     Reason     Age                    From                     Message
  ----     ------     ----                   ----                     -------
  Warning  Translate  6m21s (x233 over 22h)  loadbalancer-controller  Translation failed: invalid ingress spec: could not find port "80" in service "main/me-service"

如何让 ingress 工作?如果您需要更多信息,请告诉我。 :祈祷:

GKE 引擎:1.20.6-gke.1000

HTTP 负载平衡:启用

网络政策:已停用

Dataplane V2:启用

【问题讨论】:

  • 据我所知,您不能将 GKE ingressExternalName 服务类型一起使用。两种支持的类型是LoadBalancerNodePort。如果最近没有任何变化,即使使用简单的ClusterIP,您也不应该创建入口资源,只有上面提到的两种 svc 类型,所以我不相信ExternalName 会起作用。好吧,您实际上可以使用 ClusterIP,但前提是您使用 container native load balancing,这要求您的 GKE 集群是 VPC 原生的。
  • @mario 谢谢你的评论。那么你的意思是,只要我使用 GKE,对其他命名空间的负载平衡实际上是不可能的,对吧?
  • 我不会这么说的。您仍然可以使用 GKE,但不必同时使用 GCE 入口作为入口控制器。但如果它不适用于提到的容器原生负载平衡,我会先尝试。您始终可以在 GKE 集群上部署不同的入口控制器,例如nginx 入口。它可以使用开箱即用的ClusterIP 服务,但我不确定它是否可以处理ExternalName,所以你必须尝试一下。
  • @mario 感谢您的评论。我使用 NGINX-ingress 成功地将流量分配到其他命名空间 svc。

标签: kubernetes google-cloud-platform google-kubernetes-engine


【解决方案1】:

我将其发布为更好的可见性的答案。正如我在我的 cmets 中已经提到的:

据我所知,您不能将 GKE 入口ExternalName 服务类型一起使用。两种支持的类型是LoadBalancerNodePort。如果最近没有任何变化,即使使用简单的ClusterIP,您也不应该创建入口资源,只有上面提到的两种 svc 类型,所以我不相信ExternalName 会起作用。好吧,您实际上可以使用 ClusterIP,但前提是您使用 container native load balancing,这要求您的 GKE 集群是 VPC 原生的。

您仍然可以使用 GKE,但不必同时使用 GCE ingress 作为入口控制器。但如果它不适用于上述容器原生负载平衡,我会先尝试。

您始终可以在您的 GKE 集群上部署 不同的入口控制器,例如nginx 入口。它可以使用开箱即用的ClusterIP 服务,但我不确定它是否可以处理ExternalName,所以您必须尝试一下。

OP 确认使用 nginx-ingress 可以将流量分配到位于不同命名空间中的服务:

@mario 感谢您的评论。我成功分配流量 使用 NGINX-ingress 到其他命名空间 svc。 – HyeonJunOh 7 月 23 日在 9:23

【讨论】:

    猜你喜欢
    • 2021-08-30
    • 1970-01-01
    • 2021-05-01
    • 1970-01-01
    • 2020-11-25
    • 1970-01-01
    • 1970-01-01
    • 2022-06-21
    • 1970-01-01
    相关资源
    最近更新 更多