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的部署就基本完成;