在本地集群中安装完控制平面之后,必须将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