每种方法都需要在 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 证书创建以支持两者:
有很多选项可以做到这一点,例如 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