通过使用SDS(Secret Discovery Service)为服务网关提供HTTPS安全支持、证书动态加载,从而提升服务网关安全性。本文介绍如何通过SDS配置TLS入口网关。
前提条件
- 创建ACK集群,请参见快速创建Kubernetes托管版集群。
- 创建ASM实例,请参见创建ASM实例。
- 添加集群到ASM实例,请参见添加集群到ASM实例。
- 部署应用到ASM实例的集群中,请参见部署应用到ASM实例。
- 在加入到ASM实例的ACK集群中部署入口网关,请参见添加入口网关。
- 使用域名需要备案才能正常访问,本示例中使用aliyun.com。
背景信息
入口网关代理与入口网关在同一Pod中运行,并监视与入口网关相同的命名空间中创建的Secret。在入口网关上启用SDS具有以下好处:
- 入口网关可以在不需要重启的情况下,动态添加、删除或更新所需要的证书、私钥或者对应的根证书。
- 不需要secret卷挂载。创建Kubernetes secret后,网关代理会捕获该secret,并将其包含的证书、私钥或根证书发送到入口网关。
- 网关代理可以监视多个证书、私钥对,只需要为多个主机创建secret并更新网关定义。
步骤一:在入口网关中启用SDS
说明 在Istio1.6版本中,默认启用SDS,无需执行以下步骤。
步骤二:为多个主机准备服务器证书和私钥
为aliyun.com
生成证书和私钥,并保存为Secret。
如果您已经拥有针对aliyun.com
可用的证书和私钥,需要将密钥命名为aliyun.com.key
,证书命名为aliyun.com.crt
。如果没有,可以通过openssl执行以下步骤来生成证书和密钥。
步骤三:为a.aliyun.com定义内部服务
示例中的内部服务是基于Nginx实现的,首先为Nginx服务器创建配置文件。以域名a.aliyun.com
的内部服务为例,定义请求根路径直接返回字样Welcome to a.aliyun.com!及状态码200。myexample-nginx.conf的具体内容如下。
events {
}
http {
log_format main '$remote_addr - $remote_user [$time_local] $status '
'"$request" $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
error_log /var/log/nginx/error.log;
server {
listen 80;
location /hello {
return 200 'Welcome to a.aliyun.com!';
add_header Content-Type text/plain;
}
}
}
步骤四:为b.aliyun.com定义内部服务
本示例中的内部服务是基于httpbin实现的,创建并拷贝如下内容到httpbin.example.yaml文件中,并执行kubectl apply -f httpbin.example.yaml
命令(注意是在入口网关Pod所在的集群对应的kubeconfig环境下),创建域名b.aliyun.com
的内部服务。
apiVersion: v1
kind: Service
metadata:
name: httpbin
labels:
app: httpbin
spec:
ports:
- name: http
port: 8000
selector:
app: httpbin
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: httpbin
spec:
replicas: 1
selector:
matchLabels:
app: httpbin
version: v1
template:
metadata:
labels:
app: httpbin
version: v1
spec:
containers:
- image: docker.io/citizenstig/httpbin
imagePullPolicy: IfNotPresent
name: httpbin
ports:
- containerPort: 8000
步骤五:创建自定义网关配置对象
步骤六:创建虚拟服务
执行结果
可以通过以下任意一种方法获取入口网关服务的地址:
- 通过控制台查看,请参见查看入口网关的服务信息。
- 执行以下命令(注意是在入口网关Pod所在的集群对应的kubeconfig环境下),获取入口网关服务的地址。
kubectl get svc -n istio-system -l istio=ingressgateway
- 执行以下命令,通过HTTPS协议访问aliyun.com服务。
curl -k -H Host:a.aliyun.com --resolve a.aliyun.com:443:{替换成真实的入口网关IP地址} https://a.aliyun.com/hello
Welcome to aliyun.com!
- 执行以下命令,通过HTTPS协议访问httpbin.example.com服务。
curl -k -H Host:b.aliyun.com --resolve b.aliyun.com:443:{替换成真实的入口网关IP地址} https://b.aliyun.com/status/418
-=[ teapot ]=- _...._ .' _ _ `. | ."` ^ `". _, \_;`"---"`|// | ;/ \_ _/ `"""`
在文档使用中是否遇到以下问题
更多建议
匿名提交