首页 > 解决方案 > 使入口/服务在 GKE 上公开 DNS 可解析

问题描述

我们在 Google Cloud 上设置了一个 GKE 集群,我们希望新的入口路由能够在相应的子域下自动解析。

我们有一个子域(比如说 app-dev.company.com),它已经解析为我们的入口控制器(Traefik)的公共 IP,当我在 k8s 上创建一个服务“hello-world”时,它应该可以在下自动公开解析hello-world.app-dev.company.com 也是如此。

我以前在 Azure 上使用集群,只需使用存根域和上游 DNS 配置 CoreDNS,然后它就可以工作了。现在谷歌出于某种原因仍在使用 kube-dns;我尝试在 kube-dns 中配置存根域“app-dev.company.com”并安装 CoreDNS(并将 kube-dns 缩小到 0),但这不起作用并且破坏了其他一些东西,所以我回滚了它。

我还研究了谷歌的云 DNS 服务(因为谷歌推荐它),但我不希望在 tbh 中硬供应商锁定,我也不确定这是否能达到我想要的效果。

有人可以在这里指出我正确的方向吗?

标签: google-cloud-platformcloudgoogle-kubernetes-enginegoogle-cloud-dnscoredns

解决方案


一些东西:

  • 您需要保留一个全局静态 IP 地址
  • 您将需要创建/更新您的 DNS 记录以指向该 IP 地址。
  • GKE Ingress 和 GCP 外部负载均衡器之间存在 1-1 映射。这意味着您不能将多个 Ingress 资源映射到同一个外部 IP。
  • 如果您想在同一个 Ingress 后面拥有多个应用程序,您可以将 Ingress 资源配置为使用基于路径或基于名称的虚拟主机来路由到多个后端应用程序。

预留静态 IP 地址:

gcloud compute addresses create ${ADDRESS} --global

将 ${ADDRESS} 替换为您喜欢的任何名称。

注释您的 Ingress 资源以告诉负载均衡器使用上面创建的静态 IP

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: helloweb
  annotations:
    kubernetes.io/ingress.global-static-ip-name: ${ADDRESS}

将 ${ADDRESS} 替换为上一步中创建的静态 IP 的名称

配置多个后端应用

基于路径

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: multi-app-fanout
  annotations:
    kubernetes.io/ingress.global-static-ip-name: ${ADDRESS}
spec:
  rules:
  - http:
      paths:
      - path: /*
        pathType: ImplementationSpecific
        backend:
          service:
            name: app1
            port:
              number: 8080
      - path: /app2/*
        pathType: ImplementationSpecific
        backend:
          service:
            name: app2
            port:
              number: 8080
      - path: /app3/*
        pathType: ImplementationSpecific
        backend:
          service:
            name: app3
            port:
              number: 8080

您将按如下方式访问您的应用程序:

  • app-dev.company.com
  • app-dev.company.com/app2
  • app-dev.company.com/app3

基于名称的虚拟主机

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: multi-app-virtual
  annotations:
    kubernetes.io/ingress.global-static-ip-name: ${ADDRESS}
spec:
  rules:
  - host: app1.app-dev.company.com
    http:
      paths:
      - pathType: Prefix
        path: "/"
        backend:
          service:
            name: app1
            port:
              number: 8080
  - host: app2.app-dev.company.com
    http:
      paths:
      - pathType: Prefix
        path: "/"
        backend:
          service:
            name: app2
            port:
              number: 8080
  - host: ap32.app-dev.company.com
    http:
      paths:
      - pathType: Prefix
        path: "/"
        backend:
          service:
            name: app3
            port:
              number: 8080

您将按如下方式访问您的应用程序:

  • app1.app-dev.company.com
  • app2.app-dev.company.com
  • app3.app-dev.company.com

配置 DNS 记录 如果您选择进行基于路径的路由,那么您只需要添加一个 DNS A 记录,它将app-dev.company.com映射到上面创建的全局 IP 地址。

如果您选择基于名称的虚拟主机,则需要创建通配符记录映射 * .app-dev.company.com到全局 IP 地址。

有关更多信息,请参阅https://cloud.google.com/kubernetes-engine/docs/tutorials/configuring-domain-name-static-ip


推荐阅读