URL-адреса перенаправления с помощью Google Cloud

У меня есть домен (example.com), уже настроенный в Cloud DNS. С помощью этого домена я могу получить доступ к микросервисам, которые находятся в кластере GKE. Я использую IP-адрес istio-ingressgateway в CloudDNS для установления связи между кластером

Теперь у меня есть еще один домен (newexample.com) с настраиваемым сертификатом для https-соединений. Есть ли способ перенаправить все запросы с newexample.com на example.com? Я не хочу ничего менять в конфигурации gke / istio, если это возможно.


person Edgar Peixoto    schedule 28.05.2020    source источник
comment
Вы можете добавить A запись к DNS серверам, чтобы указать ваш домен на ingress-gateway службу балансировки нагрузки Istio, однако вопрос в том, как вы хотите добавить свои ssl-сертификаты без изменения вашей ingress-gateway конфигурации.   -  person Dawid Kruk    schedule 29.05.2020
comment
Вы не можете перенаправить домен, используя только A записи. Целевой сертификат SSL должен поддерживать перенаправляемое доменное имя, иначе вы получите ошибку безопасности в браузере / приложении.   -  person John Hanley    schedule 30.05.2020
comment
Как правильно указано в предыдущем комментарии Джона Хэнли, необходимо будет изменить сертификаты, привязанные к ingress-gateway. Это потребует дополнительных изменений в вашем ingress-gateway определении, поскольку хост будет другим (при условии, что это не *).   -  person Dawid Kruk    schedule 02.06.2020


Ответы (1)


Для каждого метода потребуется некоторая реконфигурация на стороне GKE / Istio.

Одно из решений - иметь CNAME запись в облачном DNS и сертификат SSL с Alternative Names.

С помощью вышеуказанного решения вы сможете отправлять запросы в свой 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: что такое san и как он используется

Вы можете создать сертификат SSL для поддержки обоих:

  • old.domain
  • new.domain

Для этого есть множество вариантов, например Let's Encrypt или Cert Manager.


Пример

Я создал пример, чтобы показать вам, как это сделать:

  • Настройте DNS zone в Cloud DNS
  • Создайте базовое приложение с сервисом
  • Создайте сертификат для примера приложения
  • Создайте Istio ресурсы, чтобы разрешить подключения к примеру приложения
  • Тестовое задание

Настроить DNS zone в Cloud DNS

Вам потребуется 2 записи:

  • A запись с IP-адресом вашего шлюза Ingress и именем: old.domain
  • CNAME запись, указывающая на old.domain с именем: new.domain

Ознакомьтесь с официальной документацией: Cloud.google.com: DNS: записи

Создайте базовое приложение с сервисом

Ниже приведен пример приложения со службой, которая ответит простым приветствием:

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. Я создал его с помощью:

  • Виртуальная машина GCE с Ubuntu 16.04
  • Открыть порт 80
  • Доменное имя old.domain, указывающее на общедоступный IP-адрес виртуальной машины
  • Руководство: Linode.com: Документы : Установите Let's encrypt, чтобы создать сертификат SSL
  • Команда для создания сертификата:
    # P18 #
  • Сертификат, созданный в / etc / letsencrypt / archive /, используется при создании секрета tls для GKE с помощью команды:
    # P19 #

Помните, что этот сертификат был создан только для целей тестирования, и я настоятельно рекомендую использовать специальное решение, например: Сертификат-менеджер

PS: Если вы использовали этот метод, отмените изменения в облачном 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
person Dawid Kruk    schedule 09.06.2020