使用外部控制平面安装 Istio

本指南将引导您完成安装外部控制平面,然后将一个或多个远程集群连接到它。外部控制平面部署模型允许网格运营商在外部集群上安装和管理控制平面,与构成网格的数据平面集群(或多个集群)分开。此部署模型允许在网格运营商和网格管理员之间进行清晰的分离。网格运营商安装和管理 Istio 控制平面,而网格管理员只需要配置网格。

External control plane cluster and remote cluster
外部控制平面集群和远程集群

在远程集群中运行的 Envoy 代理(边车和网关)通过入口网关访问外部 istiod,入口网关公开了发现、CA、注入和验证所需的端点。

虽然外部控制平面的配置和管理由外部集群中的网格运营商完成,但连接到外部控制平面的第一个远程集群充当网格本身的配置集群。网格管理员将使用配置集群来配置网格资源(网关、虚拟服务等)以及网格服务本身。外部控制平面将从 Kubernetes API 服务器远程访问此配置,如上图所示。

准备工作

集群

本指南要求您拥有两个 Kubernetes 集群,并使用以下任何受支持的 Kubernetes 版本: 1.28、1.29、1.30、1.31。

第一个集群将托管在 external-istiod 命名空间中安装的外部控制平面。入口网关也安装在 istio-system 命名空间中,以提供对外部控制平面的跨集群访问。

第二个集群是远程集群,它将运行网格应用程序工作负载。其 Kubernetes API 服务器还提供外部控制平面 (istiod) 用于配置工作负载代理的网格配置。

API 服务器访问

远程集群中的 Kubernetes API 服务器必须可供外部控制平面集群访问。许多云提供商通过网络负载均衡器 (NLB) 使 API 服务器公开访问。如果 API 服务器无法直接访问,则需要修改安装过程以启用访问。例如,在多集群配置中使用的东西向网关也可用于启用对 API 服务器的访问。

环境变量

以下环境变量将在整个过程中使用,以简化说明

变量描述
CTX_EXTERNAL_CLUSTER用于访问外部控制平面集群的默认Kubernetes 配置文件中的上下文名称。
CTX_REMOTE_CLUSTER用于访问远程集群的默认Kubernetes 配置文件中的上下文名称。
REMOTE_CLUSTER_NAME远程集群的名称。
EXTERNAL_ISTIOD_ADDR外部控制平面集群上入口网关的主机名。远程集群使用此主机名访问外部控制平面。
SSL_SECRET_NAME保存外部控制平面集群上入口网关的 TLS 证书的密钥的名称。

现在设置 CTX_EXTERNAL_CLUSTERCTX_REMOTE_CLUSTERREMOTE_CLUSTER_NAME。稍后您将设置其他变量。

$ export CTX_EXTERNAL_CLUSTER=<your external cluster context>
$ export CTX_REMOTE_CLUSTER=<your remote cluster context>
$ export REMOTE_CLUSTER_NAME=<your remote cluster name>

集群配置

Mesh 运营商步骤

网格运营商负责在外部集群上安装和管理外部 Istio 控制平面。这包括在外部集群上配置入口网关,该网关允许远程集群访问控制平面,并在远程集群上安装边车注入 Webhook 配置,以便它将使用外部控制平面。

在外部集群中设置网关

  1. 为入口网关创建 Istio 安装配置,该网关将外部控制平面端口公开给其他集群

    $ cat <<EOF > controlplane-gateway.yaml
    apiVersion: install.istio.io/v1alpha1
    kind: IstioOperator
    metadata:
      namespace: istio-system
    spec:
      components:
        ingressGateways:
          - name: istio-ingressgateway
            enabled: true
            k8s:
              service:
                ports:
                  - port: 15021
                    targetPort: 15021
                    name: status-port
                  - port: 15012
                    targetPort: 15012
                    name: tls-xds
                  - port: 15017
                    targetPort: 15017
                    name: tls-webhook
    EOF
    

    然后,在外部集群的 istio-system 命名空间中安装网关

    $ istioctl install -f controlplane-gateway.yaml --context="${CTX_EXTERNAL_CLUSTER}"
    
  2. 运行以下命令以确认入口网关已启动并正在运行

    $ kubectl get po -n istio-system --context="${CTX_EXTERNAL_CLUSTER}"
    NAME                                   READY   STATUS    RESTARTS   AGE
    istio-ingressgateway-9d4c7f5c7-7qpzz   1/1     Running   0          29s
    istiod-68488cd797-mq8dn                1/1     Running   0          38s
    

    您会注意到在 istio-system 命名空间中也创建了一个 istiod 部署。它用于配置入口网关,而不是远程集群使用的控制平面。

  3. 配置您的环境以使用具有 TLS 的公共主机名公开 Istio 入口网关服务。

    EXTERNAL_ISTIOD_ADDR 环境变量设置为主机名,并将 SSL_SECRET_NAME 环境变量设置为保存 TLS 证书的密钥。

    $ export EXTERNAL_ISTIOD_ADDR=<your external istiod host>
    $ export SSL_SECRET_NAME=<your external istiod secret>
    

    这些说明假设您正在使用具有正确签名的 DNS 证书的主机名公开外部集群的网关,因为这是生产环境中的推荐方法。有关公开安全网关的更多信息,请参阅安全入口任务

    您的环境变量应如下所示

    $ echo "$EXTERNAL_ISTIOD_ADDR" "$SSL_SECRET_NAME"
    myhost.example.com myhost-example-credential
    

设置远程配置集群

  1. 使用 remote 配置文件配置远程集群的 Istio 安装。这将安装一个注入 Webhook,该 Webhook 使用外部控制平面的注入器,而不是本地部署的注入器。因为此集群也将用作配置集群,所以通过将 global.configClusterpilot.configMap 设置为 true,还会安装远程集群上需要的 Istio CRD 和其他资源

    $ cat <<EOF > remote-config-cluster.yaml
    apiVersion: install.istio.io/v1alpha1
    kind: IstioOperator
    metadata:
      namespace: external-istiod
    spec:
      profile: remote
      values:
        global:
          istioNamespace: external-istiod
          configCluster: true
        pilot:
          configMap: true
        istiodRemote:
          injectionURL: https://${EXTERNAL_ISTIOD_ADDR}:15017/inject/cluster/${REMOTE_CLUSTER_NAME}/net/network1
        base:
          validationURL: https://${EXTERNAL_ISTIOD_ADDR}:15017/validate
    EOF
    
  2. 如果您使用的是 EXTERNAL_ISTIOD_ADDR 的 IP 地址,而不是正确的 DNS 主机名,请修改配置以指定发现地址和路径,而不是 URL

    $ sed  -i'.bk' \
      -e "s|injectionURL: https://${EXTERNAL_ISTIOD_ADDR}:15017|injectionPath: |" \
      -e "/istioNamespace:/a\\
          remotePilotAddress: ${EXTERNAL_ISTIOD_ADDR}" \
      -e '/base:/,+1d' \
      remote-config-cluster.yaml; rm remote-config-cluster.yaml.bk
    
  3. 在远程集群上安装配置

    $ kubectl create namespace external-istiod --context="${CTX_REMOTE_CLUSTER}"
    $ istioctl install -f remote-config-cluster.yaml --set values.defaultRevision=default --context="${CTX_REMOTE_CLUSTER}"
    
  4. 确认远程集群的注入 Webhook 配置已安装

    $ kubectl get mutatingwebhookconfiguration --context="${CTX_REMOTE_CLUSTER}"
    NAME                                         WEBHOOKS   AGE
    istio-revision-tag-default-external-istiod   4          2m2s
    istio-sidecar-injector-external-istiod       4          2m5s
    
  5. 确认远程集群的验证 Webhook 配置已安装

    $ kubectl get validatingwebhookconfiguration --context="${CTX_REMOTE_CLUSTER}"
    NAME                              WEBHOOKS   AGE
    istio-validator-external-istiod   1          6m53s
    istiod-default-validator          1          6m53s
    

在外部集群中设置控制平面

  1. 创建 external-istiod 命名空间,该命名空间将用于托管外部控制平面

    $ kubectl create namespace external-istiod --context="${CTX_EXTERNAL_CLUSTER}"
    
  2. 外部集群中的控制平面需要访问远程集群以发现服务、端点和 Pod 属性。创建包含访问远程集群 kube-apiserver 的凭据的密钥,并在外部集群中安装它

    $ kubectl create sa istiod-service-account -n external-istiod --context="${CTX_EXTERNAL_CLUSTER}"
    $ istioctl create-remote-secret \
      --context="${CTX_REMOTE_CLUSTER}" \
      --type=config \
      --namespace=external-istiod \
      --service-account=istiod \
      --create-service-account=false | \
      kubectl apply -f - --context="${CTX_EXTERNAL_CLUSTER}"
    
  3. 创建 Istio 配置以在外部集群的 external-istiod 命名空间中安装控制平面。请注意,istiod 配置为使用本地安装的 istio configmap,并且 SHARED_MESH_CONFIG 环境变量设置为 istio。这指示 istiod 将网格管理员在配置集群的 configmap 中设置的值与网格运营商在此处设置的本地 configmap 中的值合并,如果存在任何冲突,则本地 configmap 中的值将优先

    $ cat <<EOF > external-istiod.yaml
    apiVersion: install.istio.io/v1alpha1
    kind: IstioOperator
    metadata:
      namespace: external-istiod
    spec:
      profile: empty
      meshConfig:
        rootNamespace: external-istiod
        defaultConfig:
          discoveryAddress: $EXTERNAL_ISTIOD_ADDR:15012
          proxyMetadata:
            XDS_ROOT_CA: /etc/ssl/certs/ca-certificates.crt
            CA_ROOT_CA: /etc/ssl/certs/ca-certificates.crt
      components:
        pilot:
          enabled: true
          k8s:
            overlays:
            - kind: Deployment
              name: istiod
              patches:
              - path: spec.template.spec.volumes[100]
                value: |-
                  name: config-volume
                  configMap:
                    name: istio
              - path: spec.template.spec.volumes[100]
                value: |-
                  name: inject-volume
                  configMap:
                    name: istio-sidecar-injector
              - path: spec.template.spec.containers[0].volumeMounts[100]
                value: |-
                  name: config-volume
                  mountPath: /etc/istio/config
              - path: spec.template.spec.containers[0].volumeMounts[100]
                value: |-
                  name: inject-volume
                  mountPath: /var/lib/istio/inject
            env:
            - name: INJECTION_WEBHOOK_CONFIG_NAME
              value: ""
            - name: VALIDATION_WEBHOOK_CONFIG_NAME
              value: ""
            - name: EXTERNAL_ISTIOD
              value: "true"
            - name: LOCAL_CLUSTER_SECRET_WATCHER
              value: "true"
            - name: CLUSTER_ID
              value: ${REMOTE_CLUSTER_NAME}
            - name: SHARED_MESH_CONFIG
              value: istio
      values:
        global:
          externalIstiod: true
          caAddress: $EXTERNAL_ISTIOD_ADDR:15012
          istioNamespace: external-istiod
          operatorManageWebhooks: true
          configValidation: false
          meshID: mesh1
          multiCluster:
            clusterName: ${REMOTE_CLUSTER_NAME}
          network: network1
    EOF
    
  4. 如果您使用的是 EXTERNAL_ISTIOD_ADDR 的 IP 地址,而不是正确的 DNS 主机名,请删除代理元数据并更新配置中的 Webhook 配置环境变量

    $ sed  -i'.bk' \
      -e '/proxyMetadata:/,+2d' \
      -e '/INJECTION_WEBHOOK_CONFIG_NAME/{n;s/value: ""/value: istio-sidecar-injector-external-istiod/;}' \
      -e '/VALIDATION_WEBHOOK_CONFIG_NAME/{n;s/value: ""/value: istio-validator-external-istiod/;}' \
      external-istiod.yaml ; rm external-istiod.yaml.bk
    
  5. 在外部集群上应用 Istio 配置

    $ istioctl install -f external-istiod.yaml --context="${CTX_EXTERNAL_CLUSTER}"
    
  6. 确认外部 istiod 已成功部署

    $ kubectl get po -n external-istiod --context="${CTX_EXTERNAL_CLUSTER}"
    NAME                      READY   STATUS    RESTARTS   AGE
    istiod-779bd6fdcf-bd6rg   1/1     Running   0          70s
    
  7. 创建 Istio GatewayVirtualServiceDestinationRule 配置,以将流量从入口网关路由到外部控制平面

    $ cat <<EOF > external-istiod-gw.yaml
    apiVersion: networking.istio.io/v1
    kind: Gateway
    metadata:
      name: external-istiod-gw
      namespace: external-istiod
    spec:
      selector:
        istio: ingressgateway
      servers:
        - port:
            number: 15012
            protocol: https
            name: https-XDS
          tls:
            mode: SIMPLE
            credentialName: $SSL_SECRET_NAME
          hosts:
          - $EXTERNAL_ISTIOD_ADDR
        - port:
            number: 15017
            protocol: https
            name: https-WEBHOOK
          tls:
            mode: SIMPLE
            credentialName: $SSL_SECRET_NAME
          hosts:
          - $EXTERNAL_ISTIOD_ADDR
    ---
    apiVersion: networking.istio.io/v1
    kind: VirtualService
    metadata:
       name: external-istiod-vs
       namespace: external-istiod
    spec:
        hosts:
        - $EXTERNAL_ISTIOD_ADDR
        gateways:
        - external-istiod-gw
        http:
        - match:
          - port: 15012
          route:
          - destination:
              host: istiod.external-istiod.svc.cluster.local
              port:
                number: 15012
        - match:
          - port: 15017
          route:
          - destination:
              host: istiod.external-istiod.svc.cluster.local
              port:
                number: 443
    ---
    apiVersion: networking.istio.io/v1
    kind: DestinationRule
    metadata:
      name: external-istiod-dr
      namespace: external-istiod
    spec:
      host: istiod.external-istiod.svc.cluster.local
      trafficPolicy:
        portLevelSettings:
        - port:
            number: 15012
          tls:
            mode: SIMPLE
          connectionPool:
            http:
              h2UpgradePolicy: UPGRADE
        - port:
            number: 443
          tls:
            mode: SIMPLE
    EOF
    
  8. 如果您使用的是 IP 地址作为 EXTERNAL_ISTIOD_ADDR,而不是正确的 DNS 主机名,请修改配置。删除 DestinationRule,不要在 Gateway 中终止 TLS,并在 VirtualService 中使用 TLS 路由。

    $ sed  -i'.bk' \
      -e '55,$d' \
      -e 's/mode: SIMPLE/mode: PASSTHROUGH/' -e '/credentialName:/d' -e "s/${EXTERNAL_ISTIOD_ADDR}/\"*\"/" \
      -e 's/http:/tls:/' -e 's/https/tls/' -e '/route:/i\
            sniHosts:\
            - "*"' \
      external-istiod-gw.yaml; rm external-istiod-gw.yaml.bk
    
  9. 在外部集群上应用配置

    $ kubectl apply -f external-istiod-gw.yaml --context="${CTX_EXTERNAL_CLUSTER}"
    

Mesh 管理员步骤

现在 Istio 已经启动并运行,网格管理员只需要在网格中部署和配置服务,包括根据需要配置网关。

部署示例应用程序

  1. 在远程集群上创建并标记用于注入的 sample 命名空间

    $ kubectl create --context="${CTX_REMOTE_CLUSTER}" namespace sample
    $ kubectl label --context="${CTX_REMOTE_CLUSTER}" namespace sample istio-injection=enabled
    
  2. 部署 helloworld (v1) 和 curl 示例

    ZipZipZip
    $ kubectl apply -f @samples/helloworld/helloworld.yaml@ -l service=helloworld -n sample --context="${CTX_REMOTE_CLUSTER}"
    $ kubectl apply -f @samples/helloworld/helloworld.yaml@ -l version=v1 -n sample --context="${CTX_REMOTE_CLUSTER}"
    $ kubectl apply -f @samples/curl/curl.yaml@ -n sample --context="${CTX_REMOTE_CLUSTER}"
    
  3. 等待几秒钟,直到 helloworldcurl Pod 运行并注入 sidecar

    $ kubectl get pod -n sample --context="${CTX_REMOTE_CLUSTER}"
    NAME                             READY   STATUS    RESTARTS   AGE
    curl-64d7d56698-wqjnm            2/2     Running   0          9s
    helloworld-v1-776f57d5f6-s7zfc   2/2     Running   0          10s
    
  4. curl Pod 向 helloworld 服务发送请求

    $ kubectl exec --context="${CTX_REMOTE_CLUSTER}" -n sample -c curl \
        "$(kubectl get pod --context="${CTX_REMOTE_CLUSTER}" -n sample -l app=curl -o jsonpath='{.items[0].metadata.name}')" \
        -- curl -sS helloworld.sample:5000/hello
    Hello version: v1, instance: helloworld-v1-776f57d5f6-s7zfc
    

启用网关

在远程集群上启用入口网关

$ cat <<EOF > istio-ingressgateway.yaml
apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
metadata:
  name: ingress-install
spec:
  profile: empty
  components:
    ingressGateways:
    - namespace: external-istiod
      name: istio-ingressgateway
      enabled: true
  values:
    gateways:
      istio-ingressgateway:
        injectionTemplate: gateway
EOF
$ istioctl install -f istio-ingressgateway.yaml --set values.global.istioNamespace=external-istiod --context="${CTX_REMOTE_CLUSTER}"

您也可以选择启用其他网关。例如,出口网关

$ cat <<EOF > istio-egressgateway.yaml
apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
metadata:
  name: egress-install
spec:
  profile: empty
  components:
    egressGateways:
    - namespace: external-istiod
      name: istio-egressgateway
      enabled: true
  values:
    gateways:
      istio-egressgateway:
        injectionTemplate: gateway
EOF
$ istioctl install -f istio-egressgateway.yaml --set values.global.istioNamespace=external-istiod --context="${CTX_REMOTE_CLUSTER}"

配置和测试入口网关

  1. 确保集群已准备好配置网关

确认 Istio 入口网关正在运行

$ kubectl get pod -l app=istio-ingressgateway -n external-istiod --context="${CTX_REMOTE_CLUSTER}"
NAME                                    READY   STATUS    RESTARTS   AGE
istio-ingressgateway-7bcd5c6bbd-kmtl4   1/1     Running   0          8m4s
  1. 在入口网关上公开 helloworld 应用程序
Zip
$ kubectl apply -f @samples/helloworld/helloworld-gateway.yaml@ -n sample --context="${CTX_REMOTE_CLUSTER}"
  1. 设置 GATEWAY_URL 环境变量(有关详细信息,请参阅 确定入口 IP 和端口
$ export INGRESS_HOST=$(kubectl -n external-istiod --context="${CTX_REMOTE_CLUSTER}" get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
$ export INGRESS_PORT=$(kubectl -n external-istiod --context="${CTX_REMOTE_CLUSTER}" get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].port}')
$ export GATEWAY_URL=$INGRESS_HOST:$INGRESS_PORT
  1. 确认您可以通过入口网关访问 helloworld 应用程序

    $ curl -s "http://${GATEWAY_URL}/hello"
    Hello version: v1, instance: helloworld-v1-776f57d5f6-s7zfc
    

将集群添加到网格(可选)

本节介绍如何通过添加另一个远程集群来扩展现有的外部控制平面网格到多集群。这使您可以轻松地分发服务并使用 位置感知路由和故障转移 来支持应用程序的高可用性。

External control plane with multiple remote clusters
具有多个远程集群的外部控制平面

与第一个远程集群不同,添加到同一外部控制平面的第二个及后续集群不提供网格配置,而是仅作为端点配置的来源,就像 主-远程 Istio 多集群配置中的远程集群一样。

要继续,您需要另一个 Kubernetes 集群作为网格的第二个远程集群。将以下环境变量设置为集群的上下文名称和集群名称

$ export CTX_SECOND_CLUSTER=<your second remote cluster context>
$ export SECOND_CLUSTER_NAME=<your second remote cluster name>

注册新集群

  1. 创建远程 Istio 安装配置,该配置安装使用外部控制平面的注入器(而不是本地部署的注入器)的注入 Webhook

    $ cat <<EOF > second-remote-cluster.yaml
    apiVersion: install.istio.io/v1alpha1
    kind: IstioOperator
    metadata:
      namespace: external-istiod
    spec:
      profile: remote
      values:
        global:
          istioNamespace: external-istiod
        istiodRemote:
          injectionURL: https://${EXTERNAL_ISTIOD_ADDR}:15017/inject/cluster/${SECOND_CLUSTER_NAME}/net/network2
    EOF
    
  2. 如果您使用的是 IP 地址作为 EXTERNAL_ISTIOD_ADDR,而不是正确的 DNS 主机名,请修改配置以指定发现地址和路径,而不是注入 URL。

    $ sed  -i'.bk' \
      -e "s|injectionURL: https://${EXTERNAL_ISTIOD_ADDR}:15017|injectionPath: |" \
      -e "/istioNamespace:/a\\
          remotePilotAddress: ${EXTERNAL_ISTIOD_ADDR}" \
      second-remote-cluster.yaml; rm second-remote-cluster.yaml.bk
    
  3. 在远程集群上创建并添加系统命名空间的注释

    $ kubectl create namespace external-istiod --context="${CTX_SECOND_CLUSTER}"
    $ kubectl annotate namespace external-istiod "topology.istio.io/controlPlaneClusters=${REMOTE_CLUSTER_NAME}" --context="${CTX_SECOND_CLUSTER}"
    

    topology.istio.io/controlPlaneClusters 注释指定应管理此远程集群的外部控制平面的集群 ID。请注意,这是第一个远程(配置)集群的名称,在外部集群中安装外部控制平面时,它用于设置外部控制平面的集群 ID。

  4. 在远程集群上安装配置

    $ istioctl install -f second-remote-cluster.yaml --context="${CTX_SECOND_CLUSTER}"
    
  5. 确认远程集群的注入 Webhook 配置已安装

    $ kubectl get mutatingwebhookconfiguration --context="${CTX_SECOND_CLUSTER}"
    NAME                                     WEBHOOKS   AGE
    istio-sidecar-injector-external-istiod   4          4m13s
    
  6. 创建包含凭据的密钥,以允许控制平面访问第二个远程集群上的端点,并安装它

    $ istioctl create-remote-secret \
      --context="${CTX_SECOND_CLUSTER}" \
      --name="${SECOND_CLUSTER_NAME}" \
      --type=remote \
      --namespace=external-istiod \
      --create-service-account=false | \
      kubectl apply -f - --context="${CTX_EXTERNAL_CLUSTER}"
    

    请注意,与网格的第一个远程集群(也用作配置集群)不同,这次 --type 参数设置为 remote,而不是 config

设置东西向网关

  1. 在两个远程集群上部署东西向网关

    Zip
    $ @samples/multicluster/gen-eastwest-gateway.sh@ \
        --network network1 > eastwest-gateway-1.yaml
    $ istioctl manifest generate -f eastwest-gateway-1.yaml \
        --set values.global.istioNamespace=external-istiod | \
        kubectl apply --context="${CTX_REMOTE_CLUSTER}" -f -
    
    Zip
    $ @samples/multicluster/gen-eastwest-gateway.sh@ \
        --network network2 > eastwest-gateway-2.yaml
    $ istioctl manifest generate -f eastwest-gateway-2.yaml \
        --set values.global.istioNamespace=external-istiod | \
        kubectl apply --context="${CTX_SECOND_CLUSTER}" -f -
    
  2. 等待东西向网关分配外部 IP 地址

    $ kubectl --context="${CTX_REMOTE_CLUSTER}" get svc istio-eastwestgateway -n external-istiod
    NAME                    TYPE           CLUSTER-IP    EXTERNAL-IP    PORT(S)   AGE
    istio-eastwestgateway   LoadBalancer   10.0.12.121   34.122.91.98   ...       51s
    
    $ kubectl --context="${CTX_SECOND_CLUSTER}" get svc istio-eastwestgateway -n external-istiod
    NAME                    TYPE           CLUSTER-IP    EXTERNAL-IP    PORT(S)   AGE
    istio-eastwestgateway   LoadBalancer   10.0.12.121   34.122.91.99   ...       51s
    
  3. 通过东西向网关公开服务

    Zip
    $ kubectl --context="${CTX_REMOTE_CLUSTER}" apply -n external-istiod -f \
        @samples/multicluster/expose-services.yaml@
    

验证安装

  1. 在远程集群上创建并标记用于注入的 sample 命名空间

    $ kubectl create --context="${CTX_SECOND_CLUSTER}" namespace sample
    $ kubectl label --context="${CTX_SECOND_CLUSTER}" namespace sample istio-injection=enabled
    
  2. 部署 helloworld (v2) 和 curl 示例

    ZipZipZip
    $ kubectl apply -f @samples/helloworld/helloworld.yaml@ -l service=helloworld -n sample --context="${CTX_SECOND_CLUSTER}"
    $ kubectl apply -f @samples/helloworld/helloworld.yaml@ -l version=v2 -n sample --context="${CTX_SECOND_CLUSTER}"
    $ kubectl apply -f @samples/curl/curl.yaml@ -n sample --context="${CTX_SECOND_CLUSTER}"
    
  3. 等待几秒钟,直到 helloworldcurl Pod 运行并注入 sidecar

    $ kubectl get pod -n sample --context="${CTX_SECOND_CLUSTER}"
    NAME                            READY   STATUS    RESTARTS   AGE
    curl-557747455f-wtdbr           2/2     Running   0          9s
    helloworld-v2-54df5f84b-9hxgw   2/2     Running   0          10s
    
  4. curl Pod 向 helloworld 服务发送请求

    $ kubectl exec --context="${CTX_SECOND_CLUSTER}" -n sample -c curl \
        "$(kubectl get pod --context="${CTX_SECOND_CLUSTER}" -n sample -l app=curl -o jsonpath='{.items[0].metadata.name}')" \
        -- curl -sS helloworld.sample:5000/hello
    Hello version: v2, instance: helloworld-v2-54df5f84b-9hxgw
    
  5. 确认当通过入口网关多次访问 helloworld 应用程序时,现在正在调用 v1v2 两个版本

    $ for i in {1..10}; do curl -s "http://${GATEWAY_URL}/hello"; done
    Hello version: v1, instance: helloworld-v1-776f57d5f6-s7zfc
    Hello version: v2, instance: helloworld-v2-54df5f84b-9hxgw
    Hello version: v1, instance: helloworld-v1-776f57d5f6-s7zfc
    Hello version: v2, instance: helloworld-v2-54df5f84b-9hxgw
    ...
    

清理

清理外部控制平面集群

$ kubectl delete -f external-istiod-gw.yaml --context="${CTX_EXTERNAL_CLUSTER}"
$ istioctl uninstall -y --purge -f external-istiod.yaml --context="${CTX_EXTERNAL_CLUSTER}"
$ kubectl delete ns istio-system external-istiod --context="${CTX_EXTERNAL_CLUSTER}"
$ rm controlplane-gateway.yaml external-istiod.yaml external-istiod-gw.yaml

清理远程配置集群

$ kubectl delete ns sample --context="${CTX_REMOTE_CLUSTER}"
$ istioctl uninstall -y --purge -f remote-config-cluster.yaml --set values.defaultRevision=default --context="${CTX_REMOTE_CLUSTER}"
$ kubectl delete ns external-istiod --context="${CTX_REMOTE_CLUSTER}"
$ rm remote-config-cluster.yaml istio-ingressgateway.yaml
$ rm istio-egressgateway.yaml eastwest-gateway-1.yaml || true

如果您安装了可选的第二个远程集群,请清理它

$ kubectl delete ns sample --context="${CTX_SECOND_CLUSTER}"
$ istioctl uninstall -y --purge -f second-remote-cluster.yaml --context="${CTX_SECOND_CLUSTER}"
$ kubectl delete ns external-istiod --context="${CTX_SECOND_CLUSTER}"
$ rm second-remote-cluster.yaml eastwest-gateway-2.yaml
这些信息是否有用?
您是否有任何改进建议?

感谢您的反馈!