GKE 入口中的ExternalName 服务的NEG 缺少网络端点

问题描述 投票:0回答:1

所以我尝试使用ExternalName服务来允许跨命名空间应用程序使用入口(命名空间1中的应用程序通过ExternalName服务类型使用命名空间2中的入口)。这是我原来的服务

metadata:
  annotations:
    cloud.google.com/neg: '{"ingress":true}'
  labels:
    app.kubernetes.io/component: app1
    app.kubernetes.io/instance: app1
  name: app1-svc
  namespace: app1-namespace
spec:
  internalTrafficPolicy: Cluster
  ports:
  - name: http
    port: 8080
    protocol: TCP
    targetPort: 8080
  selector:
    app.kubernetes.io/component: app1
    app.kubernetes.io/instance: app1
  sessionAffinity: None
  type: ClusterIP

namespace2 中的设置包括入口和服务(类型:ExternalName),如下

apiVersion: v1
kind: Service
metadata:
  name: external-svc-for-app1-svc
  namespace: app2-namespace
  annotations:
    cloud.google.com/neg: '{"ingress": true}'
spec:
  type: ExternalName
  externalName: app1-svc.app1-namespace.svc.cluster.local
  ports:
  - name: http
    port: 80
    protocol: TCP
    targetPort: 80

--------------------------------------------------

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-ns2
  namespace: app2-namespace
  annotations:
    kubernetes.io/ingress.allow-http: "false"
    cert-manager.io/cluster-issuer: letsencrypt
    kubernetes.io/ingress.class: gce-internal
    kubernetes.io/ingress.regional-static-ip-name: <ip-address>
spec:
  tls:
    - secretName: ingress-ns2-tls
      hosts:
        - <app1.example.com>
  rules:
    - host: <app1.example.com>
      http:
        paths:
          - path: /*
            pathType: ImplementationSpecific
            backend:
              service:
                name: external-svc-for-app1-svc
                port:
                  number: 80

为此外部服务创建了后端服务,因此作为 NEG,问题是未为外部服务配置网络端点。我必须手动提供网络端点才能使其工作。

我尝试过使用 nginx ingress 和 gce ingress,但没有成功。 理论上,它应该在 NEG 中配置端点,因为外部 svc 通过内部 DNS 指向实际服务

<service>.<name-space>.svc.cluster.local
,我可以从
app2-namespace
中的任何 pod 进行卷曲,并将流量路由到原始服务以及我提到的当我手动提供 app1 的网络端点时它起作用。 我查看了一些帖子,但大多数都说流量路由不起作用,它现在可以与ExternalName服务一起使用,唯一的问题是网络端点未配置。

kubernetes networking google-kubernetes-engine
1个回答
0
投票

使用无头服务和 DNS:您可以使用带有 DNS 的无头服务来实现相同的功能,而不是使用ExternalName 服务。无头服务(ClusterIP:无)不会分配 IP 地址,而是返回支持服务的 pod 的 IP 集。

apiVersion: v1
kind: Service
metadata:
  name: app1-svc-headless
  namespace: app1-namespace
spec:
  clusterIP: None
  ports:
  - name: http
    port: 8080
    protocol: TCP
    targetPort: 8080
  selector:
    app.kubernetes.io/component: app1
    app.kubernetes.io/instance: app1
apiVersion: v1
kind: Service
metadata:
  name: external-svc-for-app1-svc
  namespace: app2-namespace
  annotations:
    cloud.google.com/neg: '{"ingress": true}'
spec:
  type: ExternalName
  externalName: app1-svc-headless.app1-namespace.svc.cluster.local
  ports:
  - name: http
    port: 80
    protocol: TCP
    targetPort: 80
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-ns2
  namespace: app2-namespace
  annotations:
    kubernetes.io/ingress.allow-http: "false"
    cert-manager.io/cluster-issuer: letsencrypt
    kubernetes.io/ingress.class: gce-internal
    kubernetes.io/ingress.regional-static-ip-name: <ip-address>
spec:
  tls:
    - secretName: ingress-ns2-tls
      hosts:
        - <app1.example.com>
  rules:
    - host: <app1.example.com>
      http:
        paths:
          - path: /*
            pathType: ImplementationSpecific
            backend:
              service:
                name: external-svc-for-app1-svc
                port:
                  number: 80

无头服务:通过创建无头服务(ClusterIP:无),您可以允许 Kubernetes 直接返回 Pod 的 IP 地址,而不是单个 ClusterIP。

DNS 解析: Headless 服务使用 Kubernetes DNS 来解析 Pod IP 地址,然后可以由其他命名空间中的ExternalName 服务访问。

NEG: 由于 GKE 入口控制器不会为ExternalName 服务创建 NEG,因此此方法不依赖于 NEG,而是使用 DNS 来解析端点。

© www.soinside.com 2019 - 2024. All rights reserved.