当前位置: 首页 > ds >正文

istio笔记03--快速上手多集群mesh

istio笔记03--快速上手多集群mesh

  • 介绍
  • 安装部署
    • 1. 部署集群
    • 2. 部署 metallb
    • 3. 安装istio
    • 4. 配置mesh
  • 验证
  • 注意事项
  • 说明

介绍

作为当前最流行的服务网格产品,istio已经在很多企业内部投入使用。在企业中为了提高服务的高可用、故障转移等能力,通常需要打通几个集群的mesh。
本文基于kind部署两个k8s集群,使用metallb实现入口LB,并且打通两个集群的mesh.

安装部署

1. 部署集群

1.1 安装集群

# kind create cluster -n k8s-130-a --image kindest/node:v1.30.0
# kind create cluster -n k8s-130-b --image kindest/node:v1.30.0

1.2 导出配置

# kind get kubeconfig --name=k8s-130-a > k8s-130-a.config
# kind get kubeconfig --name=k8s-130-b > k8s-130-b.config

上述安装会导致两个集群svc和pod子网相同,出现ip重复的情况,建议通过配置文件安装kind

# kind create cluster --config k8s-130-a.yaml
# kind create cluster --config k8s-130-b.yamlvim k8s-130-a.yaml
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
name: k8s-130-a
networking:podSubnet: "172.18.1.0/24"serviceSubnet: "172.18.11.0/24"
nodes:
- role: control-planeimage: kindest/node:v1.30.0
#- role: workervim k8s-130-b.yaml
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
name: k8s-130-b
networking:podSubnet: "172.18.2.0/24"serviceSubnet: "172.18.12.0/24"
nodes:
- role: control-planeimage: kindest/node:v1.30.0
#- role: worker

2. 部署 metallb

参考 metallb.io/installation
docker network inspect kind 发现默认网段为 172.18.0.0/16 , 此处设置LB IP网段在该范围之内即可
安装

1) 安装
# kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.15.2/config/manifests/metallb-native.yaml
2)vim 130-a-lb-ip-pool.yaml
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:name: lb-ip-poolnamespace: metallb-system
spec:addresses:- 172.18.101.10-172.18.101.19
---
##配置L2Advertisement,用于地址宣告
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:name: 130-a-advnamespace: metallb-system
spec:ipAddressPools: - lb-ip-pool3)vim 130-b-lb-ip-pool.yaml
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:name: lb-ip-poolnamespace: metallb-system
spec:addresses:- 172.18.101.20-172.18.101.29
---
##配置L2Advertisement,用于地址宣告
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:name: 130-b-advnamespace: metallb-system
spec:ipAddressPools: - lb-ip-pool

安装成功后可以通过 kubectl -n metallb-system get IPAddressPool 看到集群a和集群b都正常获取到对应的ip-pool信息
在这里插入图片描述
测试:

1) 创建ng
# kubectl create deploy nginx --image=nginx:1.23
2)创建LB类型的SVC
apiVersion: v1
kind: Service
metadata:name: nginxannotations:metallb.io/loadBalancerIPs: 172.18.101.11
spec:ports:- port: 80targetPort: 80selector:app: nginxtype: LoadBalancer

如下图,svc按照预期获取到lb ip
在这里插入图片描述
在浏览器也能正常通过lb访问nginx实例
在这里插入图片描述

3. 安装istio

3.1. 生成 istio 集群 1.23 部署文件

istioctl manifest generate --set revision=1-23 -f istiod-1.23.yaml -f production/istiod-overlay.yaml -f production/kind-k8s-130-a/istiod-overlay.yaml > production/kind-k8s-130-a/install-1-23.yaml

3.2. 检查部署资源

cd production/kind-k8s-130-a
kubectl apply -f install-1-23.yaml --dry-run=client

3.3. 部署

kubectl create namespace istio-system
kubectl apply -f install-1-23.yaml

3.4. 设置 tag

打一个default的tag,如果要做到金丝雀发布,需要给最新的加上canary标签
istioctl tag set -r 1-23 canary --overwrite
istioctl tag set -r 1-23 default --overwrite

添加tag后可以通过istioctl tag list查看当前istio的tag情况
在这里插入图片描述
可以通过 kubectl get po -n istio-system 查看istio是否基本就绪
在这里插入图片描述
通过 kubectl label namespace default istio-injection=enabled 给default命名空间开启sidecar注入,重启nginx pod后发现正常注入sidecar了。
在这里插入图片描述
注意:本次istio安装目录结构如下

~/software/istio/deploy$ tree
.
├── istiod-1.23.yaml
└── production├── istiod-overlay.yaml├── kind-k8s-130-a│   ├── install-1-23.yaml│   └── istiod-overlay.yaml└── kind-k8s-130-b├── install-1-23.yaml└── istiod-overlay.yaml其中istiod-1.23.yaml为当前版本基础配置,此处简单从istio-1.23.2/manifests/profiles/default.yaml 中拷贝即可,实际使用的时候需要根据企业特性设置各个组件和mesh的特有配置;
production/istiod-overlay.yaml 作为生产环境的基础配置;
production/kind-k8s-130-a/istiod-overlay.yaml 作为指定集群的特有配置;

此处通过production/istiod-overlay.yaml 简单定义了生产环境的meshID和 网络名称,实际中可以通过${env}//istiod-overlay.yaml 来定义各个环境的基础配置,例如组件的资源参数
在这里插入图片描述

此处简单定义了kind-k8s-130-a的集群名称,实际中可以通过env/{env}/env/{cluster-name}/istiod-overlay.yaml 来精细化配置各个集群的属性。
在这里插入图片描述

4. 配置mesh

4.1 生成ca证书

make -f tools/certs/Makefile.selfsigned.mk root-ca
make -f tools/certs/Makefile.selfsigned.mk kind-k8s-130-b-cacerts
make -f tools/certs/Makefile.selfsigned.mk kind-k8s-130-a-cacerts

4.2 创建ca证书

# kc kind-k8s-130-a
kubectl create secret generic cacerts -n istio-system \--from-file=kind-k8s-130-a/ca-cert.pem \--from-file=kind-k8s-130-a/ca-key.pem \--from-file=kind-k8s-130-a/root-cert.pem \--from-file=kind-k8s-130-a/cert-chain.pem# kc kind-k8s-130-b
kubectl create secret generic cacerts -n istio-system \--from-file=kind-k8s-130-b/ca-cert.pem \--from-file=kind-k8s-130-b/ca-key.pem \--from-file=kind-k8s-130-b/root-cert.pem \--from-file=kind-k8s-130-b/cert-chain.pem

4.3 生成remote-secret
此处130-a集群容器ip为172.18.0.4,130-b集群容器ip为172.18.0.2

kubectx kind-k8s-130-a
istioctl create-remote-secret --name=kind-k8s-132-a --server https://172.18.0.4:6443 >kind-k8s-130-a.yaml 
kubectx kind-k8s-130-b
istioctl create-remote-secret --name=kind-k8s-132-b --server https://172.18.0.2:6443 >kind-k8s-130-b.yamlkubectx kind-k8s-130-a
kubectl apply -f kind-k8s-130-b.yaml
kubectx kind-k8s-130-b
kubectl apply -f kind-k8s-130-a.yaml

创建完成后,可以通过来查看两个集群中的mesh,如下图集群a和集群b互相打通了mesh
在这里插入图片描述

验证

通过 istioctl remote-clusters 可以发现两个集群之间正常
在这里插入图片描述
如下图,在集群b的ubuntu pod中同时发现了集群a和集群b中的nginx实例,即2个集群的mesh正常打通
在这里插入图片描述

注意事项

  1. 默认使用kind创建两个集群pod子网划分是相同的,因此验证多集群mesh的时候最好指定为不同的子网。
  2. kind拉起的pod报错 failed complete: too many open files
    kind known-issues/#pod-errors-due-to-too-many-open-files
    解决方法: 进入容器内将如下两个参数保存到/etc/sysctl.conf即可
    # echo "fs.inotify.max_user_watches = 524288" >> /etc/sysctl.conf 
    # echo "fs.inotify.max_user_instances = 512" >> /etc/sysctl.conf
    # sysctl -p
    

说明

系统软件:
ubuntu 24.04.Desktop
kind v0.29.0
docker 28.3.3
istio 1.23.2
K8s v1.30.0
metallb v0.15.2

参考文档:
kind docs/user/quick-start/
基于istio实现多集群流量治理
istio Install Multi-Primary
metallb.io

http://www.xdnf.cn/news/17595.html

相关文章:

  • 【C语言】深入探索预处理
  • Matlab 基于BP神经网络结合Bagging(BP-Bagging)集成算法的单变量时序预测 (单输入单输出)
  • 带冷端补偿的热电偶采集方案MAX31855
  • Dell PowerEdge: Servers by generation (按代系划分的服务器)
  • 【渲染流水线】[几何阶段]-[图元装配]以UnityURP为例
  • C++2024 年一级
  • Cursor设置
  • 【机器学习深度学习】模型选型:如何根据现有设备选择合适的训练模型
  • 【面试场景题】微博热点新闻系统设计方案
  • 一个“加锁无效“的诡异现象
  • #C语言——刷题攻略:牛客编程入门训练(七):分支控制(一)-- 涉及 %c前加空格:忽略起首的空白字符
  • Spring Boot Starter 自动化配置原理深度剖析
  • 把大模型“关进冰箱”——基于知识蒸馏 + 动态量化的小型化实战笔记
  • 推客系统开发全攻略:从架构设计到高并发实战
  • 【Python 高频 API 速学 ②】
  • 让大模型 “睡觉”:把版本迭代当作人类睡眠来设计(附可直接改造的训练作息表与代码)
  • 【Task2】【Datawhale AI夏令营】多模态RAG
  • Python基础教程(四)字符串和编码:深度探索Python字符串与编码的终极指南
  • Milvus 向量数据库基础操作解析
  • Node.js特训专栏-实战进阶:22. Docker容器化部署
  • 模板方法模式:优雅封装算法骨架
  • 代码随想录day60图论10
  • flex布局初体验
  • Kettle ETL 工具存在的问题以及替代方案的探索
  • [激光原理与应用-193]:光学器件 - CLBO晶体:生长过程、工作原理、内部结构、性能指标、关键影响因素
  • MySQL 主备(Master-Slave)复制 的搭建
  • 使用 Vuepress + GitHub Pages 搭建项目文档(2)- 使用 GitHub Actions 工作流自动部署
  • Linux 信号处理标志sa_flags详解
  • visual studio 无明显错误,但是无法编译成功解决—仙盟创梦IDE
  • [IOMMU]面向芯片/SoC验证工程的IOMMU全景速览