配置 Istio 进行外部路由
将 Istio 配置为入口控制器,以便从 Kubernetes 集群外部访问 Redis Enterprise 数据库。
Kubernetes 的 Redis Enterprise 能够使用 Istio Ingress 网关作为 NGINX 或 HaProxy Ingress 控制器的替代。
Istio 也可以理解 Ingress 资源,但使用该机制会剥夺原生 Istio 资源提供的优势和选项。Istio 使用自定义资源提供了自己的配置方法。
为了配置 Istio 与 Redis Kubernetes 操作符一起工作,我们将使用两个自定义资源: aGateway和 a VirtualService。然后您将能够建立对数据库的外部访问。
为 Redis Enterprise 安装和配置 Istio
-
下载并安装Istio(请参阅 Istio入门指南中的说明)。
安装完成后,所有部署、pod 和服务都将部署在名为 的命名空间中
istio-system。此命名空间包含一个LoadBalancer名为 的类型服务service/istio-ingressgateway,用于公开外部 IP 地址。 -
查找
EXTERNAL-IP该istio-ingressgateway服务的。kubectl get svc istio-ingressgateway -n istio-system NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE istio-ingressgateway LoadBalancer 10.34.67.89 10.145.78.91 15021:12345/TCP,80:67891/TCP,443:23456/TCP,31400:78901/TCP,15443:10112/TCP 3h8m -
创建一个 DNS 条目,将您选择的数据库主机名(或后跟域名的通配符
*)解析为 IstioEXTERNAL-IP。使用此主机名从集群外部访问您的数据库。在此示例中,任何以 结尾的主机名
.istio.k8s.my.example.com都将解析为 Istio LoadBalancer 的外部 IP10.145.78.91。请相应地替换您自己的值。 -
验证记录是否创建成功。
dig api.istio.k8s.my.example.com查找
ANSWER SECTION您刚刚创建的记录。;; ANSWER SECTION: api.istio.k8s.my.example.com 0 IN A 10.145.78.91
创建自定义资源
Gateway自定义资源
-
在不同于的命名空间上
istio-system,创建一个Gateway自定义资源文件(redis-gateway.yaml在此示例中)。- 替换
.istio.k8s.my.example.com为与您的 DNS 记录匹配的域。 <selector-label>用 Istio 入口网关 pod 上设置的标签替换(最常见的是istio: ingress)。- 需要 TLS 直通模式才能安全访问数据库。
apiVersion: networking.istio.io/v1beta1 kind: Gateway metadata: name: redis-gateway spec: selector: istio: <selector-label> servers: - hosts: - '*.istio.k8s.my.example.com' port: name: https number: 443 protocol: HTTPS tls: mode: PASSTHROUGH - 替换
-
应用
Gateway自定义资源文件来创建 Ingress 网关。kubectl apply -f redis-gateway.yaml -
验证网关是否创建成功。
kubectl get gateway NAME AGE redis-gateway 3h33m
VirtualService自定义资源
-
在不同于的命名空间上
istio-system,创建VirtualService自定义资源文件(redis-vs.yaml在此示例中)。apiVersion: networking.istio.io/v1beta1 kind: VirtualService metadata: name: redis-vs spec: gateways: - redis-gateway hosts: - "*.istio.k8s.my.example.com" tls: - match: - port: 443 sniHosts: - api.istio.k8s.my.example.com route: - destination: host: rec1 port: number: 9443 - match: - port: 443 sniHosts: - db1.istio.k8s.my.example.com route: - destination: host: db1这会创建一条用于联系 REC 上的 API 服务器的路由 (
rec1) 和一条用于联系其中一个数据库的路由 (db1)。- 替换
.istio.k8s.my.example.com为与您的 DNS 记录匹配的域。 - 网关的元数据名称必须与网关的规范名称相似(
redis-gateway在此示例中)。
- 替换
-
应用
VirtualService自定义资源文件来创建虚拟服务。kubectl apply -f redis-vs.yaml -
验证虚拟服务是否创建成功。
kubectl get vs NAME GATEWAYS HOSTS AGE redis-vs ["redis-gateway"] ["*.istio.k8s.my.example.com"] 3h33m -
将运算符、Redis Enterprise Cluster (REC) 和 Redis Enterprise Database (REDB) 部署在与网关和虚拟服务相同的命名空间上。
测试对数据库的外部访问
要测试对数据库的外部访问,您需要一个支持TLS和SNI的客户端。
请参阅使用 Openssl 测试您的访问或使用 Python 测试您的访问以获取更多信息。