配置 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

  1. 下载安装Istio(请参阅 Istio入门指南中的说明)。

    安装完成后,所有部署、pod 和服务都将部署在名为 的命名空间中istio-system。此命名空间包含一个LoadBalancer名为 的类型服务service/istio-ingressgateway,用于公开外部 IP 地址。

  2. 查找EXTERNAL-IPistio-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
    
  3. 创建一个 DNS 条目,将您选择的数据库主机名(或后跟域名的通配符*)解析为 Istio EXTERNAL-IP。使用此主机名从集群外部访问您的数据库。

    在此示例中,任何以 结尾的主机名.istio.k8s.my.example.com都将解析为 Istio LoadBalancer 的外部 IP 10.145.78.91。请相应地替换您自己的值。

  4. 验证记录是否创建成功。

    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自定义资源

  1. 在不同于的命名空间上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
    
  2. 应用Gateway自定义资源文件来创建 Ingress 网关。

    kubectl apply -f redis-gateway.yaml
    
  3. 验证网关是否创建成功。

    kubectl get gateway
    
    NAME            AGE
    redis-gateway   3h33m
    

VirtualService自定义资源

  1. 在不同于的命名空间上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在此示例中)。
  2. 应用VirtualService自定义资源文件来创建虚拟服务。

    kubectl apply -f redis-vs.yaml
    
  3. 验证虚拟服务是否创建成功。

    kubectl get vs
    
    NAME       GATEWAYS            HOSTS                              AGE
    redis-vs   ["redis-gateway"]   ["*.istio.k8s.my.example.com"]   3h33m
    
  4. 将运算符、Redis Enterprise Cluster (REC) 和 Redis Enterprise Database (REDB) 部署在与网关和虚拟服务相同的命名空间上。

测试对数据库的外部访问

要测试对数据库的外部访问,您需要一个支持TLSSNI的客户端。

请参阅使用 Openssl 测试您的访问使用 Python 测试您的访问以获取更多信息。

给此页面评分
返回顶部 ↑