- IBM Cloud Private
- 创建 IBM Cloud Private 集群
- 配置跨 IBM Cloud Private 集群 Pod 通信
- 为多集群安装 Istio
- 跨集群部署 Bookinfo 示例
IBM Cloud Private
此示例演示了如何在基于 VPN 的多集群安装指导 的帮助下使用 Istio 的多集群功能连接两个IBM Cloud Private 集群。
创建 IBM Cloud Private 集群
- 安装两个 IBM Cloud Private 集群.注意: 确保各个集群的 Pod CIDR ranges 和 service CIDR ranges 是相互独立的、没有重叠。这可以通过配置文件
cluster/config.yaml
中的network_cidr
和service_cluster_ip_range
配置。
## Network in IPv4 CIDR format
network_cidr: 10.1.0.0/16
## Kubernetes Settings
service_cluster_ip_range: 10.0.0.1/24
在 IBM Cloud Private 集群安装完成后,验证是否能通过
kubectl
访问集群。在此示例中使用的两个集群名称分别假定为cluster-1
和cluster-2
。使用
kubectl
配置cluster-1
.检查集群状态:
$ kubectl get nodes
$ kubectl get pods --all-namespaces
- 重复以上两个步骤以验证
cluster-2
集群。
配置跨 IBM Cloud Private 集群 Pod 通信
IBM Cloud Private 默认使用 Calico Node-to-Node Mesh 来管理容器网络。在各个节点上的 BGP 客户端分发 IP 路由信息到所有节点。
为了确保 pod 可以跨集群通信,你需要配置集群中所有节点的 IP 路由信息。这需要两个步骤:
添加从
cluster-1
到cluster-2
的路由信息。添加从
cluster-2
到cluster-1
的路由信息。
你可以查看如何添加从 cluster-1
到 cluster-2
的 IP 路由来验证跨集群间 pod 通信。在 Node-to-Node Mesh 模式下,集群中的每个节点都会有连接到其他同级节点的 IP 路由信息。在此示例中,两个集群都有三个节点。
cluster-1
的 hosts
文件:
9.111.255.21 gyliu-icp-1
9.111.255.129 gyliu-icp-2
9.111.255.29 gyliu-icp-3
cluster-2
的 hosts
文件:
9.111.255.152 gyliu-ubuntu-3
9.111.255.155 gyliu-ubuntu-2
9.111.255.77 gyliu-ubuntu-1
- 使用命令
ip route | grep bird
在cluster-1
集群的所有节点上获取路由信息。
$ 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
- 在
cluster-1
中的三个节点总共有三条 IP 路由信息。
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
- 在
cluster-2
的三个节点上分别使用以下命令添加三条 IP 路由信息:
$ 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
你可以使用同样的步骤添加从
cluster-2
到cluster-1
的路由信息。配置完成后,这两个集群上的所有节点都可以相互通信。在
cluster-1
上 pingcluster-2
上的 pod 以验证跨 pod 通信。下面是一个在cluster-2
上 IP 为20.1.47.150
的 pod。
$ 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
- 从
cluster-1
的一个节点上 ping 此 IP 应该会成功。
$ 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
此节中的这些步骤通过配置一个完整的 IP 路由 mesh,使跨两个 IBM Cloud Private 集群的所有节点的相互通信成为可能。
为多集群安装 Istio
跟随基于 VPN 的多集群安装步骤 来在 cluster-1
和 cluster-2
集群上分别安装并配置本地 Istio 控制平面和远程 Istio。
此示例使用 cluster-1
作为本地 Istio 控制平面,cluster-2
作为远程 Istio。
跨集群部署 Bookinfo 示例
注意: 以下示例启用了 自动 sidecar 注入.
- 安装
bookinfo
在第一个集群cluster-1
上。移除此集群上的reviews-v3
deployment 以便将其部署在cluster-2
上:
ZipZip
$ kubectl apply -f @samples/bookinfo/platform/kube/bookinfo.yaml@
$ kubectl apply -f @samples/bookinfo/networking/bookinfo-gateway.yaml@
$ kubectl delete deployment reviews-v3
- 创建
reviews-v3.yaml
manifest 以便部署在cluster-2
上:
---
##################################################################################################
# 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
注意: ratings
service 的定义被添加到了 cluster-2
集群上因为 reviews-v3
服务会调用 ratings
服务,而添加一个 service 对象会添加一条 DNS 记录。在 reviews-v3
pod 中的 Istio sidecar 在 DNS 解析出 service 地址后将会选择合适的 ratings
服务 endpoint。但是如果设置了另外的多集群 DNS 解析,那么这个步骤就不是必须的了,比如在一个 federated Kubernetes 环境中。
- 安装
reviews-v3
deployment 到cluster-2
。
$ kubectl apply -f $HOME/reviews-v3.yaml
- ingress IP 和端口,确定
istio-ingressgateway
的INGRESS_HOST
和INGRESS_PORT
变量以访问 gateway。
重复地访问 http://<INGRESS_HOST>:<INGRESS_PORT>/productpage
会发现请求应该被均匀的分发到了各个版本的 reviews
服务上, 包括在 cluster-2
集群上的 reviews-v3
服务(红色星星)。可能需要访问许多次才能展示出请求确实是被均匀的分发到了所有版本的 reviews
服务上。