12.3.5 安装istio-remote

在本地集群中安装完控制平面之后,必须将istio-remote组件部署到每个远程Kubernetes集群。等待Istio控制平面完成初始化,然后再执行本节中的步骤。你必须在Istio控制平面集群上运行这些操作以捕获Istio控制平面服务端点,例如上述提到的Istio服务istio-pilot、istio-telemetry、istio-policy以及zipkin。

在远程集群cluster2中部署Istio-remote组件,按照以下步骤执行:

1)在本地集群上使用以下命令设置环境变量:


export PILOT_IP=$(kubectl -n istio-system get service istio-pilot -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
export POLICY_IP=$(kubectl -n istio-system get service istio-policy -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
export TELEMETRY_IP=$(kubectl -n istio-system get service istio-telemetry -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
export ZIPKIN_IP=$(kubectl -n istio-system get service zipkin -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
echo $PILOT_IP $POLICY_IP $TELEMETRY_IP $ZIPKIN_IP

2)如果在多个集群中启用跨集群的双向TLS通信,就需要在集群中进行部署配置。当然,如果你的环境只是开发测试或者不需要启用双向TLS通信的话,该步骤完全可以跳过。在远程Kubernetes集群cluster2上运行以下命令,在集群中为生成的CA证书创建Kubernetes密钥:


kubectl create namespace istio-system
kubectl create secret generic cacerts -n istio-system \
    --from-file=samples/certs/ca-cert.pem \
    --from-file=samples/certs/ca-key.pem \
    --from-file=samples/certs/root-cert.pem \
    --from-file=samples/certs/cert-chain.pem

3)在远程Kubernetes集群cluster2上,通过执行以下命令,使用Helm创建Istio remote部署YAML文件。

如果启用了双向TLS通信,则需要如下配置参数:


helm template install/kubernetes/helm/istio \
  --name istio-remote \
  --namespace istio-system \
  --values install/kubernetes/helm/istio/values-istio-remote.yaml \
  --set global.mtls.enabled=true \
  --set security.selfSigned=false \
  --set global.controlPlaneSecurityEnabled=true \
  --set global.remotePilotCreateSvcEndpoint=true \
  --set global.remotePilotAddress=${PILOT_IP} \
  --set global.remotePolicyAddress=${POLICY_IP} \
  --set global.remoteTelemetryAddress=${TELEMETRY_IP} 
  --set global.remoteZipkinAddress=${ZIPKIN_IP} > istio-remote-auth.yaml

然后将Istio remote组件部署到cluster2,如下所示:


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

如果不需要启用双向TLS通信,配置参数则需要做出如下修改:


helm template install/kubernetes/helm/istio \
  --name istio-remote \
  --namespace istio-system \
  --values install/kubernetes/helm/istio/values-istio-remote.yaml \
  --set global.mtls.enabled=false \
  --set security.selfSigned=true \
  --set global.controlPlaneSecurityEnabled=false \
  --set global.remotePilotCreateSvcEndpoint=true \
  --set global.remotePilotAddress=${PILOT_IP} \
  --set global.remotePolicyAddress=${POLICY_IP} \
  --set global.remoteTelemetryAddress=${TELEMETRY_IP} 
  --set global.remoteZipkinAddress=${ZIPKIN_IP} > istio-remote-noauth.yaml

然后将Istio remote组件部署到cluster2,如下所示:


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

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

4)创建集群cluster2的Kubeconf ig。

安装Istio-remote Helm chart后,在远程集群中创建了一个叫istio-multi的Kubernetes服务帐号,该服务帐号用于最小化RBAC访问请求,对应的集群角色定义如下:


kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: istio-reader
rules:
  - apiGroups: ['']
    resources: ['nodes', 'pods', 'services', 'endpoints']
    verbs: ['get', 'watch', 'list']

下面的过程通过使用先前所述的istio-multi服务帐号凭证生成一个远程集群的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 Pilot所在集群中。

在集群dusterl执行以下命令,将上述生成的集群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