12.4.3 istio-remote组件

在另一集群cluster2中部署istio-remote组件,按照以下步骤执行:

1)首先获取集群cluster1的入口网关地址,如下所示:


export LOCAL_GW_ADDR=$(kubectl get svc --selector=app=istio-ingressgateway \
  -n istio-system -o jsonpath="{.items[0].status.loadBalancer.ingress[0].ip}")

通过执行以下命令,使用Helm创建Istio remote部署YAML文件:


helm template --name istio-remote --namespace=istio-system \
--values install/kubernetes/helm/istio/values-istio-remote.yaml \
--set global.mtls.enabled=true \
--set gateways.enabled=true \
--set security.selfSigned=false \
--set global.controlPlaneSecurityEnabled=true \
--set global.createRemoteSvcEndpoints=true \
--set global.remotePilotCreateSvcEndpoint=true \
--set global.remotePilotAddress=${LOCAL_GW_ADDR} \
--set global.remotePolicyAddress=${LOCAL_GW_ADDR} \
--set global.remoteTelemetryAddress=${LOCAL_GW_ADDR} \
--set gateways.istio-ingressgateway.env.ISTIO_META_NETWORK="network2" \
--set global.network="network2" \
install/kubernetes/helm/istio > istio-remote-auth.yaml

2)将Istio remote组件部署到cluster2,如下所示:


kubectl apply -f ./istio-remote-auth.yaml

确保上述步骤在Kubernetes集群中执行成功。

3)更新集群cluster1的配置项istio,获取集群cluster2的入口网关地址,如下所示:


export REMOTE_GW_ADDR=$(kubectl get --context=$CTX_REMOTE svc --selector=app=
istio-ingressgateway -n istio-system -o jsonpath="{.items[0].status.loadBalancer.ingress
[0].ip}")

在集群cluster1中编辑命名空间istio-system下的配置项istio,替换network2的网关地址,从0.0.0.0变成集群cluster2的入口网关地址${REMOTE_GW_ADDR}。保存后,Pilot将自动读取更新的网络配置。

4)创建集群cluster2的Kubeconf ig。通过以下命令,在集群cluster2上创建服务账号istio-multi的Kubeconf ig,并保存为文件n2-k8s-conf ig:


CLUSTER_NAME="cluster2"
SERVER=$(kubectl config view --minify=true -o "jsonpath={.clusters[].cluster.server}")
SECRET_NAME=$(kubectl get sa istio-multi -n istio-system -o jsonpath='{.secrets[].name}')
CA_DATA=$(kubectl get secret ${SECRET_NAME} -n istio-system -o "jsonpath={.data['ca\.crt']}")
TOKEN=$(kubectl get secret ${SECRET_NAME} -n istio-system -o "jsonpath={.data['token']}" | base64 --decode)
cat <<EOF > n2-k8s-config
apiVersion: v1
kind: Config
clusters:
  - cluster:
      certificate-authority-data: ${CA_DATA}
      server: ${SERVER}
    name: ${CLUSTER_NAME}
contexts:
  - context:
      cluster: ${CLUSTER_NAME}
      user: ${CLUSTER_NAME}
    name: ${CLUSTER_NAME}
current-context: ${CLUSTER_NAME}
users:
  - name: ${CLUSTER_NAME}
    user:
      token: ${TOKEN}
EOF

5)将集群cluster2加入到Istio控制平面。在集群clusterl执行以下命令,将上述生成的集群cluster2的kubeconf ig添加到集群cluster1的secret中,执行这些命令后,集群cluster1中的Istio Pilot将开始监听集群cluster2的服务和实例,就像监听集群cluster1中的服务与实例一样:


kubectl create secret generic n2-k8s-secret --from-file n2-k8s-config -n istio-system
kubectl label secret n2-k8s-secret istio/multiCluster=true -n istio-system