在共享管制立体部署模型下,多个Kubernetes近程集群连贯到在主集群中运行的共享Istio管制立体。近程群集能够与主群集位于同一网络中,也能够位于不同网络中。连贯一个或多个近程集群后,主集群的管制立体将治理所有服务端点上的服务网格。

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.pem
samples中的根证书和两头证书已宽泛散发并广为人知。不要在生产中应用这些证书,因为这样集群将容易受到安全漏洞和危害。

跨集群管制立体拜访

确定如何向近程集群公开主集群的Istiod发现服务。抉择以下两个选项之一:

  • Option (1) - 应用与数据流量共享的istio-ingressgateway网关。.
  • Option (2) - 在Istiod服务上应用云提供商的外部负载平衡器。无关在群集之间应用外部负载均衡器时可能实用的其余要求和限度,请参阅Kubernetes外部负载均衡器文档和您的云提供商的文档。

集群和网络命名

确定网格中集群和网络的名称。这些名称将在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 <<EOF> 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.local            port: 443        ${REMOTE_CLUSTER_NETWORK}:          endpoints:          - fromRegistry: ${REMOTE_CLUSTER_NAME}          gateways:          - registry_service_name: istio-ingressgateway.istio-system.svc.cluster.local            port: 443      # Use the existing istio-ingressgateway.      meshExpansion:        enabled: trueEOF

如果是抉择外部负载均衡器,则:

cat <<EOF> 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.local            port: 443        ${REMOTE_CLUSTER_NETWORK}:          endpoints:          - fromRegistry: ${REMOTE_CLUSTER_NAME}          gateways:          - registry_service_name: istio-ingressgateway.istio-system.svc.cluster.local            port: 443  # Change the Istio service `type=LoadBalancer` and add the cloud provider specific annotations. See  # https://kubernetes.io/docs/concepts/services-networking/service/#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 https://stackoverflow.com/questions/59680679/gcp-internal-load-balancer-global-access-beta-annotation-does-not-work?answertab=active#tab-top.  components:    pilot:      k8s:        service:          type: LoadBalancer        service_annotations:          cloud.google.com/load-balancer-type: InternalEOF

利用主集群的配置。

istioctl install -f istio-main-cluster.yaml --context=${MAIN_CLUSTER_CTX}

期待管制立体准备就绪,而后再持续。

kubectl get pod -n istio-system --context=${MAIN_CLUSTER_CTX}NAME                                    READY   STATUS    RESTARTS   AGEistio-ingressgateway-7c8dd65766-lv9ck   1/1     Running   0          136mistiod-f756bbfc4-thkmk                  1/1     Running   0          136m

依据之前抉择的近程管制立体配置选项设置ISTIOD_REMOTE_EP环境变量。

如果抉择的是istio-ingressgateway,则:

$ export ISTIOD_REMOTE_EP=$(kubectl get svc -n istio-system --context=${MAIN_CLUSTER_CTX} istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip}')$ echo "ISTIOD_REMOTE_EP is ${ISTIOD_REMOTE_EP}"

如果抉择的是外部负载均衡器,则:

$ export ISTIOD_REMOTE_EP=$(kubectl get svc -n istio-system --context=${MAIN_CLUSTER_CTX} istiod -o jsonpath='{.status.loadBalancer.ingress[0].ip}')$ echo "ISTIOD_REMOTE_EP is ${ISTIOD_REMOTE_EP}"

近程集群

创立近程集群的配置。

cat <<EOF> istio-remote0-cluster.yamlapiVersion: install.istio.io/v1alpha1kind: IstioOperatorspec:  values:    global:      # The remote cluster's name and network name must match the values specified in the      # mesh network configuration of the primary cluster.      multiCluster:        clusterName: ${REMOTE_CLUSTER_NAME}      network: ${REMOTE_CLUSTER_NETWORK}      # Replace ISTIOD_REMOTE_EP with the the value of ISTIOD_REMOTE_EP set earlier.      remotePilotAddress: ${ISTIOD_REMOTE_EP}  ## The istio-ingressgateway is not required in the remote cluster if both clusters are on  ## the same network. To disable the istio-ingressgateway component, uncomment the lines below.  #  # components:  #  ingressGateways:  #  - name: istio-ingressgateway  #    enabled: falseEOF

利用近程集群配置。

$ istioctl install -f istio-remote0-cluster.yaml --context ${REMOTE_CLUSTER_CTX}

期待近程集群准备就绪。

$ kubectl get pod -n istio-system --context=${REMOTE_CLUSTER_CTX}NAME                                    READY   STATUS    RESTARTS   AGEistio-ingressgateway-55f784779d-s5hwl   1/1     Running   0          91mistiod-7b4bfd7b4f-fwmks                 1/1     Running   0          91m
在近程集群中运行的istiod部署为近程集群的pod提供主动sidecar注入和CA服务。这些服务以前由Sidecar注入器和Citadel部署提供,而Istiod中不蕴含这服务。近程集群的Pod正在从主集群的Istiod获取配置以进行服务发现。

跨集群负载平衡

配置 ingress gateway

如果两个集群都在同一网络上,请跳过此步骤并持续配置服务注册表。

跨网络流量通过每个指标集群的ingress gateway平安地路由。当网格中的集群位于不同的网络上时,您须要在入口网关上配置端口443,以将传入流量传递到申请的SNI标头中指定的指标服务,以获取本地顶级域(即Kubernetes)的SNI值。 DNS域)。互相TLS连贯将从源到目的地始终应用。

将以下配置利用于每个集群。

cat <<EOF> cluster-aware-gateway.yamlapiVersion: networking.istio.io/v1alpha3kind: Gatewaymetadata:  name: cluster-aware-gateway  namespace: istio-systemspec:  selector:    istio: ingressgateway  servers:  - port:      number: 443      name: tls      protocol: TLS    tls:      mode: AUTO_PASSTHROUGH    hosts:    - "*.local"EOF$ kubectl apply -f cluster-aware-gateway.yaml --context=${MAIN_CLUSTER_CTX}$ kubectl apply -f cluster-aware-gateway.yaml --context=${REMOTE_CLUSTER_CTX}

配置跨集群服务注册

为了实现跨集群的负载平衡,Istio管制立体要求拜访网格中的所有集群以发现服务,端点和Pod属性。要配置拜访权限,请为每个具备凭据的近程集群创立一个秘钥,以拜访近程集群的kube-apiserver并将其装置在主集群中。此秘钥应用近程集群中istio-reader-service-account的凭据。 --name指定近程集群的名称。它必须与主集群的IstioOperator配置中的集群名称匹配。

$ istioctl x create-remote-secret --name ${REMOTE_CLUSTER_NAME} --context=${REMOTE_CLUSTER_CTX} |     kubectl apply -f - --context=${MAIN_CLUSTER_CTX}
不要为运行Istio管制立体的本地群集创立近程秘钥。 Istio始终晓得本地集群的Kubernetes凭据。

其余

Automatic injection

每个集群中的Istiod服务都会为其本身集群中的代理提供主动Sidecar注入。必须依照主动Sidecar注入指南在每个集群中标记名称空间。

拜访来自不同集群的服务

Kubernetes会基于集群解析DNS。因为DNS解析与集群相干,因而无论服务端点的地位如何,您都必须在运行客户端的每个集群中定义服务对象。为确保这种状况,请应用kubectl将服务对象复制到每个集群。复制可确保Kubernetes能够解析任何集群中的服务名称。因为服务对象是在名称空间中定义的,因而您必须定义该名称空间(如果该名称不存在),并将其蕴含在所有集群的服务定义中。

平安

每个集群中的Istiod服务向其本人集群中的代理提供CA性能。晚期的CA设置可确保网格中集群之间的代理具备雷同的信赖根。