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 ...
随机推荐
- iOS学习十一之步进控制器UIStepper
步进控制器也就是进行离散式数据调节的常用视图控件. 在viewDidLoad()方法中加入下面的方法,即可完成基本功能. override func viewDidLoad() { super.vie ...
- CORS预检
CORS是一种常见的跨域机制,一般由服务端提供一个Access-Control-Allow-Origin头来解决问题,但是这仅对一些"简单请求"有效.那么何谓"简单请求& ...
- 狐漠漠养成日记 Cp.00000 前言
前言 狐漠漠是我的常用网名,来源是因为我非常非常非常喜欢耳廓狐(也称作沙漠狐),所以我就给自己拟造了一个名叫狐漠漠的虚拟形象(如下图所示). 设定上是女孩子因为我想当女孩子但是我不是所以我就在设定上满 ...
- vm 16 player安装与网络配置
1.密钥: FA1M0-89YE3-081TQ-AFNX9-NKUC0 2.安装步骤: xshell6,要先右键管理员运行绿化.bat,再双击.exe 3.一般的虚拟机,需要win上的v8适配器的ip ...
- nodejs路由
Router与route: Route是一条路由: 如:/users - - > 调用 getAllUsers()函数 /users/count/ - - > 调用 getUsersCou ...
- hdu:排列组合(指数型母函数)
Problem Description有n种物品,并且知道每种物品的数量.要求从中选出m件物品的排列数.例如有两种物品A,B,并且数量都是1,从中选2件物品,则排列有"AB",&q ...
- leetcode用例导入数据库(PHP实现) import leetcode json case into database
<?php // 换成你自己的json $str = '{"headers":{"student":["name","con ...
- 单调栈应用--视野总和 go版本
1.视野总和描叙:有n个人站队,所有的人全部向右看,个子高的可以看到个子低的发型,给出每个人的身高,问所有人能看到其他人发现总和是多少.输入:4 3 7 1输出:2解释:个子为4的可以看到个子为3的发 ...
- Windows10常用快捷键总结
--Windows10常用快捷键总结 1. Window键: 打开或关闭|开始菜单 2. Win + A 打开操作中心 3. Win + D 显示桌面 4. Win + E 打开计算机文件管理器 5. ...
- CSS网页布局基础
CSS网页布局基础1.行布局-基础的行布局-行布局自适应-行布局自适应限制最大宽-行布局垂直水平居中-行布局某部位自适应-行布局固定宽-行布局导航随屏幕滚动2.多列布局-两列布局固定-两列布局自适应- ...