第 7 章 外部 control plane 拓扑


使用外部 control plane 拓扑将 control plane 与独立集群上的数据平面隔离。

7.1. 关于外部 control plane 拓扑

外部 control plane 拓扑提高了安全性,并允许 Service Mesh 作为一个服务托管。在这个安装配置中,一个集群主机并管理 Istio control plane,应用程序托管在其他集群中。

在 control plane 集群和单独的数据平面集群中安装 Istio。这个安装方法提供了更高的安全性。

注意

您可以为跨越多个数据平面集群的网格调整这些说明。您还可以为在同一 control plane 集群中使用多个 control plane 的多个网格调整这些指令。

先决条件

  • 您已在 control plane 集群和 data plane 集群上安装了 OpenShift Service Mesh Operator。
  • 您已在笔记本电脑上安装了 istioctl,您将使用它们运行这些说明。

步骤

  1. 运行以下命令,创建一个 ISTIO_VERSION 环境变量来定义要在所有集群中安装的 Istio 版本:

    $ export ISTIO_VERSION=1.24.3
    Copy to Clipboard Toggle word wrap
  2. 运行以下命令,创建一个 REMOTE_CLUSTER_NAME 环境变量来定义集群名称:

    $ export REMOTE_CLUSTER_NAME=cluster1
    Copy to Clipboard Toggle word wrap
  3. 运行以下命令,设置包含 control plane 集群的 oc 命令上下文的环境变量:

    $ export CTX_CONTROL_PLANE_CLUSTER=<context_name_of_the_control_plane_cluster>
    Copy to Clipboard Toggle word wrap
  4. 运行以下命令,设置包含 data plane 集群的 oc 命令上下文的环境变量:

    $ export CTX_DATA_PLANE_CLUSTER=<context_name_of_the_data_plane_cluster>
    Copy to Clipboard Toggle word wrap
  5. 为 control plane 设置入口网关:

    1. 运行以下命令,创建一个名为 istio-system 的项目:

      $ oc get project istio-system --context "${CTX_CONTROL_PLANE_CLUSTER}" || oc new-project istio-system --context "${CTX_CONTROL_PLANE_CLUSTER}"
      Copy to Clipboard Toggle word wrap
    2. 运行以下命令,在 control plane 集群上创建一个 Istio 资源来管理入口网关:

      $ cat <<EOF | oc --context "${CTX_CONTROL_PLANE_CLUSTER}" apply -f -
      apiVersion: sailoperator.io/v1
      kind: Istio
      metadata:
        name: default
      spec:
        version: v${ISTIO_VERSION}
        namespace: istio-system
        value:
          global:
            network: network1
      EOF
      Copy to Clipboard Toggle word wrap
    3. 运行以下命令,为 control plane 创建入口网关:

      $ oc --context "${CTX_CONTROL_PLANE_CLUSTER}" apply -f https://raw.githubusercontent.com/istio-ecosystem/sail-operator/main/docs/deployment-models/resources/controlplane-gateway.yaml
      Copy to Clipboard Toggle word wrap
    4. 运行以下命令,获取入口网关的分配的 IP 地址:

      $ oc --context "${CTX_CONTROL_PLANE_CLUSTER}" get svc istio-ingressgateway -n istio-system -o jsonpath='{.status.loadBalancer.ingress[0].ip}'
      Copy to Clipboard Toggle word wrap
    5. 运行以下命令,将入口网关的 IP 地址存储在环境变量中:

      $ export EXTERNAL_ISTIOD_ADDR=$(oc -n istio-system --context="${CTX_CONTROL_PLANE_CLUSTER}" get svc istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
      Copy to Clipboard Toggle word wrap
  6. 在 data plane 集群上安装 Istio:

    1. 运行以下命令,在 data plane 集群上创建一个名为 external-istiod 的项目:

      $ oc get project external-istiod --context "${CTX_DATA_PLANE_CLUSTER}" || oc new-project external-istiod --context "${CTX_DATA_PLANE_CLUSTER}"
      Copy to Clipboard Toggle word wrap
    2. 运行以下命令,在 data plane 集群上创建 Istio 资源:

      $ cat <<EOF | oc --context "${CTX_DATA_PLANE_CLUSTER}" apply -f -
      apiVersion: sailoperator.io/v1
      kind: Istio
      metadata:
        name: external-istiod
      spec:
        version: v${ISTIO_VERSION}
        namespace: external-istiod
        profile: remote
        values:
          defaultRevision: external-istiod
          global:
            remotePilotAddress: ${EXTERNAL_ISTIOD_ADDR}
            configCluster: true 
      1
      
          pilot:
            configMap: true
            istiodRemote:
              injectionPath: /inject/cluster/cluster2/net/network1
      EOF
      Copy to Clipboard Toggle word wrap
      1
      此设置将 data plane 集群识别为网格配置的来源。
  7. 运行以下命令,在 data plane 集群上创建一个名为 istio-cni 的项目:

    $ oc get project istio-cni --context "${CTX_DATA_PLANE_CLUSTER}" || oc new-project istio-cni --context "${CTX_DATA_PLANE_CLUSTER}"
    Copy to Clipboard Toggle word wrap
    1. 运行以下命令,在 data plane 集群上创建一个 IstioCNI 资源:

      $ cat <<EOF | oc --context "${CTX_DATA_PLANE_CLUSTER}" apply -f -
      apiVersion: sailoperator.io/v1
      kind: IstioCNI
      metadata:
        name: default
      spec:
        version: v${ISTIO_VERSION}
        namespace: istio-cni
      EOF
      Copy to Clipboard Toggle word wrap
  8. 在 control plane 集群上设置外部 Istio control plane:

    1. 运行以下命令,在 control plane 集群上创建一个名为 external-istiod 的项目:

      $ oc get project external-istiod --context "${CTX_CONTROL_PLANE_CLUSTER}" || oc new-project external-istiod --context "${CTX_CONTROL_PLANE_CLUSTER}"
      Copy to Clipboard Toggle word wrap
    2. 运行以下命令,在 control plane 集群上创建一个 ServiceAccount 资源:

      $ oc --context="${CTX_CONTROL_PLANE_CLUSTER}" create serviceaccount istiod-service-account -n external-istiod
      Copy to Clipboard Toggle word wrap
    3. 运行以下命令,将 data plane 集群的 API 服务器地址存储在环境变量中:

      $ DATA_PLANE_API_SERVER=https://<hostname_or_IP_address_of_the_API_server_for_the_data_plane_cluster>:6443
      Copy to Clipboard Toggle word wrap
    4. 运行以下命令,在 control plane 集群上安装远程 secret,以便访问 data plane 集群上的 API 服务器:

      $ istioctl create-remote-secret \
        --context="${CTX_DATA_PLANE_CLUSTER}" \
        --type=config \
        --namespace=external-istiod \
        --service-account=istiod-external-istiod \
        --create-service-account=false \
        --server="${DATA_PLANE_API_SERVER}" | \
        oc --context="${CTX_CONTROL_PLANE_CLUSTER}" apply -f -
      Copy to Clipboard Toggle word wrap
    5. 运行以下命令,在 control plane 集群上创建 Istio 资源:

      $ cat <<EOF | oc --context "${CTX_CONTROL_PLANE_CLUSTER}" apply -f -
      apiVersion: sailoperator.io/v1
      kind: Istio
      metadata:
        name: external-istiod
      spec:
        version: v${ISTIO_VERSION}
        namespace: external-istiod
        profile: empty
        values:
          meshConfig:
            rootNamespace: external-istiod
            defaultConfig:
              discoveryAddress: $EXTERNAL_ISTIOD_ADDR:15012
          pilot:
            enabled: true
            volumes:
              - name: config-volume
                configMap:
                  name: istio-external-istiod
              - name: inject-volume
                configMap:
                  name: istio-sidecar-injector-external-istiod
            volumeMounts:
              - name: config-volume
                mountPath: /etc/istio/config
              - name: inject-volume
                mountPath: /var/lib/istio/inject
            env:
              INJECTION_WEBHOOK_CONFIG_NAME: "istio-sidecar-injector-external-istiod-external-istiod"
              VALIDATION_WEBHOOK_CONFIG_NAME: "istio-validator-external-istiod-external-istiod"
              EXTERNAL_ISTIOD: "true"
              LOCAL_CLUSTER_SECRET_WATCHER: "true"
              CLUSTER_ID: cluster2
              SHARED_MESH_CONFIG: istio
          global:
            caAddress: $EXTERNAL_ISTIOD_ADDR:15012
            configValidation: false
            meshID: mesh1
            multiCluster:
              clusterName: cluster2
            network: network1
      EOF
      Copy to Clipboard Toggle word wrap
    6. 创建 GatewayVirtualService 资源,以便 data plane 集群上的 sidecar 代理可以通过运行以下命令来访问 control plane:

      $ oc --context "${CTX_CONTROL_PLANE_CLUSTER}" apply -f - <<EOF
      apiVersion: networking.istio.io/v1
      kind: Gateway
      metadata:
        name: external-istiod-gw
        namespace: external-istiod
      spec:
        selector:
          istio: ingressgateway
        servers:
          - port:
              number: 15012
              protocol: tls
              name: tls-XDS
            tls:
              mode: PASSTHROUGH
            hosts:
            - "*"
          - port:
              number: 15017
              protocol: tls
              name: tls-WEBHOOK
            tls:
              mode: PASSTHROUGH
            hosts:
            - "*"
      ---
      apiVersion: networking.istio.io/v1
      kind: VirtualService
      metadata:
        name: external-istiod-vs
        namespace: external-istiod
      spec:
          hosts:
          - "*"
          gateways:
          - external-istiod-gw
          tls:
          - match:
            - port: 15012
              sniHosts:
              - "*"
            route:
            - destination:
                host: istiod-external-istiod.external-istiod.svc.cluster.local
                port:
                  number: 15012
          - match:
            - port: 15017
              sniHosts:
              - "*"
            route:
            - destination:
                host: istiod-external-istiod.external-istiod.svc.cluster.local
                port:
                  number: 443
      EOF
      Copy to Clipboard Toggle word wrap
    7. 运行以下命令,等待 control plane 集群中的 external-istiod Istio 资源返回 "Ready" 状态条件:

      $ oc --context "${CTX_CONTROL_PLANE_CLUSTER}" wait --for condition=Ready istio/external-istiod --timeout=3m
      Copy to Clipboard Toggle word wrap
    8. 运行以下命令,等待 data plane 集群上的 Istio 资源返回 "Ready" 状态条件:

      $ oc --context "${CTX_DATA_PLANE_CLUSTER}" wait --for condition=Ready istio/external-istiod --timeout=3m
      Copy to Clipboard Toggle word wrap
    9. 运行以下命令,等待 data plane 集群上的 IstioCNI 资源返回 "Ready" 状态条件:

      $ oc --context "${CTX_DATA_PLANE_CLUSTER}" wait --for condition=Ready istiocni/default --timeout=3m
      Copy to Clipboard Toggle word wrap

验证

  1. 在 data plane 集群上部署示例应用程序:

    1. 运行以下命令,为 data plane 集群上的示例应用程序创建一个命名空间:

      $ oc --context "${CTX_DATA_PLANE_CLUSTER}" get project sample || oc --context="${CTX_DATA_PLANE_CLUSTER}" new-project sample
      Copy to Clipboard Toggle word wrap
    2. 运行以下命令,为示例应用程序标记命名空间以支持 sidecar 注入:

      $ oc --context="${CTX_DATA_PLANE_CLUSTER}" label namespace sample istio.io/rev=external-istiod
      Copy to Clipboard Toggle word wrap
    3. 部署 helloworld 应用程序:

      1. 运行以下命令来创建 helloworld 服务:

        $ oc --context="${CTX_DATA_PLANE_CLUSTER}" apply \
          -f https://raw.githubusercontent.com/istio/istio/${ISTIO_VERSION}/samples/helloworld/helloworld.yaml \
          -l service=helloworld -n sample
        Copy to Clipboard Toggle word wrap
      2. 运行以下命令来创建 helloworld-v1 部署:

        $ oc --context="${CTX_DATA_PLANE_CLUSTER}" apply \
          -f https://raw.githubusercontent.com/istio/istio/${ISTIO_VERSION}/samples/helloworld/helloworld.yaml \
          -l version=v1 -n sample
        Copy to Clipboard Toggle word wrap
    4. 运行以下命令来部署 sleep 应用程序:

      $ oc --context="${CTX_DATA_PLANE_CLUSTER}" apply \
        -f https://raw.githubusercontent.com/istio/istio/${ISTIO_VERSION}/samples/sleep/sleep.yaml -n sample
      Copy to Clipboard Toggle word wrap
    5. 运行以下命令,验证 示例 命名空间中的 pod 是否已注入 sidecar:

      $ oc --context="${CTX_DATA_PLANE_CLUSTER}" get pods -n sample
      Copy to Clipboard Toggle word wrap

      运行以下命令,终端应该在 示例 命名空间中为每个 pod 返回 2/2

      输出示例

      NAME                             READY   STATUS    RESTARTS   AGE
      helloworld-v1-6d65866976-jb6qc   2/2     Running   0          1m
      sleep-5fcd8fd6c8-mg8n2           2/2     Running   0          1m
      Copy to Clipboard Toggle word wrap

  2. 验证内部流量是否可以访问集群中的应用程序:

    1. 运行以下命令,通过 sleep 应用程序验证请求是否可发送到 helloworld 应用程序:

      $ oc exec --context="${CTX_DATA_PLANE_CLUSTER}" -n sample -c sleep deploy/sleep -- curl -sS helloworld.sample:5000/hello
      Copy to Clipboard Toggle word wrap

      终端应该从 helloworld 应用程序返回响应:

      输出示例

      Hello version: v1, instance: helloworld-v1-6d65866976-jb6qc
      Copy to Clipboard Toggle word wrap

  3. 安装入口网关,将示例应用程序公开给外部客户端:

    1. 运行以下命令来创建入口网关:

      $ oc --context="${CTX_DATA_PLANE_CLUSTER}" apply
      -f https://raw.githubusercontent.com/istio-ecosystem/sail-operator/refs/heads/main/chart/samples/ingress-gateway.yaml -n sample
      Copy to Clipboard Toggle word wrap
    2. 运行以下命令确认入口网关正在运行:

      $ oc get pod -l app=istio-ingressgateway -n sample --context="${CTX_DATA_PLANE_CLUSTER}"
      Copy to Clipboard Toggle word wrap

      终端应该返回输出,确认网关正在运行:

      输出示例

      NAME                                    READY   STATUS    RESTARTS   AGE
      istio-ingressgateway-7bcd5c6bbd-kmtl4   1/1     Running   0          8m4s
      Copy to Clipboard Toggle word wrap

    3. 运行以下命令,通过入口网关公开 helloworld 应用程序:

      $ oc apply -f https://raw.githubusercontent.com/istio/istio/refs/heads/master/samples/helloworld/helloworld-gateway.yaml -n sample --context="${CTX_DATA_PLANE_CLUSTER}"
      Copy to Clipboard Toggle word wrap
    4. 运行以下命令来设置网关 URL 环境变量:

      $ export INGRESS_HOST=$(oc -n sample --context="${CTX_DATA_PLANE_CLUSTER}" get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip}'); \
        export INGRESS_PORT=$(oc -n sample --context="${CTX_DATA_PLANE_CLUSTER}" get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].port}'); \
        export GATEWAY_URL=$INGRESS_HOST:$INGRESS_PORT
      Copy to Clipboard Toggle word wrap
  4. 验证外部流量是否可以访问网格中的应用程序:

    1. 运行以下命令确认 helloworld 应用程序可以通过网关访问:

      $ curl -s "http://${GATEWAY_URL}/hello"
      Copy to Clipboard Toggle word wrap

      helloworld 应用应返回响应。

      输出示例

      Hello version: v1, instance: helloworld-v1-6d65866976-jb6qc
      Copy to Clipboard Toggle word wrap

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat