多集群istio service mesh--共享控制平面

作者:iyacontrol
出处:
在共享控制平面部署模型下 , 多个Kubernetes远程集群连接到在主集群中运行的共享Istio控制平面 。 远程群集可以与主群集位于同一网络中 , 也可以位于不同网络中 。 连接一个或多个远程集群后 , 主集群的控制平面将管理所有服务端点上的服务网格 。
多集群istio service mesh--共享控制平面文章插图
Istio网格跨越多个Kubernetes集群 , 可通过VPN直接访问远程Pod
先决条件

  • 两个或更多运行受支持的Kubernetes版本(1.16、1.17、1.18)的集群 。
  • 所有Kubernetes控制平面API服务器必须可相互路由 。
  • 同一网络上的群集必须是RFC1918网络 , VPN或满足以下要求的替代的更高级的网络技术:
    • 各个集群Pod CIDR范围和服务CIDR范围在整个网络中必须是唯一的 , 并且不能重叠 。
    • 同一网络中的所有Pod CIDR必须彼此可路由 。
  • 不同网络上的集群必须具有 istio-ingressgateway 服务 , 该服务可从其他每个集群访问 , 最好使用L4网络负载平衡器(NLB) 。 并非所有的云提供商都支持NLB , 并且某些云提供商需要使用特殊的注释才能使用它们 。
准备CA
从组织的根CA为每个集群的CA生成中间CA证书 。 共享的根CA允许跨不同集群的相互TLS通信 。 为便于说明 , 以下说明将Istio示例目录中的证书用于两个集群 。
在网格中的每个集群上运行以下命令以安装证书 。 有关配置外部CA的更多详细信息 , 请参阅证书颁发机构(CA)证书 。
$ 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.pemsamples中的根证书和中间证书已广泛分发并广为人知 。 不要在生产中使用这些证书 , 因为这样集群将容易受到安全漏洞和危害 。
跨集群控制平面访问
确定如何向远程集群公开主集群的Istiod发现服务 。 选择以下两个选项之一:
istio-ingressgateway集群和网络命名确定网格中集群和网络的名称 。 这些名称将在mesh网络配置中以及配置mesh网络的服务注册表时使用 。 为每个集群分配一个唯一的名称 。 该名称必须是DNS标签名称 。 在下面的示例中 , 主集群称为 main0, 而远程群集为 remote0。
$ export MAIN_CLUSTER_NAME=main0$ export REMOTE_CLUSTER_NAME=remote0如果集群位于不同的网络上 , 请为每个网络分配一个唯一的网络名称 。
$ export MAIN_CLUSTER_NETWORK=network1$ export REMOTE_CLUSTER_NETWORK=network2如果集群在同一网络上 , 则这些集群使用相同的网络名称 。
$ export MAIN_CLUSTER_NETWORK=network1$ export REMOTE_CLUSTER_NETWORK=network1部署主集群
创建主集群的配置 。 选择跨集群控制平面访问的两个选项之一 。
如果是选择 istio-ingressgateway , 则:
cat < istio-main-cluster.yamlapiVersion: install.istio.io/v1alpha1kind: IstioOperatorspec:values:global:multiCluster:clusterName: ${MAIN_CLUSTER_NAME}network: ${MAIN_CLUSTER_NETWORK}# Mesh network configuration. This is optional and may be omitted if# all clusters are on the same network.meshNetworks:${MAIN_CLUSTER_NETWORK}:endpoints:- fromRegistry: ${MAIN_CLUSTER_NAME}gateways:- registry_service_name: istio-ingressgateway.istio-system.svc.cluster.localport: 443${REMOTE_CLUSTER_NETWORK}:endpoints:- fromRegistry: ${REMOTE_CLUSTER_NAME}gateways:- registry_service_name: istio-ingressgateway.istio-system.svc.cluster.localport: 443# Use the existing istio-ingressgateway.meshExpansion:enabled: trueEOF如果是选择内部负载均衡器 , 则:
cat < istio-main-cluster.yamlapiVersion: install.istio.io/v1alpha1kind: IstioOperatorspec:values:global:multiCluster:clusterName: ${MAIN_CLUSTER_NAME}network: ${MAIN_CLUSTER_NETWORK}# Mesh network configuration. This is optional and may be omitted if# all clusters are on the same network.meshNetworks:${MAIN_CLUSTER_NETWORK}:endpoints:- fromRegistry: ${MAIN_CLUSTER_NAME}gateways:- registry_service_name: istio-ingressgateway.istio-system.svc.cluster.localport: 443${REMOTE_CLUSTER_NETWORK}:endpoints:- fromRegistry: ${REMOTE_CLUSTER_NAME}gateways:- registry_service_name: istio-ingressgateway.istio-system.svc.cluster.localport: 443# Change the Istio service `type=LoadBalancer` and add the cloud provider specific annotations. See# #internal-load-balancer for more# information. The example below shows the configuration for GCP/GKE.# If the GCP/GKE version is less than 1.16, add `network.gke.io/internal-load-balancer-allow-global-access: "true"` to the `service_annotations`.# See #tab-top.components:pilot:k8s:service:type: LoadBalancerservice_annotations:cloud.google.com/load-balancer-type: InternalEOF