首页 > 解决方案 > 使用 Google Cloud 重定向网址

问题描述

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

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

标签: google-cloud-platformgoogle-kubernetes-engineistiogoogle-cloud-dns

解决方案


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

解决方案之一是CNAME在 Cloud DNS 和 SSL 证书中记录一个Alternative Names.

使用上述解决方案,假设Istio 配置正确,您将能够GKE/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:什么是 san 以及如何使用它

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

  • old.domain
  • new.domain

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


例子

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

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

DNS zone在 Cloud DNS 中配置

您将需要有 2 条记录:

  • A使用 Ingress Gateway 的 IP 和名称记录:old.domain
  • CNAMEold.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

为示例应用创建证书

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

  • 带有 Ubuntu 16.04 的 GCE 虚拟机
  • 打开 80 端口
  • old.domain指向VM的公共IP地址的域名
  • 指南:Linode.com:文档:安装让我们加密以创建 SSL 证书
  • 创建证书的命令:

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

  • 在 /etc/letsencrypt/archive/ 中创建的证书用于为GKEwith 命令创建 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

推荐阅读