Service Mesh之Istio基础入门
技术背景
分布式服务治理
所谓分布式服务治理就是对服务不断增长的复杂度的管控和管理;管控及管理包含网络拓扑变动、网络延时、通信安全、API网关、服务注册和发现、服务熔断容错、服务超时重试、服务部署、数据调用、分布式链路追踪等等;
服务治理历程
第一代服务治理(内嵌应用程序中)
提示:第一代服务治理能力的代码是内嵌在业务代码中,即所有的服务治理功能需要程序员自己编写;典型技术:SOA、ESB;这种服务治理的优势就是简单使用依赖少;劣势是代码耦合,重复性较高,运维复杂,解耦差,开发要求高;
第二代服务治理(统一抽象成SDK)
提示:第二代服务治理是把服务治理能力抽象到统一SDK实现,开发人员可以根据SDK中的api来写业务代码,从而使对应业务具有服务治理的功能;典型技术:Spring Cloud、Dubbo等;这种服务治理的优势是代码重复少,治理逻辑代码和业务代码分开;劣势是SDK语言绑定,代码侵入;基于SDK开发学习门槛较高;系统改造代价大,治理能力升级影响用户业务(即SDK升级,会导致业务代码的升级);
第三代服务治理(统一到Sidecar)
提示:第三代服务治理能力统一到服务网格上;即服务治理的能力,通过在业务代码周边运行一个独立的sidecar来完成;程序员只需要关注自己的业务代码的开发,服务治理能力就交给sidecar服务网格来完成;第三代服务治理的优势是独立进程,用户业务非侵入,开发和语言无关(只要能够完成对应的业务功能,用什么语言都可以);治理逻辑升级对业务没有影响;可以渐进的微服务化;劣势就是性能和资源的开销;
提示:在微服务体系架构中,我们为每个服务都使用一个专用的代理Sidecar来完成高级网络功能;各服务间仅通过Sidecar代理互相通信,各个代理代理之间形成一个网状网络,2017年,William为其创建一个专用的定义,并称之为Service Mesh;
提示:新一代服务网格架构分为控制平面和数据平面两个部分;数据平面触及系统中的每个数据包或请求,负责服务发现、健康检查、路由、负载均衡、身份验证/授权和可观测性等;控制平面主要为网格中的所有正在运行的数据平面提供策略和配置,从而将所有数据平面联合构建为分布式系统,它不接触系统中的任何数据包或请求;控制平面负责的任务包括例如确定两个服务Service X到Sevice Y之间的路由,Service Y相关集群的负载均衡机制、断路策略、流量转移机制等,并将决策下发给Service X和Service Y的Sidecar;
控制平面组件
提示:k8s主要负责解决容器编排与调度的问题,本质上是应用程序生命周期工具,为服务网格提供基础支撑;Service Mesh 主要解决分布式应用间的通信问题,本质上服务通信治理工具,是k8s在网络功能方面的扩展和延伸;
Istio是什么?
提示:Istio服务网格主要有两部分组成,控制平面和数据平面;控制平面核心程序istiod,主要是用于管控数据平面envoy proxy;数据平面envoy proxy主要管控主容器的进出流量;envoy proxy由控制平面istiod下发配置实现流量管控,同时它还能够发现服务网格中的其他配置和服务,也能够收集对应的指标数据;
istio体验环境部署
环境说明
kubernetes:v1.26.3
docker :23.0.1
cri-dockerd:0.3.0
istio:1.17.1
下载istio客户端程序包
root@k8s-master01:/usr/local# curl -L https://istio.io/downloadIstio | sh -
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 102 100 102 0 0 100 0 0:00:01 0:00:01 --:--:-- 100
100 4856 100 4856 0 0 2347 0 0:00:02 0:00:02 --:--:-- 9429 Downloading istio-1.17.1 from https://github.com/istio/istio/releases/download/1.17.1/istio-1.17.1-linux-amd64.tar.gz ... Istio 1.17.1 Download Complete! Istio has been successfully downloaded into the istio-1.17.1 folder on your system. Next Steps:
See https://istio.io/latest/docs/setup/install/ to add Istio to your Kubernetes cluster. To configure the istioctl client tool for your workstation,
add the /usr/local/istio-1.17.1/bin directory to your environment path variable with:
export PATH="$PATH:/usr/local/istio-1.17.1/bin" Begin the Istio pre-installation check by running:
istioctl x precheck Need more information? Visit https://istio.io/latest/docs/setup/install/
root@k8s-master01:/usr/local#
提示:使用上述命令,请先确定你的终端是否能够正常连接到istio的官方网站;
创建链接,将istioctl命令链接至/usr/bin/目录下
root@k8s-master01:/usr/local# ls
bin etc games include istio-1.17.1 lib man sbin share src
root@k8s-master01:/usr/local# ln -sv istio-1.17.1 istio
'istio' -> 'istio-1.17.1'
root@k8s-master01:/usr/local# ls
bin etc games include istio istio-1.17.1 lib man sbin share src
root@k8s-master01:/usr/local# cd istio
root@k8s-master01:/usr/local/istio# ls
bin LICENSE manifests manifest.yaml README.md samples tools
root@k8s-master01:/usr/local/istio# ln -sv /usr/local/istio/bin/istioctl /usr/bin/
'/usr/bin/istioctl' -> '/usr/local/istio/bin/istioctl'
root@k8s-master01:/usr/local/istio#
提示:链接至/usr/bin/目录下是因为后续方便istioctl命令的使用;
列出profile
root@k8s-master01:/usr/local/istio# cd
root@k8s-master01:~# istioctl profile list
Istio configuration profiles:
ambient
default
demo
empty
external
minimal
openshift
preview
remote
root@k8s-master01:~#
提示:测试环境我们使用demo即可,生产环境使用default;
安装istio
root@k8s-master01:~# istioctl install --set profile=demo -y
Istio core installed
Istiod installed
Egress gateways installed
Ingress gateways installed
Installation complete
Making this installation the default for injection and validation. Thank you for installing Istio 1.17. Please take a few minutes to tell us about your install/upgrade experience! https://forms.gle/hMHGiwZHPU7UQRWe9
验证:istio-system名称空间中是否有pod running?
root@k8s-master01:~# kubectl get pods -n istio-system
NAME READY STATUS RESTARTS AGE
istio-egressgateway-774d6846df-fv97t 1/1 Running 0 21m
istio-ingressgateway-69499dc-pdgld 1/1 Running 0 21m
istiod-65dcb8497-9skn9 1/1 Running 0 26m
root@k8s-master01:~#
验证:istio 版本信息
root@k8s-master01:~# istioctl version
client version: 1.17.1
control plane version: 1.17.1
data plane version: 1.17.1 (2 proxies)
root@k8s-master01:~#
提示:可以看到现在数据平面有两个代理,这是因为我们安装istio时,在istio-system名称空间下运行了一个ingressgateway和egressgateway pod,这两个pod就是istio的数据平面,istiod是控制平面;
查看istio-system名称空间下创建的服务资源
提示:可以看到ingressgateway 处于pending状态,这是因为没有设置外部IP地址;
修改ingressgateway网关地址
~# kubectl edit svc istio-ingressgateway -n istio-system
提示:在spec字段下,找一个位置加上externalIPs字段,来指定一个IP地址即可;这个IP地址必须是集群节点空余IP地址;
验证:查看istio-system名称空间下的svc 看看对应ingressgateway 外部IP地址是否修改?
root@k8s-master01:~# kubectl get svc -n istio-system
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
istio-egressgateway ClusterIP 10.106.179.126 <none> 80/TCP,443/TCP 34m
istio-ingressgateway LoadBalancer 10.102.211.120 192.168.0.252 15021:32639/TCP,80:31338/TCP,443:30597/TCP,31400:31714/TCP,15443:32154/TCP 34m
istiod ClusterIP 10.96.6.69 <none> 15010/TCP,15012/TCP,443/TCP,15014/TCP 39m
root@k8s-master01:~#
提示:可以看到ingressgateway 对应外部IP地址就修改成我们刚才指定的IP地址了;
为default名称空间打标签,允许istio注入envoy sidecar
root@k8s-master01:~# kubectl label namespace default istio-injection=enabled
namespace/default labeled
root@k8s-master01:~# kubectl get ns --show-labels
NAME STATUS AGE LABELS
default Active 14h istio-injection=enabled,kubernetes.io/metadata.name=default
istio-system Active 47m kubernetes.io/metadata.name=istio-system
kube-node-lease Active 14h kubernetes.io/metadata.name=kube-node-lease
kube-public Active 14h kubernetes.io/metadata.name=kube-public
kube-system Active 14h kubernetes.io/metadata.name=kube-system
root@k8s-master01:~#
提示:这个名称空间可以根据自己的环境来;我们在给那个名称空间打上上述标签,对应在那个名称空间下部署pod都会注入一个sidecar而实现service mesh功能;
测试:在defuault名称空间下,部署一个pod,看看对应是否会给注入一个sidecar呢?
root@k8s-master01:~# kubectl run test --image=nginx --restart=Never
pod/test created
root@k8s-master01:~# kubectl get pods
NAME READY STATUS RESTARTS AGE
test 2/2 Running 0 37s
root@k8s-master01:~#
提示:可以看到我们在default名称空间下跑了一个nginx pod,对应pod里有两个容器;
验证:查看pod的详细信息,是否注入了envoy proxy容器?
提示:我们可以看到pod里除了有nginx镜像,还有一个istio/proxy,这个容器就是istiod注入至nginx pod中,从而实现高级流量管理;至此istio的部署就基本完成;
Service Mesh之Istio基础入门的更多相关文章
- Istio在Rainbond Service Mesh体系下的落地实践
两年前Service Mesh(服务网格)一出来就受到追捧,很多人认为它是微服务架构的最终形态,因为它可以让业务代码和微服务架构解耦,也就是说业务代码不需要修改就能实现微服务架构,但解耦还不够彻底,使 ...
- 转载:Service Mesh:重塑微服务市场--敖小剑
转载地址:https://skyao.io/talk/201805-service-mesh-rebuild-microservice-market/ 重点: 不要太过关注 Service Mesh ...
- Service Mesh简介
1.1 Service Mesh 1.1.1 什么是Service Mesh Service Mesh是最近才兴起的一个名词,最早在2016年9月29日由开发Linkerd的Buoyant公司首次 ...
- Service Mesh 是新瓶装旧酒吗?
点击下载<不一样的 双11 技术:阿里巴巴经济体云原生实践> 本文节选自<不一样的 双11 技术:阿里巴巴经济体云原生实践>一书,点击上方图片即可下载! 作者 | 李云(花名: ...
- 在微服务架构中service mesh是什么?
在微服务架构中service mesh是什么 什么是 service mesh ? 微服务架构将软件功能隔离为多个独立的服务,这些服务可独立部署,高度可维护和可测试,并围绕特定业务功能进行组织. 这些 ...
- OpenShift 4.2 Service Mesh
1.和社区版Istio的区别 OpenShift 4.2的Service Mesh和upstream的Istio项目的增强,除了产品化之外,借用官方文档,区别在于: Red Hat OpenShift ...
- Service Mesh 介绍
传统单体应用的局限性说明 传统单体应用代码体量庞大繁杂,不利于理解,也不利于团队合作开发,更不利于频繁更新和部署,增加服务宕机的风险. 耦合性高,功能代码块之前很容易造成强依赖,只要其中任何一个代码逻 ...
- Istio入门实战与架构原理——使用Docker Compose搭建Service Mesh
本文将介绍如何使用Docker Compose搭建Istio.Istio号称支持多种平台(不仅仅Kubernetes).然而,官网上非基于Kubernetes的教程仿佛不是亲儿子,写得非常随便,不仅缺 ...
- Service Mesh服务网格新生代--Istio(转)
万字解读:Service Mesh服务网格新生代--Istio 官网地址:https://preliminary.istio.io/zh/docs/concepts/security/ Servic ...
- 微服务架构基础之Service Mesh
ServiceMesh(服务网格) 概念在社区里头非常火,有人提出 2018 年是 ServiceMesh 年,还有人提出 ServiceMesh 是下一代的微服务架构基础. 那么到底什么是 Serv ...
随机推荐
- CSS之 font
font:font-style font-weight font-size/line-height font-family的简写.顺序不能乱 **eg ** font:italic bold 30px ...
- 【JavaScript】JS写法随笔(二) JS动态生成表格
主要思路:通过Ajax请求后端接口并拿到结果list之后,然后通过DOM获取tbody并向tbody中添加行.单元格. $("#calculate").click(function ...
- 2月28日Android开发学习
界面显示与逻辑处理 Android Studio利用XML标记描绘应用界面,使用java代码书写程序逻辑. 把App界面设计与代码逻辑分开的好处 使用XML文件描述App界面,可以很方便地在Adroi ...
- ArrayList 的toArray的转换数组方法的注意事项
ArrayList 的toArray的转换数组方法的注意事项 toArray()一共有两个方法 toArray(T[] a) 和toArray() 源码是 进行使用toArray()方法时候,使用 ( ...
- WPF Toolbox 添加image
//public Toolbox() //{ // ItemsControl items = this as ItemsControl; // ...
- SpringBoot系列---【maven项目引入第三方jar包并打包发布】
一.问题 项目中经常会碰到这样的问题,我们做的项目依赖别人打好的jar包,这种我们可以有两种途径解决,第一种是上传到私服,再从我们的项目去引入pom坐标,这种适合有私服账号或者自己会搭建私服的,成本有 ...
- 小白开始成长了+洛谷1488与CF629A Far Relative’s Birthday Cake题解
终于开始我的博客生活了,希望博客可以让我记住学了什么,错了什么,接下来会有什么将出现. 记录写ACM生涯中的一些经验和网工经验吧,如果有人看我博客的话,希望可以留言给我提提意见,指导指导我啦~~~ 正 ...
- 安装 TensorFlow 参考过的资料
anaconda 的新环境创建 https://blog.csdn.net/yandajiangjun/article/details/102615912
- python.字典方法。第三天
当需要为字典中的键设置默认值时,当该键没有任何值时使用它.代码如下 spam={'name':'Pooka','age':'5'} if 'color' not in sapm; spam['colo ...
- LoadRunner性能测试-app压力测试
步骤分为三步: 一,录制脚本 录制脚本原理:启动LR代理服务器监听设置好的端口号是否有请求发送给服务器,有请求时,代理服务器接收请求,并转发给对应的系统服务器,LR从而获取到请求的信息与数据,生成脚本 ...