【问题标题】:Redirect URLs using Google Cloud使用 Google Cloud 重定向网址
【发布时间】:2020-05-28 16:43:11
【问题描述】:

我已经在 Cloud DNS 中配置了一个域 (example.com)。通过这个域,我可以访问 GKE 集群中的微服务。我在 CloudDNS 中使用 istio-ingressgateway IP 来进行集群之间的关联

现在我有了另一个域 (newexample.com),其中包含用于 https 连接的自定义证书。有没有办法将所有对 newexample.com 的请求重定向到 example.com?如果可能,我不想更改 gke/istio 配置中的任何内容。

【问题讨论】:

  • 您可以将A 记录添加到DNS 服务器,以将您的域指向Istio 的ingress-gateway 负载均衡器服务,但是问题是如何在不修改您的服务器的情况下添加您的ssl 证书ingress-gateway 配置。
  • 您不能单独使用A 记录重定向域。目标 SSL 证书必须支持您重定向的域名,否则您将在浏览器/应用程序中收到安全错误。
  • 正如 John Hanley 在之前的评论中正确指出的那样,有必要更改绑定到 ingress-gateway 的证书。这将需要对您的 ingress-gateway 定义进行额外更改,因为主机会有所不同(假设它不是 *)。

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


【解决方案1】:

每种方法都需要在 GKE/Istio 端进行一些重新配置。

对此的解决方案之一是在 Cloud DNS 中拥有 CNAME 记录和带有 Alternative Names 的 SSL 证书。

使用上述解决方案,您将能够使用两个域名向您的 GKE/Istio 集群发送请求,前提是 正确的 Istio 配置


CNAME 是什么?

CNAME 是规范名称记录或别名记录。

域名系统 (DNS) 中的一种资源记录,指定一个域名是另一个规范域名的别名。

CNAME 记录示例:

DNS name       Type      TTL     Data
old.domain.    A         60      1.2.3.4
new.domain.    CNAME     60      old.domain.

其他名称:

SAN 或主题备用名称是一种结构化方式,用于指示受证书保护的所有域名和 IP 地址。

Enstrustdatacard.com: What is a san and how is it used

您可以创建 SSL 证书创建以支持两者:

  • old.domain
  • new.domain

有很多选项可以做到这一点,例如 Let's Encrypt 或 Cert Manager。


示例

我已经创建了一个示例来向您展示如何做到这一点:

  • 在 Cloud DNS 中配置 DNS zone
  • 使用服务创建基本应用
  • 为示例应用创建证书
  • 创建Istio 资源以允许连接到示例应用
  • 测试

在 Cloud DNS 中配置 DNS zone

您需要有 2 条记录:

  • A 记录您的 Ingress Gateway 的 IP 和名称:old.domain
  • CNAME 记录指向 old.domain 名称:new.domain

请看官方文档:Cloud.google.com: DNS: Records

使用服务创建基本应用

下面是一个示例应用程序,它的服务将以一个基本的 hello 响应:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: hello-dp
spec:
  selector:
    matchLabels:
      app: hello-dp
  replicas: 1
  template:
    metadata:
      labels:
        app: hello-dp
    spec:
      containers:
      - name: hello
        image: "gcr.io/google-samples/hello-app:2.0"
        env:
        - name: "PORT"
          value: "50001"
---
apiVersion: v1
kind: Service
metadata:
  name: hello-sv
spec:
  selector:
    app: hello-dp
  ports:
    - name: hello-port
      protocol: TCP
      port: 50001
      targetPort: 50001
  type: ClusterIP

为示例应用创建证书

如前所述,可以使用 Let's Encrypt 创建带有Alternative Names 的证书。我创建了它:

  • 带有 Ubuntu 16.04 的 GCE 虚拟机
  • 打开80端口
  • 域名old.domain指向VM的公网IP地址
  • 导游:Linode.com: Docs: Install let's encrypt to create a SSL certificate
  • 创建证书的命令:

    $ ./letsencrypt-auto certonly --standalone -dold.domain-dnew.domain

  • 在 /etc/letsencrypt/archive/ 中创建的证书用于为 GKE 创建 tls 机密,使用以下命令:

    $ kubectl create secret tlsssl-certificate--cert cert1.pem --key privkey1.pem

请记住,此证书仅用于测试目的,我强烈建议使用专用解决方案,例如:Cert-manager

PS:如果您使用此方法,请还原 Cloud DNS 中的更改以指向 Istio 网关。


创建Istio 资源以允许连接到示例应用

以下是示例 Istio 资源,允许连接到支持 HTTPS 的示例应用:

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: hello-gw
spec:
  selector:
    istio: ingressgateway
  servers:
  - port:
      number: 443
      name: https
      protocol: HTTPS
    tls:
      mode: SIMPLE
      credentialName: ssl-certificate
    hosts:
    - "old.domain"
    - "new.domain"
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: hello-vs
spec:
  hosts:
  - "old.domain"
  - "new.domain"
  gateways:
  - hello-gw
  http:
  - route:
    - destination:
        host: hello-sv
        port:
          number: 50001

请具体看一下:

    tls:
      mode: SIMPLE
      credentialName: ssl-certificate

这部分将确保与集群的连接将使用 HTTPS

另外:

  hosts:
  - "old.domain"
  - "new.domain"

以上两个资源中的定义将只允许与指定域的连接。

测试

应用上述所有资源后,您应该可以在浏览器中输入:

  • https://old.domain
  • https://new.domain

并收到以下消息和有效的 SSL 证书:

Hello, world!
Version: 2.0.0
Hostname: hello-dp-5dd8b85b56-bk7zr

【讨论】:

    猜你喜欢
    • 2017-09-12
    • 2012-05-21
    • 2016-11-21
    • 2016-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多