- 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 formatnetwork_cidr: 10.1.0.0/16## Kubernetes Settingsservice_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-19.111.255.129 gyliu-icp-29.111.255.29 gyliu-icp-3
cluster-2 的 hosts 文件:
9.111.255.152 gyliu-ubuntu-39.111.255.155 gyliu-ubuntu-29.111.255.77 gyliu-ubuntu-1
- 使用命令
ip route | grep bird在cluster-1集群的所有节点上获取路由信息。
$ ip route | grep bird10.1.43.0/26 via 9.111.255.29 dev tunl0 proto bird onlink10.1.158.192/26 via 9.111.255.129 dev tunl0 proto bird onlinkblackhole 10.1.198.128/26 proto bird
$ ip route | grep bird10.1.43.0/26 via 9.111.255.29 dev tunl0 proto bird onlinkblackhole 10.1.158.192/26 proto bird10.1.198.128/26 via 9.111.255.21 dev tunl0 proto bird onlink
$ ip route | grep birdblackhole 10.1.43.0/26 proto bird10.1.158.192/26 via 9.111.255.129 dev tunl0 proto bird onlink10.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 onlink10.1.198.128/26 via 9.111.255.21 dev tunl0 proto bird onlink10.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-uiplatform-ui-lqccp 1/1 Running 0 3d 20.1.47.150 9.111.255.77
- 从
cluster-1的一个节点上 ping 此 IP 应该会成功。
$ ping 20.1.47.150PING 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-v3deployment 以便将其部署在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.yamlmanifest 以便部署在cluster-2上:
---################################################################################################### Ratings service##################################################################################################apiVersion: v1kind: Servicemetadata:name: ratingslabels:app: ratingsspec:ports:- port: 9080name: http---################################################################################################### Reviews service##################################################################################################apiVersion: v1kind: Servicemetadata:name: reviewslabels:app: reviewsspec:ports:- port: 9080name: httpselector:app: reviews---apiVersion: extensions/v1beta1kind: Deploymentmetadata:name: reviews-v3spec:replicas: 1template:metadata:labels:app: reviewsversion: v3spec:containers:- name: reviewsimage: istio/examples-bookinfo-reviews-v3:1.5.0imagePullPolicy: IfNotPresentports:- containerPort: 9080
注意: ratings service 的定义被添加到了 cluster-2 集群上因为 reviews-v3 服务会调用 ratings 服务,而添加一个 service 对象会添加一条 DNS 记录。在 reviews-v3 pod 中的 Istio sidecar 在 DNS 解析出 service 地址后将会选择合适的 ratings 服务 endpoint。但是如果设置了另外的多集群 DNS 解析,那么这个步骤就不是必须的了,比如在一个 federated Kubernetes 环境中。
- 安装
reviews-v3deployment 到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 服务上。
