IBM Cloud Private
This example demonstrates how to use Istio's multicluster feature to join two IBM Cloud Private clusters together, using the multicluster installation instructions.
Create the IBM Cloud Private Clusters
Install two IBM Cloud Private clusters. NOTE: Make sure individual cluster Pod CIDR ranges and service CIDR ranges are unique and do not overlap across the multicluster environment and may not overlap. This can be configured by
network_cidr
andservice_cluster_ip_range
incluster/config.yaml
.## Network in IPv4 CIDR format network_cidr: 10.1.0.0/16 ## Kubernetes Settings service_cluster_ip_range: 10.0.0.1/24
After IBM Cloud Private cluster install finishes, validate
kubectl
access to each cluster. In this example, consider two clusterscluster-1
andcluster-2
.Check the cluster status:
$ kubectl get nodes $ kubectl get pods --all-namespaces
Repeat above two steps to validate
cluster-2
.
Configure Pod Communication Across IBM Cloud Private Clusters
IBM Cloud Private uses Calico Node-to-Node Mesh by default to manage container networks. The BGP client on each node distributes the IP router information to all nodes.
To ensure pods can communicate across different clusters, you need to configure IP routers on all nodes in the cluster. You need two steps:
Add IP routers from
cluster-1
tocluster-2
.Add IP routers from
cluster-2
tocluster-1
.
You can check how to add IP routers from cluster-1
to cluster-2
to validate pod to pod communication
across clusters. With Node-to-Node Mesh mode, each node will have IP routers connecting to peer nodes in
the cluster. In this example, both clusters have three nodes.
The hosts
file for cluster-1
:
9.111.255.21 gyliu-icp-1
9.111.255.129 gyliu-icp-2
9.111.255.29 gyliu-icp-3
The hosts
file for cluster-2
:
9.111.255.152 gyliu-ubuntu-3
9.111.255.155 gyliu-ubuntu-2
9.111.255.77 gyliu-ubuntu-1
Obtain routing information on all nodes in
cluster-1
with the commandip route | grep bird
.$ ip route | grep bird 10.1.43.0/26 via 9.111.255.29 dev tunl0 proto bird onlink 10.1.158.192/26 via 9.111.255.129 dev tunl0 proto bird onlink blackhole 10.1.198.128/26 proto bird
$ ip route | grep bird 10.1.43.0/26 via 9.111.255.29 dev tunl0 proto bird onlink blackhole 10.1.158.192/26 proto bird 10.1.198.128/26 via 9.111.255.21 dev tunl0 proto bird onlink
$ ip route | grep bird blackhole 10.1.43.0/26 proto bird 10.1.158.192/26 via 9.111.255.129 dev tunl0 proto bird onlink 10.1.198.128/26 via 9.111.255.21 dev tunl0 proto bird onlink
There are three IP routers total for those three nodes in
cluster-1
.10.1.158.192/26 via 9.111.255.129 dev tunl0 proto bird onlink 10.1.198.128/26 via 9.111.255.21 dev tunl0 proto bird onlink 10.1.43.0/26 via 9.111.255.29 dev tunl0 proto bird onlink
Add those three IP routers to all nodes in
cluster-2
by the command to follows:$ ip route add 10.1.158.192/26 via 9.111.255.129 $ ip route add 10.1.198.128/26 via 9.111.255.21 $ ip route add 10.1.43.0/26 via 9.111.255.29
You can use the same steps to add all IP routers from
cluster-2
tocluster-1
. After configuration is complete, all the pods in those two different clusters can communication with each other.Verify across pod communication by pinging pod IP in
cluster-2
fromcluster-1
. The following is a pod fromcluster-2
with pod IP as20.1.47.150
.$ kubectl get pods -owide -n kube-system | grep platform-ui platform-ui-lqccp 1/1 Running 0 3d 20.1.47.150 9.111.255.77
From a node in
cluster-1
ping the pod IP which should succeed.$ ping 20.1.47.150 PING 20.1.47.150 (20.1.47.150) 56(84) bytes of data. 64 bytes from 20.1.47.150: icmp_seq=1 ttl=63 time=0.759 ms
The steps in this section enables Pod communication across clusters by configuring a full IP routing mesh across all nodes in the two IBM Cloud Private Clusters.
Install Istio for multicluster
Follow the multicluster installation steps to install and configure
local Istio control plane and Istio remote on cluster-1
and cluster-2
.
This example uses cluster-1
as the local Istio control plane and cluster-2
as the Istio remote.
Deploy Bookinfo Example Across Clusters
NOTE: The following example enables automatic sidecar injection.
Install
bookinfo
on the first clustercluster-1
. Removereviews-v3
deployment to deploy on remote:$ kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml $ kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml $ kubectl delete deployment reviews-v3
Create the
reviews-v3.yaml
manifest for deployment on the remote:--- ################################################################################################## # Ratings service ################################################################################################## apiVersion: v1 kind: Service metadata: name: ratings labels: app: ratings spec: ports: - port: 9080 name: http --- ################################################################################################## # Reviews service ################################################################################################## apiVersion: v1 kind: Service metadata: name: reviews labels: app: reviews spec: ports: - port: 9080 name: http selector: app: reviews --- apiVersion: extensions/v1beta1 kind: Deployment metadata: name: reviews-v3 spec: replicas: 1 template: metadata: labels: app: reviews version: v3 spec: containers: - name: reviews image: istio/examples-bookinfo-reviews-v3:1.5.0 imagePullPolicy: IfNotPresent ports: - containerPort: 9080
Note: The
ratings
service definition is added to the remote cluster becausereviews-v3
is a client ofratings
and creating the service object creates a DNS entry. The Istio sidecar in thereviews-v3
pod will determine the properratings
endpoint after the DNS lookup is resolved to a service address. This would not be necessary if a multicluster DNS solution were additionally set up, e.g. as in a federated Kubernetes environment.Install the
reviews-v3
deployment on the remotecluster-2
.$ kubectl apply -f $HOME/reviews-v3.yaml
Determine the ingress IP and ports for
istio-ingressgateway
'sINGRESS_HOST
andINGRESS_PORT
variables for accessing the gateway.Access
http://<INGRESS_HOST>:<INGRESS_PORT>/productpage
repeatedly and each version ofreviews
should be equally load balanced, includingreviews-v3
in the remote cluster (red stars). It may take several accesses (dozens) to demonstrate the equal load balancing betweenreviews
versions.
See also
Example multicluster GKE install of Istio.
IBM Cloud Kubernetes Service & IBM Cloud Private
Example multicluster between IBM Cloud Kubernetes Service & IBM Cloud Private.
Install Istio with multicluster support.
Instructions to download the Istio release.
Instructions to setup a Google Kubernetes Engine cluster for Istio.
Describes the options available when installing Istio using the included Helm chart.