Istio部署
目前 Istio 支持三种方式进行部署:
- 使用Helm自定义安装 (已弃用)
- 使用Operator安装 (实验阶段)
- 使用istioctl工具安装 (官方推荐)
Istio单集群模式部署
Istio最简部署是指单一网络,单一集群,单一控制平面的部署模式,Istio最简部署方案不具备高可用性,故障隔离,故障转移等特性
使用 istioctl 安装
1 | # 下载 istio 安装包 |
使用 yaml manifest 安装
1 | # 手动 创建 istio-system 命名空间 |
注意: 使用 kubectl apply yaml文件的方式安装Istio 官方暂未测试,同时可能由于执行顺序问题导致安装短暂失败,并且istio配置变更时不会自动清理相关资源,不推荐使用
Istio多集群部署
由于Istio最简模式缺乏服务高可用,故障转移,故障隔离等特性,因此如果对服务有高可用要求时则需要使用多集群的方式部署;多集群部署比单集群可以提供更多的能力:
- 故障隔离和故障转移:当 cluster-1 下线,业务将转移至 cluster-2
- 位置感知路由和故障转移:将请求发送到最近的服务
- 多种控制平面模型:支持不同级别的可用性
- 团队或项目隔离:每个团队仅运行自己的集集群
多集群多控制平面
前提条件
- 两个以上 Kubernetes 集群,且版本为:1.15, 1.16, 1.17, 1.18
- 有权限在 每个 Kubernetes 集群上,部署 Istio 控制平面
- 每个集群 istio-ingressgateway 服务的 IP 地址,必须允许其它集群访问
- 多集群使用同一个根CA证书。跨集群的服务通信必须使用双向 TLS 连接
部署步骤
创建CA 用于多集群间TLS通信,在全部Kubernetes 集群中执行以下操作
1 | $ kubectl create namespace istio-system |
安装Istio
1 | $ istioctl install \ |
配置DNS
1 | $ kubectl apply -f - < |
备注:cluster-1 如果需要访问cluster-2的服务时,需要创建 ServiceEntry,例如:在cluster-1 中需要访问 cluster-2的bar命名空间下的httpbin服务,具体ServiceEntry声明如下
1 | $ kubectl apply --context=$CTX_CLUSTER1 -n foo -f - < |
多集群多控制平面本质多个独立的集群,使用global域名进行服务发现,通过注册ServiceEntry访问“外部”集群服务的方式调用远程服务并使用统一的CA建立双向TLS通信保证传输安全
多集群共享控制平面
前提条件
- 两个以上 Kubernetes 集群,且版本高于1.15
- 全部 Kubernetes API server 必须可以互相访问
- (如果多个集群处于同一网络时)必须满足集群Pod CIDR 和Service CIDR 在多集群网络中必须唯一不能有重叠 并且所有Pod的网络必须可以互通
- (如果多个集群处于不同网络时)要求 istio-ingressgateway 必须可以被其他集群访问
部署步骤
创建CA 用于多集群间TLS通信,在全部Kubernetes 集群中执行以下操作
1 | $ kubectl create namespace istio-system |
对集群及网络命名
1 |
|
通过使用负载均衡的方式,将主集群 Istiod 服务发现暴露给其他集群
1 | $ cat < |
1 | $ export ISTIOD_REMOTE_EP=$(kubectl get svc -n istio-system --context=${MAIN_CLUSTER_CTX} istiod -o jsonpath='{.status.loadBalancer.ingress[0].ip}') |
配置安装远程集群
1 | cat < |