使用外部控制平面安装 Istio
本指南将引导您完成安装外部控制平面,然后将一个或多个 从集群连接到该平面的过程。
外部控制平面部署模型允许网格操作员在与组成网格的数据平面集群(或多个集群)分开的外部集群上安装和管理控制平面。 这种部署模型可以将网状网络运营商和网状网络管理员明确区分。 网格操作员可以安装和管理 Istio 控制平面,而网格管理员只需配置网格即可。
在从集群中运行的 Envoy 代理(Sidecar 和 Gateway)通过 Ingress Gateway 访问外部 Istiod,向外暴露了需要被发现,CA,注入和验证的端点。
虽然外部控制平面的配置和管理是由外部集群中的网格操作员完成的,但连接到外部控制平面的第一个从集群充当了网格本身的配置集群。除了网状服务本身之外,网格管理员还将使用配置集群来配置网状资源(Gateway、虚拟服务等)。外部控制平面将从 Kubernetes API Server 远程访问此配置,如上图所示。
准备开始
集群
本指南要求您有任意两个受支持版本的 Kubernetes 集群:1.24, 1.25, 1.26, 1.27。
第一个集群将托管安装在 external-istiod
命名空间中的外部控制平面。
Ingress Gateway 也安装在 istio-system
命名空间中,以提供对外部控制平面的跨集群访问。
第二个集群是将运行网格应用程序工作负载的从集群。 它的 Kubernetes API Server 还提供了外部控制平面(Istiod)用来配置工作负载代理的网状配置。
API Server 访问
外部控制平面集群必须可以访问从集群中的 Kubernetes API Server。 许多云提供商通过网络负载平衡器(NLB)公开访问 API Server。 如果无法直接访问 API Server,则需要修改安装过程以启用访问权限。 例如,在多集群配置中使用的东西向 Gateway 也可以用于启用对 API Server 的访问。
环境变量
以下环境变量将始终用于简化说明:
变量名称 | 描述 |
---|---|
CTX_EXTERNAL_CLUSTER | 默认 Kubernetes 配置文件 中的上下文名称,用于访问外部控制平面集群。 |
CTX_REMOTE_CLUSTER | 默认 Kubernetes 配置文件 中的上下文名称,用于访问从集群。 |
REMOTE_CLUSTER_NAME | 从集群的名称。 |
EXTERNAL_ISTIOD_ADDR | 外部控制平面集群上的 Ingress Gateway 的主机名。 从集群使用它来访问外部控制平面。 |
SSL_SECRET_NAME | 拥有外部控制平面集群上 Ingress Gateway 的 TLS 证书的密钥名称。 |
立即设置 CTX_EXTERNAL_CLUSTER
、CTX_REMOTE_CLUSTER
和 REMOTE_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>
集群配置
网格操作步骤
网格操作员负责在外部集群上安装和管理外部 Istio 控制平面。 这包括在外部集群上配置 Ingress Gateway,允许从集群访问控制平面,并在从集群上安装所需的 Webhook、ConfigMap 和 Secret,以便使用外部控制平面。
在外部集群中搭建 Gateway
为 Ingress Gateway 创建 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
然后,将 Gateway 安装在外部集群的
istio-system
命名空间中:$ istioctl install -f controlplane-gateway.yaml --context="${CTX_EXTERNAL_CLUSTER}"
运行以下命令来确认 Ingress Gateway 已启动并正在运行:
$ 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 Deployment。这用于配置 Ingress Gateway,而不是从集群使用的控制平面。使用带有 TLS 的公共主机名配置您的环境来暴露 Istio Ingress Gateway 服务。 将
EXTERNAL_ISTIOD_ADDR
环境变量设置为主机名,将SSL_SECRET_NAME
环境变量设置为包含 TLS 证书的密钥:$ export EXTERNAL_ISTIOD_ADDR=<your external istiod host> $ export SSL_SECRET_NAME=<your external istiod secret>
这些说明假定您使用具有正确签名的 DNS 证书的主机名公开外部集群的 Gateway,因为这是生产环境中推荐的方法。 参阅安全的 Ingress 任务,了解暴露安全 Gateway 的更多信息。
您的环境变量应如下所示:
$ echo "$EXTERNAL_ISTIOD_ADDR" "$SSL_SECRET_NAME" myhost.example.com myhost-example-credential
设置从集群
使用
remote
配置文件配置从集群上安装的 Istio。这将安装一个使用外部控制平面注入器的注入 Webhook,而不是本地部署的注入器。 因为这个集群也将作为配置集群,所以安装从集群上所需的 Istio CRD 和其他资源时将global.configCluster
和pilot.configMap
设置为true
:$ 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
如果您使用的是
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
在从集群上安装配置:
$ kubectl create namespace external-istiod --context="${CTX_REMOTE_CLUSTER}" $ istioctl manifest generate -f remote-config-cluster.yaml --set values.defaultRevision=default | kubectl apply --context="${CTX_REMOTE_CLUSTER}" -f -
确认从集群的注入 Webhook 配置已经安装:
$ kubectl get mutatingwebhookconfiguration --context="${CTX_REMOTE_CLUSTER}" NAME WEBHOOKS AGE istio-sidecar-injector-external-istiod 4 6m24s
确认已安装从集群的验证 Webhook 配置:
$ kubectl get validatingwebhookconfiguration --context="${CTX_REMOTE_CLUSTER}" NAME WEBHOOKS AGE istio-validator-external-istiod 1 6m53s istiod-default-validator 1 6m53s
在外部集群中安装控制平面
创建
external-istiod
命名空间,该命名空间将用于托管外部控制平面:$ kubectl create namespace external-istiod --context="${CTX_EXTERNAL_CLUSTER}"
外部集群中的控制平面需要访问从集群以发现服务、端点和 Pod 属性。创建具有凭据的 Secret,以访问从集群的
kube-apiserver
并将其安装在外部集群中:$ kubectl create sa istiod-service-account -n external-istiod --context="${CTX_EXTERNAL_CLUSTER}" $ istioctl x 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}"
创建 Istio 配置以在外部集群的
external-istiod
命名空间中安装控制平面。 请注意,istiod 配置为使用本地安装的istio
configmap,并且SHARED_MESH_CONFIG
环境变量设置为istio
。 这指示 istiod 将网格管理员在配置集群的 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: caAddress: $EXTERNAL_ISTIOD_ADDR:15012 istioNamespace: external-istiod operatorManageWebhooks: true configValidation: false meshID: mesh1 EOF
如果您使用的是
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
在外部集群上应用 Istio 配置:
$ istioctl install -f external-istiod.yaml --context="${CTX_EXTERNAL_CLUSTER}"
确认外部 Istiod 已成功部署:
$ kubectl get po -n external-istiod --context="${CTX_EXTERNAL_CLUSTER}" NAME READY STATUS RESTARTS AGE istiod-779bd6fdcf-bd6rg 1/1 Running 0 70s
创建 Istio
Gateway
、VirtualService
和DestinationRule
配置,将流量从 Ingress Gateway 路由到外部控制平面:$ cat <<EOF > external-istiod-gw.yaml apiVersion: networking.istio.io/v1beta1 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/v1beta1 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/v1alpha3 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
如果您为
EXTERNAL_ISTIOD_ADDR
使用 IP 地址,而不是合适的 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
在外部集群上应用配置:
$ kubectl apply -f external-istiod-gw.yaml --context="${CTX_EXTERNAL_CLUSTER}"
网格管理步骤
现在 Istio 已启动并运行,网格管理员只需在网格中部署和配置服务,包括 Gateway(如果需要)。
部署一个简单应用
在从集群上创建
sample
命名空间并启用标签注入:$ kubectl create --context="${CTX_REMOTE_CLUSTER}" namespace sample $ kubectl label --context="${CTX_REMOTE_CLUSTER}" namespace sample istio-injection=enabled
部署示例
helloworld
(v1
)和sleep
:$ 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/sleep/sleep.yaml@ -n sample --context="${CTX_REMOTE_CLUSTER}"
等几秒钟,Pod
helloworld
和sleep
将以 Sidecar 注入的方式运行:$ kubectl get pod -n sample --context="${CTX_REMOTE_CLUSTER}" NAME READY STATUS RESTARTS AGE helloworld-v1-5b75657f75-ncpc5 2/2 Running 0 10s sleep-64d7d56698-wqjnm 2/2 Running 0 9s
从 Pod
sleep
向 Podhelloworld
服务发送请求:$ kubectl exec --context="${CTX_REMOTE_CLUSTER}" -n sample -c sleep \ "$(kubectl get pod --context="${CTX_REMOTE_CLUSTER}" -n sample -l app=sleep -o jsonpath='{.items[0].metadata.name}')" \ -- curl -sS helloworld.sample:5000/hello Hello version: v1, instance: helloworld-v1-776f57d5f6-s7zfc
启用 Gateway
在从集群上启用 Ingress Gateway:
$ cat <<EOF > istio-ingressgateway.yaml
apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
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}"
$ helm install istio-ingressgateway istio/gateway -n external-istiod --kube-context="${CTX_REMOTE_CLUSTER}"
有关 Gateway 安装的详细文档,请参阅安装 Gateway。
在从集群上启用 Egress Gateway 或者其他 Gateway(可选):
$ cat <<EOF > istio-egressgateway.yaml
apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
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}"
$ helm install istio-egressgateway istio/gateway -n external-istiod --kube-context="${CTX_REMOTE_CLUSTER}" --set service.type=ClusterIP
有关 Gateway 安装的详细文档,请参阅安装 Gateway。
配置和测试 Ingress Gateway
- 确保集群已准备好配置 Gateway:
确认 Istio Ingress Gateway 正在运行:
$ 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
大多数 Kubernetes 集群默认不会安装 Kubernetes Gateway API CRD,因此请确保在使用 Gateway API 之前安装了它们:
$ kubectl get crd gateways.gateway.networking.k8s.io --context="${CTX_REMOTE_CLUSTER}" || \
{ kubectl kustomize "github.com/kubernetes-sigs/gateway-api/config/crd?ref=v0.6.2" | kubectl apply -f - --context="${CTX_REMOTE_CLUSTER}"; }
- 在 Ingress Gateway 上暴露
helloworld
应用:
$ kubectl apply -f @samples/helloworld/helloworld-gateway.yaml@ -n sample --context="${CTX_REMOTE_CLUSTER}"
$ kubectl apply -f @samples/helloworld/gateway-api/helloworld-gateway.yaml@ -n sample --context="${CTX_REMOTE_CLUSTER}"
- 设置
GATEWAY_URL
环境变量(有关详细信息,请参阅确定 Ingress 的 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
$ kubectl -n sample --context="${CTX_REMOTE_CLUSTER}" wait --for=condition=programmed gtw helloworld-gateway
$ export INGRESS_HOST=$(kubectl -n sample --context="${CTX_REMOTE_CLUSTER}" get gtw helloworld-gateway -o jsonpath='{.status.addresses[0].value}')
$ export GATEWAY_URL=$INGRESS_HOST:80
确认您可以通过 Ingress Gateway 访问
helloworld
应用:$ curl -s "http://${GATEWAY_URL}/hello" Hello version: v1, instance: helloworld-v1-776f57d5f6-s7zfc
将集群添加到网格(可选)
本节介绍如何通过添加另一个从集群将现有的外部控制平面网格扩展到多集群。 这使您可以轻松分发服务并使用位置感知路由和故障转移,以支持应用程序的高可用性。
与第一个从集群不同,添加到同一外部控制平面的第二个以及后续集群不提供网格配置,而仅提供端点配置的来源,就像主从 Istio 多集群配置中的从集群一样。
要继续的话,您需要另一个 Kubernetes 集群作为网格的第二个从集群。将以下环境变量设置为集群的上下文名称和集群名称:
$ export CTX_SECOND_CLUSTER=<your second remote cluster context>
$ export SECOND_CLUSTER_NAME=<your second remote cluster name>
注册新集
创建远程 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
如果您使用的是
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}" \ second-remote-cluster.yaml; rm second-remote-cluster.yaml.bk
在从集群上创建系统命名空间并添加注解:
$ 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。 注意这是第一个远程 (config) 集群的名称,之前在外部集群安装时用于设置外部控制平面的集群 ID。在从集群上安装配置:
$ istioctl manifest generate -f second-remote-cluster.yaml | kubectl apply --context="${CTX_SECOND_CLUSTER}" -f -
确认从集群的注入 Webhook 配置已经安装:
$ kubectl get mutatingwebhookconfiguration --context="${CTX_SECOND_CLUSTER}" NAME WEBHOOKS AGE istio-sidecar-injector-external-istiod 4 4m13s
使用凭据创建一个 Secret,以允许控制平面访问第二个从集群上的端点并安装它:
$ istioctl x 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}"
请注意,与网格的第一个从集群不同,它也用作 config 集群,此时
--type
参数设置为remote
,而不是config
。
设置东西向 Gateway
在两个从集群上部署东西向 Gateway:
$ @samples/multicluster/gen-eastwest-gateway.sh@ \ --mesh mesh1 --cluster "${REMOTE_CLUSTER_NAME}" --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 -
$ @samples/multicluster/gen-eastwest-gateway.sh@ \ --mesh mesh1 --cluster "${SECOND_CLUSTER_NAME}" --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 -
等待东西向 Gateway 分配外部 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
通过东西向 Gateway 公开服务:
$ kubectl --context="${CTX_REMOTE_CLUSTER}" apply -n external-istiod -f \ @samples/multicluster/expose-services.yaml@
验证安装
在从集群上创建
sample
命名空间并启用标签注入:$ kubectl create --context="${CTX_SECOND_CLUSTER}" namespace sample $ kubectl label --context="${CTX_SECOND_CLUSTER}" namespace sample istio-injection=enabled
部署
helloworld
(v2
版本) 和sleep
的样本:$ 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/sleep/sleep.yaml@ -n sample --context="${CTX_SECOND_CLUSTER}"
等待几秒钟,让
helloworld
和 Podsleep
在注入 Sidecar 的情况下运行:$ kubectl get pod -n sample --context="${CTX_SECOND_CLUSTER}" NAME READY STATUS RESTARTS AGE helloworld-v2-54df5f84b-9hxgw 2/2 Running 0 10s sleep-557747455f-wtdbr 2/2 Running 0 9s
从 Pod
sleep
向helloworld
服务发送请求:$ kubectl exec --context="${CTX_SECOND_CLUSTER}" -n sample -c sleep \ "$(kubectl get pod --context="${CTX_SECOND_CLUSTER}" -n sample -l app=sleep -o jsonpath='{.items[0].metadata.name}')" \ -- curl -sS helloworld.sample:5000/hello Hello version: v2, instance: helloworld-v2-54df5f84b-9hxgw
确认通过 Ingress Gateway 多次访问
helloworld
应用时,现在调用的是版本v1
和v2
:$ 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 --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 manifest generate -f remote-config-cluster.yaml --set values.defaultRevision=default | kubectl delete --context="${CTX_REMOTE_CLUSTER}" -f -
$ 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 manifest generate -f second-remote-cluster.yaml | kubectl delete --context="${CTX_SECOND_CLUSTER}" -f -
$ kubectl delete ns external-istiod --context="${CTX_SECOND_CLUSTER}"
$ rm second-remote-cluster.yaml eastwest-gateway-2.yaml