Service Mesh之Istio基础入门

  技术背景

  分布式服务治理

  所谓分布式服务治理就是对服务不断增长的复杂度的管控和管理;管控及管理包含网络拓扑变动、网络延时、通信安全、API网关、服务注册和发现、服务熔断容错、服务超时重试、服务部署、数据调用、分布式链路追踪等等;

  服务治理历程

  第一代服务治理(内嵌应用程序中)

  提示:第一代服务治理能力的代码是内嵌在业务代码中,即所有的服务治理功能需要程序员自己编写;典型技术:SOA、ESB;这种服务治理的优势就是简单使用依赖少;劣势是代码耦合,重复性较高,运维复杂,解耦差,开发要求高;

  第二代服务治理(统一抽象成SDK)

  提示:第二代服务治理是把服务治理能力抽象到统一SDK实现,开发人员可以根据SDK中的api来写业务代码,从而使对应业务具有服务治理的功能;典型技术:Spring Cloud、Dubbo等;这种服务治理的优势是代码重复少,治理逻辑代码和业务代码分开;劣势是SDK语言绑定,代码侵入;基于SDK开发学习门槛较高;系统改造代价大,治理能力升级影响用户业务(即SDK升级,会导致业务代码的升级);

  第三代服务治理(统一到Sidecar)

  提示:第三代服务治理能力统一到服务网格上;即服务治理的能力,通过在业务代码周边运行一个独立的sidecar来完成;程序员只需要关注自己的业务代码的开发,服务治理能力就交给sidecar服务网格来完成;第三代服务治理的优势是独立进程,用户业务非侵入,开发和语言无关(只要能够完成对应的业务功能,用什么语言都可以);治理逻辑升级对业务没有影响;可以渐进的微服务化;劣势就是性能和资源的开销;

  服务网格(Service Mesh)
  服务网格概念源于Buoyant公司的CEO Willian Morgan的文章“What's a service mesh? And do I need one?”;是指专注于处理服务间通信的基础设施,它负责在现代云原生应用组成的复杂拓扑中可靠地传递请求;治理模式除了处理业务逻辑的相关功能外,每个微服务还必须实现此前单体应用模型中用于网络间通信的基础功能,甚至还包括分布式应用程序之间的通信环境中应该实现的其它网络功能,例如熔断、限流、应用跟踪、指标采集、服务发现和负载均衡等;
  服务网格的基本功能
  控制服务间通信: 熔断、重试、超时、故障注入、负载均衡和故障转移等;
  服务发现:通过专用的服务总线发现服务端点;
  可观测:指标数据采集、监控、分布式日志记录和分布式追踪;
  安全性:TLS/SSL通信和密钥管理;
  身份认证和授权检查:身份认证,以及基于黑白名单或RBAC的访问控制功能;
  部署:对容器技术的原生支持,例如Docker和Kubernetes等;
  服务间的通信协议:HTTP 1.1、HTTP 2.0和gRPC等;
  健康状态检测:监测上游服务的健康状态;
  Service Mesh的雏形

  提示:在微服务体系架构中,我们为每个服务都使用一个专用的代理Sidecar来完成高级网络功能;各服务间仅通过Sidecar代理互相通信,各个代理代理之间形成一个网状网络,2017年,William为其创建一个专用的定义,并称之为Service Mesh;

  提示:新一代服务网格架构分为控制平面和数据平面两个部分;数据平面触及系统中的每个数据包或请求,负责服务发现、健康检查、路由、负载均衡、身份验证/授权和可观测性等;控制平面主要为网格中的所有正在运行的数据平面提供策略和配置,从而将所有数据平面联合构建为分布式系统,它不接触系统中的任何数据包或请求;控制平面负责的任务包括例如确定两个服务Service X到Sevice Y之间的路由,Service Y相关集群的负载均衡机制、断路策略、流量转移机制等,并将决策下发给Service X和Service Y的Sidecar;

  控制平面组件

  工作负载调度程序:借助于底层的基础设施(例如kubernetes)完成服务及其Sidecar运行位置的调度决策;
  服务发现:服务网格中的服务发现;
  Sidecar代理配置API:各Sidecar代理以最终一致的方式从各种系统组件获取配置;
  控制平面UI:管理人员的操作接口,用于配置全局级别的设置,例如部署、身份认证和授权、路由及负载均衡等;
  Service Mesh解决方案极大降低了业务逻辑与网络功能之间的耦合度,能够快捷、方便地集成到现有的业务环境中,并提供了多语言、多协议支持,运维和管理成本被大大压缩,且开发人员能够将精力集中于业务逻辑本身,而无须再关注业务代码以外的其它功能;一旦启用Service Mesh,服务间的通信将遵循以下通信逻辑;
  1、微服务彼此间不会直接进行通信,而是由各服务前端的称为Service Mesh的代理程序进行;
  2、Service Mesh内置支持服务发现、熔断、负载均衡等网络相关的用于控制服务间通信的各种高级功能;
  3、Service Mesh与编程语言无关,开发人员可以使用任何编程语言编写微服务的业务逻辑,各服务之间也可以使用不同的编程语言开发;
  4、服务间的通信的局部故障可由Service Mesh自动处理;
  5、Service Mesh中的各服务的代理程序由控制平面(Control Plane)集中管理;各代理程序之间的通信网络也称为数据平面(Data Plane);
  6、部署于容器编排平台时,各代理程序会以微服务容器的Sidecar模式运行;
  服务网格和K8S间的关系

  提示:k8s主要负责解决容器编排与调度的问题,本质上是应用程序生命周期工具,为服务网格提供基础支撑;Service Mesh 主要解决分布式应用间的通信问题,本质上服务通信治理工具,是k8s在网络功能方面的扩展和延伸;

  Istio是什么?

  Istio是Envoy Data Plane的控制平面实现之一,Istio是一个开源的独立服务网格,可为用户成功运行分布式微服务架构提供所需的基础设施;Istio可以轻松创建带有负载均衡、service-to-service的身份认证、细粒度的可观测性等功能的服务网格,而应用程序代码却无须或很少为些而作出改变;通过在整个服务环境中为每一个应用部署一个特殊的Sidecar形式的Proxy拦截各服务之间的所有网络通信,并由控制平面Istio进行配置和管理,进而为服务无侵入式添加如下功能;
  1、HTTP、gRPC、WebSocket和TCP通信的自动负载均衡;
  2、通过丰富的路由规则、重试、故障转移和故障注入对流量进行细粒度控制;
  3、支持访问控制、速率限制和配额的可插拔的策略层及配置API;
  4、集群内所有流量的自动度量、记录日志和分布式跟踪跟踪,包括集群的入口和出口;
  5、强大身份验证和授权,以及在群集中进行安全的服务间通信;
  在kubernetes环境中,服务网格就像一个仪表板,用于解决问题、执行流量策略、分配限制和测试代码,它允许一个中央节点来监视、跟踪和控制所有服务之间的交互;
  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的部署就基本完成;

posted @ 2023-04-03 19:05  Linux-1874  阅读(532)  评论(0编辑  收藏  举报