Service Mesh之Istio基础入门 - Linux-1874
source link: https://www.cnblogs.com/qiuhom-1874/p/17281541.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
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的部署就基本完成;
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK