IBM Cloud Docs
部署定制 Istio 网关

部署定制 Istio 网关

创建 IstioOperator (IOP) 定制资源,为 Istio 管理的应用程序流量定义您自己的入口和出口网关。

缺省情况下,将在集群的 istio-system 名称空间中创建一个 istio-ingressgateway 部署。 此部署公开为具有外部可访问 IP 地址的公共负载均衡器服务。 然后,您可以在 Gateway 资源中为Istio管理的应用程序定义端口,该资源将配置 istio-ingressgateway 负载均衡器以侦听这些端口的入站 HTTP /TCP流量。 此外,缺省情况下会创建一个 istio-egressgateway,并将其公开为负载均衡器服务,以管理来自 Istio 管理的应用程序的出站流量。

但是,您可能想要在这些缺省网关之外创建其他入口或出口网关部署。 例如,出于以下原因,您可以创建其他网关以与缺省网关一起运行,或者运行以代替缺省网关:

  • 某些工作负载或名称空间之间的单独流量流
  • 为专用网络流量创建入口网关
  • 使用定制来修改网关,例如,网关 pod 节点亲缘关系,最小副本数和特定于区域的负载均衡器
  • 独立于针对受管 Istio 附加组件的所有组件推出的自动版本更新的控制网关版本更新

注意事项

开始之前,请查看有关使用定制网关的以下注意事项。

  • 受管 Istio 附加组件不会管理或协调您创建的任何定制网关。 您负责创建,管理和维护这些资源。
  • 部署定制网关后,请通过运行 kubectl logs -n ibm-operators -l name=addon-istio-operator 来检查 Istio 操作程序 pod 日志中是否存在语法错误。 Istio 操作程序验证并协调您所做的任何定制 IstioOperator (IOP) 更改。 如果您注意到协调循环 (由日志中的 info installer Reconciling IstioOperator 重复项指示),请执行步骤 以查找配置中导致循环错误的行
  • 此外,请确保 managed-istio-custom ConfigMap 中的 istio-global-proxy-accessLogFile 选项设置为 "/dev/stdout"。 特使代理将访问信息打印到其标准输出,您可以通过对 Envoy 容器运行 kubectl logs 命令来查看这些输出。

为公共流量创建定制入口网关

使用 IstioOperator (IOP) 在 custom-gateways 名称空间中创建定制入口网关部署和公共负载均衡器服务。

  1. 安装 Istio 附加组件

  2. 为定制入口网关创建名称空间。

    kubectl create namespace custom-gateways
    
  3. IstioOperator (IOP) 资源创建名为 custom-ingress-iop.yaml 的 YAML 文件。 要强制定制网关 pod 运行特定版本的受管 Istio,请在 tag 字段中指定版本。 有关更多信息,请参阅 控制定制网关更新和版本

    apiVersion: install.istio.io/v1alpha1
    kind: IstioOperator
    metadata:
      namespace: ibm-operators
      name: custom-ingressgateway-iop
    spec:
      profile: empty
      hub: icr.io/ext/istio
      # tag: 1.23.5
      components:
        ingressGateways:
          - name: custom-ingressgateway
            label:
              istio: custom-ingressgateway
            namespace: custom-gateways
            enabled: true
            k8s:
              serviceAnnotations:
                service.kubernetes.io/ibm-load-balancer-cloud-provider-ip-type: public
    
  4. 在集群中创建 IstioOperator (IOP) 资源。 ibm-operators 名称空间中的受管 Istio 操作程序使用 IOP 资源通过公共负载均衡器服务在 custom-gateways 名称空间中部署和公开入口网关。

    kubectl apply -f ./custom-ingress-iop.yaml
    
  5. 验证是否在 custom-gateways 名称空间中创建了入口网关部署和服务。

    kubectl get deploy,svc -n custom-gateways
    

    示例输出

    NAME                                    READY   UP-TO-DATE   AVAILABLE   AGE
    deployment.apps/custom-ingressgateway   1/1     1            1           4m53s
    
    NAME                            TYPE           CLUSTER-IP      EXTERNAL-IP     PORT(S)                                                                                                                                      AGE
    service/custom-ingressgateway   LoadBalancer   172.21.98.120   52.117.68.222   15020:32656/TCP,80:30576/TCP,443:32689/TCP,15029:31885/TCP,15030:30198/TCP,15031:32637/TCP,15032:30869/TCP,31400:30310/TCP,15443:31698/TCP   4m53s
    
  6. service/custom-ingressgateway 负载均衡器的输出中,记下 EXTERNAL-IP 列中的 IP 地址 (经典集群) 或主机名 (VPC 集群)。

现在,您可以在用于定义 Istio 管理的应用程序的端口的 Gateway 资源中指定此入口网关负载均衡器的名称 custom-ingressgateway。 然后,可以在定义服务网格中的微服务路径的 VirtualService 资源中指定 Gateway 的名称。 有关将 GatewayVirtualService 与定制网关负载均衡器配合使用的示例,请尝试 BookInfo 样本应用程序

设置 BookInfo 样本

部署 用于 Istio 的 BookInfo 样本应用程序 以测试对定制入口网关负载均衡器的访问权。

  1. 创建 bookinfo 名称空间并为 自动 Sidecar 注入标注名称空间。
    kubectl create namespace bookinfo
    kubectl label namespace bookinfo istio-injection=enabled
    
  2. 部署 BookInfo 示例应用程序。 将 <version> 替换为受管 Istio 附加组件运行的 major.minor 版本,您可以通过运行 ibmcloud ks cluster addon ls -c <cluster_name_or_ID> 来找到该版本。
    kubectl apply -n bookinfo -f https://raw.githubusercontent.com/istio/istio/release-<version>/samples/bookinfo/platform/kube/bookinfo.yaml
    
  3. 确保已部署 BookInfo 微服务及其相应的 pod。
    kubectl get svc -n bookinfo
    
    NAME                      TYPE           CLUSTER-IP       EXTERNAL-IP    PORT(S)          AGE
    details                   ClusterIP      172.21.19.104    <none>         9080/TCP         2m
    kubernetes                ClusterIP      172.21.0.1       <none>         443/TCP          1d
    productpage               ClusterIP      172.21.168.196   <none>         9080/TCP         2m
    ratings                   ClusterIP      172.21.11.131    <none>         9080/TCP         2m
    reviews                   ClusterIP      172.21.117.164   <none>         9080/TCP         2m
    
    kubectl get pods -n bookinfo
    
    NAME                                     READY     STATUS      RESTARTS   AGE
    details-v1-6865b9b99d-7v9h8              2/2       Running     0          2m
    productpage-v1-f8c8fb8-tbsz9             2/2       Running     0          2m
    ratings-v1-77f657f55d-png6j              2/2       Running     0          2m
    reviews-v1-6b7f6db5c5-fdmbq              2/2       Running     0          2m
    reviews-v2-7ff5966b99-zflkv              2/2       Running     0          2m
    reviews-v3-5df889bcff-nlmjp              2/2       Running     0          2m
    
  4. 创建名为 bookinfo-custom-gateway.yaml 的 YAML 文件以定义 GatewayVirtualService 资源。 请注意,Gateway 资源指定 custom-ingressgateway 作为先前创建的定制入口负载均衡器的名称,而 VirtualService 资源指定 bookinfo-gateway 作为 Gateway 资源的名称。
    apiVersion: networking.istio.io/v1alpha3
    kind: Gateway
    metadata:
      name: bookinfo-gateway
    spec:
      selector:
        istio: custom-ingressgateway
      servers:
      - port:
          number: 80
          name: http
          protocol: HTTP
        hosts:
        - "*"
    ---
    apiVersion: networking.istio.io/v1alpha3
    kind: VirtualService
    metadata:
      name: bookinfo
    spec:
      hosts:
      - "*"
      gateways:
      - bookinfo-gateway
      http:
      - match:
        - uri:
            exact: /productpage
        - uri:
            prefix: /static
        - uri:
            exact: /login
        - uri:
            exact: /logout
        - uri:
            prefix: /api/v1/products
        route:
        - destination:
            host: productpage
            port:
              number: 9080
    
  5. 在集群中创建 GatewayVirtualService 资源。
    kubectl apply -f bookinfo-custom-gateway.yaml -n bookinfo
    
  6. 使用先前部分中针对 service/custom-ingressgateway 负载均衡器找到的 IP 地址 (经典) 或主机名 (VPC),在浏览器中打开 BookInfo 应用程序的产品页面。
    http://<IP_OR_HOSTNAME>/productpage
    

定制入口网关负载均衡器现在使用 Gateway 资源中的端口和 VirtualService 资源中的微服务路径将流量路由到 BookInfo 应用程序。 接下来,您可以选择 为定制网关负载均衡器创建 DNS 记录

使用 IBM 提供的子域并通过TLS协议暴露 BookInfo

创建 IBM提供的子域以向 DNS 记录注册定制网关负载均衡器的 IP 地址 (经典) 或主机名 (VPC)。 为子域生成的 TLS 证书允许 HTTPS 与 BookInfo 应用建立连接。

  1. 通过创建 DNS 子域来注册定制网关负载均衡器的 IP 地址或主机名。 指定 TLS 私钥的 custom-gateway 名称空间。

    • 经典集群
      ibmcloud ks nlb-dns create classic --cluster <cluster_name_or_id> --ip <LB_IP> --secret-namespace custom-gateways
      
    • VPC 集群
      ibmcloud ks nlb-dns create vpc-gen2 -c <cluster_name_or_ID> --lb-host <LB_hostname> --secret-namespace custom-gateways
      
  2. 验证子域是否已创建。

    ibmcloud ks nlb-dns ls --cluster <cluster_name_or_id>
    

    经典仪表盘输出示例

    Hostname                                                                                IP(s)              Health Monitor   SSL Cert Status           SSL Cert Secret Name
    mycluster-a1b2cdef345678g9hi012j3kl4567890-0001.us-south.containers.appdomain.cloud     ["168.1.1.1"]      None             created                   <certificate>
    

    VPC集群的输出示例

    Subdomain                                                                               Load Balancer Hostname                        Health Monitor   SSL Cert Status           SSL Cert Secret Name
    mycluster-a1b2cdef345678g9hi012j3kl4567890-0001.us-south.containers.appdomain.cloud     ["1234abcd-us-south.lb.appdomain.cloud"]      None             created                   <certificate>
    
  3. 获取子域的私钥名称。

    kubectl get secret -n custom-gateways
    

    示例输出

    mycluster-af23f234rwr3asdfasdf-002   kubernetes.io/tls                     2      15m
    
  4. 在上一部分创建的 bookinfo-custom-gateway.yaml 中,修改 bookinfo-gateway Gateway 资源,添加一个 HTTPS 端口443和一个TLS部分,指定子域名的密码。

    apiVersion: networking.istio.io/v1alpha3
    kind: Gateway
    metadata:
      name: bookinfo-gateway
    spec:
      selector:
        istio: custom-ingressgateway
      servers:
      - port:
          number: 443
          name: https
          protocol: HTTPS
        tls:
          mode: SIMPLE
          credentialName: mycluster-af23f234rwr3asdfasdf-002 # secret name
        hosts:
        - "*"
    ---
    ...
    
  5. 在集群中创建已修改的 Gateway 资源。

    kubectl apply -f bookinfo-custom-gateway.yaml -n bookinfo
    
  6. 在 Web 浏览器中,打开 BookInfo 产品页面。 请确保您在步骤2中找到的子域使用的是 HTTPS。

    https://<subdomain>/productpage
    

为专用网络流量创建定制入口网关

要创建定制入口网关部署并使用专用负载均衡器服务公开该部署,请遵循 为公共流量创建定制入口网关 中的步骤。 在步骤 3 中创建 IOP 时,请指定 service.kubernetes.io/ibm-load-balancer-cloud-provider-ip-type: private 注释,而不是 public

请关注以下注意事项:

  • 如果经典集群仅连接到专用 VLAN,或者如果 VPC 集群仅启用了专用云服务端点,那么在应用 IOP 时,缺省情况下会创建专用负载均衡器。
  • 仅对于经典集群,无法使用 ibmcloud ks nlb-dns create classic 为定制网关负载均衡器的 IP 地址创建 DNS 记录和 IBM提供的子域。

控制定制网关更新和版本

手动更新和控制定制入口网关的受管 Istio 版本。

IBM Cloud 通过自动将补丁更新推送到 支持的Istio最新版本,使您的所有Istio组件保持最新状态。IBM Cloud Kubernetes Service 例如,当补丁版本 1.23.5 发布时,所有入口网关容器都会自动更新到此最新补丁版本。 补丁版本通过使用滚动更新策略来完成,以避免应用程序的停机时间。 但是,您可能希望阻止自动更新定制网关 pod,例如,如果要测试使用最新补丁版本的任何潜在回归。

要管理定制入口网关的更新,您可以使用以下转出策略:

  1. 创建定制入口网关 IOP。 在 tag 字段中,指定与控制平面版本相同或更低的补丁版本。 您可以通过运行 istioctl version 来查找控制平面版本。
  2. 当针对受管 Istio 附加组件发布新的 补丁版本 时,请编辑一个定制网关的 IOP YAML 文件以使用最新的补丁版本,然后在集群中重新应用该 IOP。
  3. 将定制网关的 pod 更新为最新补丁后,请测试对定制网关的任何更改。
  4. 当您对更改感到满意时,请修改其余定制网关的配置以将其更新为最新补丁。

请勿将标记设置为高于 Istio 附加组件的控制平面版本的版本。

在发布版本后尽快更新定制网关 pod。 运行较早版本的定制网关可能会暴露在安全漏洞中。

其他网关定制

可以使用其他定制来配置定制入口网关,包括将网关负载均衡器部署到特定区域,指定最小网关 pod 副本数,将定制网关 pod 调度到 边缘节点,添加 preStop 生命周期挂钩以实现正常关闭,以及指定反亲缘关系和工作程序节点亲缘关系。

在以下 IOP YAML 文件中查看这些附加定制的示例。

apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
metadata:
  namespace: ibm-operators
  name: custom-ingressgateway-iop
spec:
  profile: empty
  hub: icr.io/ext/istio
  # tag: 1.23.5 # Force the gateway to a specific managed Istio version
  components:
    ingressGateways:
      - name: custom-ingressgateway
        label:
          istio: custom-ingressgateway
        namespace: custom-gateways
        enabled: true
        k8s:
          serviceAnnotations:
            service.kubernetes.io/ibm-load-balancer-cloud-provider-ip-type: public
            service.kubernetes.io/ibm-load-balancer-cloud-provider-zone: "dal12" # Deploy the load balancer to a specific zone in your cluster
          hpaSpec: # Specify the minimum number of pod replicas
            minReplicas: 2
          tolerations: # Schedule the custom gateway pods onto edge nodes
          - key: dedicated
            value: edge
          env:
          - name: TERMINATION_DRAIN_DURATION
            value: 30s
          affinity:
            podAntiAffinity:
              preferredDuringSchedulingIgnoredDuringExecution:
              - podAffinityTerm:
                  labelSelector:
                    matchExpressions:
                    - key: app
                      operator: In
                      values:
                      - istio-ingressgateway
                  topologyKey: kubernetes.io/hostname
                weight: 100
            nodeAffinity: # Example node affinities to control the zone or the edge
              preferredDuringSchedulingIgnoredDuringExecution: # Could be requiredDuringSchedulingIgnoredDuringExecution instead
                nodeSelectorTerms:
                - matchExpressions:
                  - key: ibm-cloud.kubernetes.io/zone
                    operator: In
                    values:
                    - "dal12" # Deploy the load balancer to a specific zone in your cluster
              preferredDuringSchedulingIgnoredDuringExecution:
              - preference:
                  matchExpressions:
                  - key: dedicated
                    operator: In
                    values:
                    - edge
                weight: 100

创建定制出口网关

在受管 Istio 附加组件的 V 1.8 和更高版本中,可以创建定制出口网关。 出口网关充当从服务网格中的应用程序到外部目标的所有出站流量的出口点。

例如,要创建定制出口网关,可以对集群中的 IOP 应用以下 YAML 文件。

apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
metadata:
  namespace: ibm-operators
  name: custom-egressgateway-iop
spec:
  profile: empty
  hub: icr.io/ext/istio
  # tag: 1.23.5 # Force the Gateway to a specific version
  components:
    egressGateways:
      - name: custom-egressgateway
        label:
          istio: custom-egressgateway
        namespace: custom-gateways
        enabled: true

有关配置和使用定制出口网关的更多信息,请参阅 Istio 开放式源代码文档

禁用缺省网关

如果在创建定制网关后不需要缺省 istio-ingressgatewayistio-egressgateway 部署,那么可以选择将其禁用。

如果您希望应用程序可供客户机访问,请确保至少启用并配置一个网关负载均衡器以将流量路由到应用程序。 如果在所有专区中禁用缺省网关负载均衡器,那么应用程序将不再公开并且无法在外部访问。

  1. 编辑 managed-istio-custom ConfigMap 资源。

    kubectl edit cm managed-istio-custom -n ibm-operators
    
  2. 通过将 istio-ingressgateway-public-1|2|3-enabled 字段设置为 "false" 来禁用缺省入口网关。

    istio-ingressgateway-public-1-enabled: "false"
    istio-ingressgateway-public-2-enabled: "false"
    istio-ingressgateway-public-3-enabled: "false"
    
  3. 要禁用缺省出口网关,请添加 istio-egressgateway-public-1-enabled: "false" 字段。

    istio-egressgateway-public-1-enabled: "false"
    
  4. 保存并关闭配置文件。

  5. 确认默认网关服务已被删除。

    kubectl get svc -n istio-system