第 7 章 外部 control plane 拓扑
使用外部 control plane 拓扑将 control plane 与独立集群上的数据平面隔离。
7.1. 关于外部 control plane 拓扑 复制链接链接已复制到粘贴板!
外部 control plane 拓扑提高了安全性,并允许 Service Mesh 作为一个服务托管。在这个安装配置中,一个集群主机并管理 Istio control plane,应用程序托管在其他集群中。
7.1.1. 在单独的集群中安装 control plane 和数据平面 复制链接链接已复制到粘贴板!
在 control plane 集群和单独的数据平面集群中安装 Istio。这个安装方法提供了更高的安全性。
您可以为跨越多个数据平面集群的网格调整这些说明。您还可以为在同一 control plane 集群中使用多个 control plane 的多个网格调整这些指令。
先决条件
- 您已在 control plane 集群和 data plane 集群上安装了 OpenShift Service Mesh Operator。
-
您已在笔记本电脑上安装了
istioctl
,您将使用它们运行这些说明。
步骤
运行以下命令,创建一个
ISTIO_VERSION
环境变量来定义要在所有集群中安装的 Istio 版本:export ISTIO_VERSION=1.24.3
$ export ISTIO_VERSION=1.24.3
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令,创建一个
REMOTE_CLUSTER_NAME
环境变量来定义集群名称:export REMOTE_CLUSTER_NAME=cluster1
$ export REMOTE_CLUSTER_NAME=cluster1
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令,设置包含 control plane 集群的
oc
命令上下文的环境变量:export CTX_CONTROL_PLANE_CLUSTER=<context_name_of_the_control_plane_cluster>
$ export CTX_CONTROL_PLANE_CLUSTER=<context_name_of_the_control_plane_cluster>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令,设置包含 data plane 集群的
oc
命令上下文的环境变量:export CTX_DATA_PLANE_CLUSTER=<context_name_of_the_data_plane_cluster>
$ export CTX_DATA_PLANE_CLUSTER=<context_name_of_the_data_plane_cluster>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 为 control plane 设置入口网关:
运行以下命令,创建一个名为
istio-system
的项目:oc get project istio-system --context "${CTX_CONTROL_PLANE_CLUSTER}" || oc new-project istio-system --context "${CTX_CONTROL_PLANE_CLUSTER}"
$ oc get project istio-system --context "${CTX_CONTROL_PLANE_CLUSTER}" || oc new-project istio-system --context "${CTX_CONTROL_PLANE_CLUSTER}"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令,在 control plane 集群上创建一个
Istio
资源来管理入口网关:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令,为 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
$ 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 Copied! Toggle word wrap Toggle overflow 运行以下命令,获取入口网关的分配的 IP 地址:
oc --context "${CTX_CONTROL_PLANE_CLUSTER}" get svc istio-ingressgateway -n istio-system -o jsonpath='{.status.loadBalancer.ingress[0].ip}'
$ oc --context "${CTX_CONTROL_PLANE_CLUSTER}" get svc istio-ingressgateway -n istio-system -o jsonpath='{.status.loadBalancer.ingress[0].ip}'
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令,将入口网关的 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}')
$ 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 Copied! Toggle word wrap Toggle overflow
在 data plane 集群上安装 Istio:
运行以下命令,在 data plane 集群上创建一个名为
external-istiod
的项目:oc get project external-istiod --context "${CTX_DATA_PLANE_CLUSTER}" || oc new-project external-istiod --context "${CTX_DATA_PLANE_CLUSTER}"
$ oc get project external-istiod --context "${CTX_DATA_PLANE_CLUSTER}" || oc new-project external-istiod --context "${CTX_DATA_PLANE_CLUSTER}"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令,在 data plane 集群上创建
Istio
资源:Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 此设置将 data plane 集群识别为网格配置的来源。
运行以下命令,在 data plane 集群上创建一个名为
istio-cni
的项目:oc get project istio-cni --context "${CTX_DATA_PLANE_CLUSTER}" || oc new-project istio-cni --context "${CTX_DATA_PLANE_CLUSTER}"
$ oc get project istio-cni --context "${CTX_DATA_PLANE_CLUSTER}" || oc new-project istio-cni --context "${CTX_DATA_PLANE_CLUSTER}"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令,在 data plane 集群上创建一个
IstioCNI
资源:Copy to Clipboard Copied! Toggle word wrap Toggle overflow
在 control plane 集群上设置外部 Istio control plane:
运行以下命令,在 control plane 集群上创建一个名为
external-istiod
的项目:oc get project external-istiod --context "${CTX_CONTROL_PLANE_CLUSTER}" || oc new-project external-istiod --context "${CTX_CONTROL_PLANE_CLUSTER}"
$ oc get project external-istiod --context "${CTX_CONTROL_PLANE_CLUSTER}" || oc new-project external-istiod --context "${CTX_CONTROL_PLANE_CLUSTER}"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令,在 control plane 集群上创建一个
ServiceAccount
资源:oc --context="${CTX_CONTROL_PLANE_CLUSTER}" create serviceaccount istiod-service-account -n external-istiod
$ oc --context="${CTX_CONTROL_PLANE_CLUSTER}" create serviceaccount istiod-service-account -n external-istiod
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令,将 data plane 集群的 API 服务器地址存储在环境变量中:
DATA_PLANE_API_SERVER=https://<hostname_or_IP_address_of_the_API_server_for_the_data_plane_cluster>:6443
$ DATA_PLANE_API_SERVER=https://<hostname_or_IP_address_of_the_API_server_for_the_data_plane_cluster>:6443
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令,在 control plane 集群上安装远程 secret,以便访问 data plane 集群上的 API 服务器:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令,在 control plane 集群上创建
Istio
资源:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 创建
Gateway
和VirtualService
资源,以便 data plane 集群上的 sidecar 代理可以通过运行以下命令来访问 control plane:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令,等待 control plane 集群中的
external-istiod
Istio
资源返回 "Ready" 状态条件:oc --context "${CTX_CONTROL_PLANE_CLUSTER}" wait --for condition=Ready istio/external-istiod --timeout=3m
$ oc --context "${CTX_CONTROL_PLANE_CLUSTER}" wait --for condition=Ready istio/external-istiod --timeout=3m
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令,等待 data plane 集群上的
Istio
资源返回 "Ready" 状态条件:oc --context "${CTX_DATA_PLANE_CLUSTER}" wait --for condition=Ready istio/external-istiod --timeout=3m
$ oc --context "${CTX_DATA_PLANE_CLUSTER}" wait --for condition=Ready istio/external-istiod --timeout=3m
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令,等待 data plane 集群上的
IstioCNI
资源返回 "Ready" 状态条件:oc --context "${CTX_DATA_PLANE_CLUSTER}" wait --for condition=Ready istiocni/default --timeout=3m
$ oc --context "${CTX_DATA_PLANE_CLUSTER}" wait --for condition=Ready istiocni/default --timeout=3m
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
在 data plane 集群上部署示例应用程序:
运行以下命令,为 data plane 集群上的示例应用程序创建一个命名空间:
oc --context "${CTX_DATA_PLANE_CLUSTER}" get project sample || oc --context="${CTX_DATA_PLANE_CLUSTER}" new-project sample
$ oc --context "${CTX_DATA_PLANE_CLUSTER}" get project sample || oc --context="${CTX_DATA_PLANE_CLUSTER}" new-project sample
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令,为示例应用程序标记命名空间以支持 sidecar 注入:
oc --context="${CTX_DATA_PLANE_CLUSTER}" label namespace sample istio.io/rev=external-istiod
$ oc --context="${CTX_DATA_PLANE_CLUSTER}" label namespace sample istio.io/rev=external-istiod
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 部署
helloworld
应用程序:运行以下命令来创建
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
$ 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 Copied! Toggle word wrap Toggle overflow 运行以下命令来创建
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
$ 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 Copied! Toggle word wrap Toggle overflow
运行以下命令来部署
sleep
应用程序:oc --context="${CTX_DATA_PLANE_CLUSTER}" apply \ -f https://raw.githubusercontent.com/istio/istio/${ISTIO_VERSION}/samples/sleep/sleep.yaml -n sample
$ 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 Copied! Toggle word wrap Toggle overflow 运行以下命令,验证
示例
命名空间中的 pod 是否已注入 sidecar:oc --context="${CTX_DATA_PLANE_CLUSTER}" get pods -n sample
$ oc --context="${CTX_DATA_PLANE_CLUSTER}" get pods -n sample
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令,终端应该在
示例
命名空间中为每个 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
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 Copied! Toggle word wrap Toggle overflow
验证内部流量是否可以访问集群中的应用程序:
运行以下命令,通过
sleep
应用程序验证请求是否可发送到helloworld
应用程序:oc exec --context="${CTX_DATA_PLANE_CLUSTER}" -n sample -c sleep deploy/sleep -- curl -sS helloworld.sample:5000/hello
$ oc exec --context="${CTX_DATA_PLANE_CLUSTER}" -n sample -c sleep deploy/sleep -- curl -sS helloworld.sample:5000/hello
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 终端应该从
helloworld
应用程序返回响应:输出示例
Hello version: v1, instance: helloworld-v1-6d65866976-jb6qc
Hello version: v1, instance: helloworld-v1-6d65866976-jb6qc
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
安装入口网关,将示例应用程序公开给外部客户端:
运行以下命令来创建入口网关:
oc --context="${CTX_DATA_PLANE_CLUSTER}" apply
$ 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 Copied! Toggle word wrap Toggle overflow 运行以下命令确认入口网关正在运行:
oc get pod -l app=istio-ingressgateway -n sample --context="${CTX_DATA_PLANE_CLUSTER}"
$ oc get pod -l app=istio-ingressgateway -n sample --context="${CTX_DATA_PLANE_CLUSTER}"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 终端应该返回输出,确认网关正在运行:
输出示例
NAME READY STATUS RESTARTS AGE istio-ingressgateway-7bcd5c6bbd-kmtl4 1/1 Running 0 8m4s
NAME READY STATUS RESTARTS AGE istio-ingressgateway-7bcd5c6bbd-kmtl4 1/1 Running 0 8m4s
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令,通过入口网关公开
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}"
$ 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 Copied! Toggle word wrap Toggle overflow 运行以下命令来设置网关 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
$ 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 Copied! Toggle word wrap Toggle overflow
验证外部流量是否可以访问网格中的应用程序:
运行以下命令确认
helloworld
应用程序可以通过网关访问:curl -s "http://${GATEWAY_URL}/hello"
$ curl -s "http://${GATEWAY_URL}/hello"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow helloworld
应用应返回响应。输出示例
Hello version: v1, instance: helloworld-v1-6d65866976-jb6qc
Hello version: v1, instance: helloworld-v1-6d65866976-jb6qc
Copy to Clipboard Copied! Toggle word wrap Toggle overflow