google-cloud-platform - 使用 Google Cloud 重定向网址
问题描述
我已经在 Cloud DNS 中配置了一个域 (example.com)。通过这个域,我可以访问 GKE 集群中的微服务。我在 CloudDNS 中使用 istio-ingressgateway IP 来建立集群之间的关联
现在我有另一个域(newexample.com),带有用于 https 连接的自定义证书。有没有办法将所有对 newexample.com 的请求重定向到 example.com?如果可能,我不想更改 gke/istio 配置中的任何内容。
解决方案
每种方法都需要在 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 地址。
您可以创建 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
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
为示例应用创建证书
如前所述,Alternative Names
可以使用 Let's Encrypt 创建证书。我创建了它:
- 带有 Ubuntu 16.04 的 GCE 虚拟机
- 打开 80 端口
old.domain
指向VM的公共IP地址的域名- 指南:Linode.com:文档:安装让我们加密以创建 SSL 证书
- 创建证书的命令:
$ ./letsencrypt-auto certonly --standalone -d
old.domain
-d
new.domain
- 在 /etc/letsencrypt/archive/ 中创建的证书用于为
GKE
with 命令创建 tls 机密:$ kubectl create secret tls
ssl-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
推荐阅读
- angular - 角反应形式,输入错误:没有名称的表单控件的值访问器
- sql - 条件自联接 SQL Server
- postgresql - 每当在 Google Cloud SQL 中插入或更新数据时,是否可以向 Google Pub/Sub 发布消息?
- c++ - 模板化类数组的参数推导隐式初始化
- aix - “nm”的输出包括一些以“.”开头的符号。在 AIX 上,它是什么?
- spring - 本地主机上的 Spring Boot HTTPS
- c++ - 在运行时分配模板变量
- python - python discord 音乐机器人 youtube_dl
- flutter - 如何停止导航器重新加载视图?
- javascript - 如何突出显示jQuery滑块中的选定区域?