(之后补充)node
Istio核心组件及功能python
Pilotweb
Pilot是Istio主要控制点,Istio流量由Pilot管理由Sidecar执行完成.shell
Mixerjson
主要功能:flask
Mixer中包含多个adapter来处理预检和报告.后端
Citadelapi
早期版本称之为istio-CA,因此它就是用于管理证书的.在集群中启用了服务之间加密后,负责为集群中各个服务在统一CA条件下生成证书,并下发给各个服务中的Sidecar.数组
SideCar(Envoy)安全
核心配置对象
Istio安装过程当中会进行CRD初始化,在k8s集群中注册一系列的CRD.用户利用istio控制微服务间通讯就是经过向k8s提交CRD资源方式完成的.
istio中的资源:
networking.istio.io
流量管理功能的执行者.
如下为最经常使用的对象:
config.istio.io
该对象用于为mixer组件提供配置.Mixer对数据的处理过程以下
Rule:Mixer入口,包含一个match成员和一个逻辑表达式,只有符合表达式判断的数据才会交给action处理.逻辑表达式中变动称为attribute,其中内容来自Envoy提交的数据
Action:将符合入口标准的数据,在用什么方式加工以后,交给哪一个适配器进行处理.
Handler:表明一个适配器实例,用于接收处理后的数据
Instance:用于为进入的数据选择一个模板,并在数据中抽取某些字段做为模板的参数,传输给模板进行处理.
通过Handler实例化以后的Adapter,就具有了工做功能,有自身实现(listcheck,memquota)也有第三方实现(prometheus,datadog).Envoy传出数据将会经过具体的Adapter处理,获得预检结果,或者输出各类监控,日志及跟踪数据.
Template:用于对接收到的数据进行再加工.用户编制模板对象后,通过模板处理原始数据会被转换成符合适配器输入要求的数据格式,就能够在Instance字段中引用.
Mixer管理了全部第三方资源接入,大大扩展了Istio的做用范围,但应用难度系统增高.
authentication.istio.io
用于定义认证策略.在网格级别,命名空间级别以及服务级别都提供了认证策略的要求.要求在内容中包含服务间通讯认证,及基于JWT的终端认证.
rbac.istio.io
用于基于RBAC(基于角色)访问控制系统
环境介绍
对kubernets的环境要求以下:
快速部署Istio
下载过程略
下载安装包解压后,进入 安装目录,将bin目录中的istioctl复制到PATH路径中,而后开始部署istio
kubectl apply -f install/kubernetes/istio-demo.yaml
运行以下命令,查看istio-system namespace中pod启动情况 ,-w 用于持续查询Pod状态的变化
kubectl get pods -n istio-system -w
部署两个版本的服务
#!/usr/bin/env python3 from flask import Flask,request import os import urllib.request app = Flask( name ) @app.route('/env/<env>') def show_env(env) : return os.environ . get(env) @app.route('/fetch') def fetch_env() : url = request.args.get('url','') with urllib.request.urlopen(url) as response: return response.read() if __name__ =="__main__": app.run(host="0.0.0.0",port=80,debug=True)
咱们为这个App建立两个Deployment,将其分别命名为flaskapp-v1,flaskapp-v2,同时建立一个service,命名为flaskapp.
建立flaskapp.istio.yaml
apiVersion: v1 kind: Service metadata: name: flaskapp lables: app: flaskapp spec: selector: app:flaskapp ports: -name: http port: 80 --- apiVersion: extensions/v1beta1 kind: Deployment metadata: name: flaskapp-v1 spec: replicas: 1 template: metadata: lables: app: flaskapp version: v1 spec: containers: name: flaskapp image: distise/flashapp imagePullPolicy: IfNotPresent env: name: version value: v1 --- apiVersion: extensions/v1beta1 kind: Deployment metadata: name: flaskapp-v2 spec: replicas: 1 template: metadata: lables: app: flaskapp version: v2 spec: containers: name: flaskapp image: distise/flashapp imagePullPolicy: IfNotPresent env: name: version value: v2
接下来使用istio进行注入.istioctl,基本做用是修改kubernetes Deployment.在Pod中注入前面提到的Sidecar 容器,并使用管道命令,将yaml文件经过istioctl处理以后 经过管道输出给kubectl.最终提交到Kuernetes集群
istioctl kube-inject -f flask.istio.yaml |kuberctl apply -f -service/flaskapp created #建立以后可看建立出来的Pod kubectl get po -w #也可使用kubectl describe po查看Pod容器 kubectl describe po flaskapp-v1-6647dd84b9-2ndf4
部署客户端服务
验证服务
建立目标规则和默认路由
小结
本章实践了一个较为典型的Istio服务上线流程:注入-->部署-->建立目标规则-->建立默认路由.绝大多数istio网格应用都会遵循这一流程进行上线.
经过前面知识咱们了解到,Istio由多个组件构成,而且能够经过kubectl命令在Kubernetes集群上进行部署,部署时会在Kubernetes集群上建立大量对象,Istio与Kubernetes进行了深度集成,构成Istio的组件都以Deployment形式在Kubernetes中运行,并在运行过程当中所需的配置数据也须要依赖各类CRD及ConfigMap,Secret来进行存储.
这种包含复杂依赖关系的应用部署过程,须要由功能足够强大的模板系统来提供支持,Istio官方推荐使用Helm对istio进行部署.
Istio Chart概述
Istio Chart是一个总分结构,其分级结构和设计结构是一致的.
Chart.yml:chart基础信息文件,包含版本号,名称,关键字等元数据信息.
values-*.yml:
requirements.yaml
该文件用于管理对子Chart的依赖关系,并定义了一系列形状变量.
templates/_affinity.yaml:
生成一组节点新和或互斥元素,供各个组件在渲染yaml时使用,定义一系列变量用于控制Istio组件节点亲和性.
templates/sidecar-injector-configmap.yaml
用于生成一个Configmap对象,在该对象中保存的配置数据被用于进行Sidecar注入.
templates/configmap.yaml:
也生成一个ConfigMap,名称为istio,用于为Pilot提供启动配置数据.
templates.crds.yaml:
包含Istio所需CRD定义,部署方式以下:
charts:
这个目录中的子目录就是Istio的组件:
全局变量介绍
咱们使用Chart时,一般不会修改Chart本体,仅经过对变量的控制来实现对部署过程的定制.Istio Helm Chart提供了大量变量来帮助用户对Istio进行定制.
hub&tag
对内网部署很是有必要,将Istio镜像Pull并推送到私库后,只要在values.yaml修改就能够将Istio所需镜像的引用指向内网私库.
多数状况下这两个变量表明全部镜像地址,具体名称通常{{.Values.global.hub}}/[component]/:{{.Values.global.tag}}拼接而成.
在proxy_init,mixer,grafana,polit的Deployment模板中,一量在其image变量中包含路径符/,则会弃用global.hub,直接采用image的定义
{{- if contains "/".Values.image}} image: "{{.Values.image}}" {{- else}} image: "{{.Values.global.hub}}/{{.Values.image}}:{{.Values.global.tag}}" {{- end}}
ingress.enabled:
用来控制是否启用Istio的Ingress Controller,若是设置为True,就会启用Kubernetes Ingress资源的支持,Istio并不推荐Ingress方式,建议使用Ingress Gateway取代它.
Proxy relation args:
在values.yaml定义了一级proxy变量,用于对Sidecar进行控制
proxy_init.image
网格中的服务Pod在启前,首先会运行一个初始化镜像来完成流量工做,这个变量能够用于指定初始化容器镜像
imagePullPolicy:
镜像摘取策略,default is IfNotPresent
controlPlaneSecurityEnabled
指定是否在Istio控制面组件上启用mTLS通讯.启用后哦组件包括Ingress,Mixer,Pilot,Sidecar
disablePolicyChecks:
设置为True,会禁用Mixer的预检功能.预检功能是一个同步过程,有可能由于预检缓慢形成业务应用的阻塞.
enableTracing:
是否启用分布式跟踪,default is True
mtls.enabled:
服务之间是否默认启用mTLS,若是设置为True,则网格内服务间的通讯 都会使用mTLS进行安全加固.这一设置是全局的,对每一个服务还能够单独使用目标规则或服务注解的方式,自行决定是否采用mTLS加固
imagPullSecrets:
用于为ServiceAccount分配镜像拉取过程当中的所需的认证凭据.默认为空
arch:
在设置Istio组件的节点亲和性过程当中,会使用这个变量的列表内容来肯定可用于部署的节点范围 ,并按照不一样的服务器架构设置了优先顺序,它默认的列表内容以下:
amd64: 2 s390x: 2 ppc64ie: 2
oneNamespace:
默认为false.若是设置为true,则会在Polit的服务发现参数中加入-a,此时Pilot只会对Istio组件所在的命名空间进行监控.
configValidation:
用于配置是否开启服务端的配置验证,默认为true.该选项开启后,会生成一个ValidatingWebhookConfiguration对象,并被包含到Galley配置中,从而启用校验功能.
meshExpansion:
要将服务网格扩展到物理或虚拟机上,会使用到,默认为false.若是设置为true,则会在Ingress Gateway上公开Pilot,Citadel的服务
meshExpansionILB:
是否在内部网状中公开Pilot和Citadel端口,默认为false.
defaultResources:
为全部istio组件都提供一个最小资源限制.默认状况下只设置一个请求10mCPU资源的值,能够在各个Chart局部变量中分别设置资源需求
hyperkube:
priotyClassname
默认为空,可选值包括system-cluster-critical,system-node-critical
crds
该变量用于决定是否包含CRD定义.若是使用helm template,或2.10后的版本helm install ,就将其设置为true.不然在安装以前首先要执行kubectl apply -f install/kubernetes/helm/istio/templates/crds.yaml.并将该变量设置为false.
Istio安装清单的生成和部署
编辑values.yaml
若是是内网部署,首先要解决镜像地址问题,通常在具有外网链接的服务器上拉取所需镜像,而后导出镜像,将其推送到本地私有镜像库,
若是咱们想获取其中使用的镜像名称,就能够用grep方便过滤出来
grep -r image:istio-demo.yaml|egrep -o -e "image:."| sort |uniq
获得这些镜像名称以后,就进行镜像的拉取和推送.根据入私库地址,修改values.yaml中各个镜像地址,生成新的安装清单文件,而后从新用上述命令进行检查.
根据实际状况调整各个组件的资源分配.默认设置是很是保守的.
Istio的istio-ingressgateway服务的默认类型是Loadbalncer,若是在部署的Kubernetes集群中没有lb支持,就须要对服务类型进行修改.
在Istio中包含的Prometheus,Grafana,Kiali等可视化组件,在默认状态下都是ClusterIP类型,要顺利使用,则可能须要为其分配Ingress或者修改服务类型
生成部署清单
使用helm template 生成最终部署清单.
helm template install/kubernetes/helm/listio --name istio --namespace istio-system -f my-values.yaml > my-istio.yaml
命令完成后打开my-istio.yaml文件,检查其中内容是否符合预期.
部署Istio
上面生成的my-istio.yaml是要求部署到istio-system命名空间的,使用命令以下
kubectl create ns istio-system
kubectl apply -f my-istio.yaml
命令运行完成后可用使用命令来查看Pod运行状况,直至所有Pod成功进入Running或Completed状态,Istio安装部署工做就完成了
kubectl get po -n istio-system -w
在网格中部署应用
istioctl kube-inject -f flash.istio.yaml -o flask.istio.injected.yaml
打开文件后发现Deployment对象有很大改变,多出了一个sidecar容器,并出现了一个初始化容器istio-init.
对工做负载的要求
使用自动注入
准备测试应用
略
修改Istio配置
略
使用Istio Dashboard
提供了条形图,饼图,表格,拆线图等丰富的可视化组件.且对其中的数据源和可视化组件均可以二次开发.
启用Grafana
默认未启用grafana.启动命令以下
helm template istio --name istio --set grafana.enabled=true --namespace istio-system > default-grafana.yaml ###### kubectl apply -f default-grafana.yaml
访问Grafana
kubectl -n istio-system port-forward $(kubectl -n istio-system get pod -l app=grafana -o jsonpath-'{.items[0].metadata.name}') 3000:3000 &
接下来打开 browser,type http://localhost:3000/ ,单击左上角Home连接.打开Istio内置的Dashboard.
开放Grafana服务
kubectl端口转发方式不是很稳定,要长期使用的话,对grafana进行定制.
security.enabled=true并设置用户名和密码.
使用Prometheus
访问prometheus
默认是开启的.
开放prometheus服务
prometheus的Service经过values.yaml定制对服务开放方式
学习和定制
略
使用Jaeger
用于分布式跟踪的开源软件.提供了原生的OpenTracing支持,向下兼容Zipkin,同时支持多种存储后端.
启用Jaeger
默认未启用
helm template istio --name istio --set tracing.enabled=true --namespace istio-system > default-tracing.yaml ######### kubectl apply -f default-tracing.yaml ######### kubectl get po -w istio-system
访问Jaeger:
kubectl -n istio-system port-forward $(kubectl -n istio-system get pod -l app=jaeger -o jsonpath='{.items[0].metadata.name}') 16686:16686
browser,type
跟踪参数的传递:
(之后有时间再补充)
开放Jaeger服务
使用Kiali
是用于Istio可视化软件,它除了提供监控,可视化及跟踪外还提供了Iistio配置验证,健康评估等高级功能
启用kiali
将kiali.enabled:true便可
访问kiali
kubectl -n istio-system port-forward $(kubectl -n istio-system get pod -l app=kiali -o jsonpath='{.items[0].metadata.name}') 20001:20001
browser,type http://localhost:20001
tips:default username,password is admin:admin.
开放kiali服务
参考jaeger.
定义目标规则
当Kubernetes访问一个服务时,须要指定其协议,服务名和端口,Istio的服务网格中对服务进行了进一步抽象
Kubernetes中,Service和Deployment或其余工做负载关系是一对一.以下图所示:
而在Istio中,Service常常会对应不一样的Deployment,以下图所示:
定义默认路由
Istio建议为每一个服务都建立一个默认路由,在访问某一服务时若是没有特定的路由规则,则使用默认路由规则来访问指定的子集,以此来确保服务在默认状况下的行为稳定性.
流量的拆分和迁移
经过设置权重来拆分流量
若是不声明权重,其默认为100
流量分配是有权重的,且权重总和必须是100
金丝雀部署
定义:
根据来源服务进行路由
根据不一样版本的服务访问不一样版本的目标服务.
在上面的VirtualService定义里,用sourceLabels对来源路由进行了匹配.
对URI进行重定向
根据URL进行重定向对目标路由进行分流 .
通讯超时控制
故障重试控制
入口流量管理
Kubernetes为第三方厂商提供了Ingress Controler规范,用于入站流量管理.而Istio推出了Gateway,用于在网络边缘进行入站和出站的流量管理.
Ingress Gateway在逻辑上是至关于网络边缘上的一个负载均衡器,用于接收和处理网格边缘出站和入门的网络链接.
在前面流量管理中使用VirtualService对象,都默认包含gateways字段,若是没有指定,则默认值为:mesh.全部网格内部服务间互相通讯,都是经过这个网关进行的.若是要对外提供服务,须要定义Gateway对象,并在gateways字段中进行赋值.一量在gateways中填写了mesh以外的对象名称,就要继续对内部通讯进行流量控制,并必须显式地将内置的mesh对象名称也加入列表中.
使用Gateway开放服务
apiVersion:networking.istio.io/v1alpha3 kind:Gateway metadata: name: example-gateway spec: selector: istio: ingressgateway servers: port: number: 80 name: http protocol: HTTP hosts: "*.microservice.rocks" "*.microservice.xyz"
selector其实是一个标签选择器,用于指定哪些Gateway Pod负责这个Gateway对象的运行
hosts字段用了一个通配符来指明这个gateway可能要负责的主机名.可使用kubectl get svc -n istio-system istio-ingressgateway 查看该服务的IP,并将测试域名映射这个IP
将配置文件提交给Kubernetes集群
kubectl apply -f example.gateway.yaml ############ http flaskapp.microservice.rocks
访问结果是404.回来发现并无指定负责响应请求的服务.咱们须要对路由规则进行修改
为Gateway添加证书支持
使用过程当中能够直接查如何使用,此处略
为Gateway添加多个证书支持
使用过程当中能够直接查如何使用,此处略
配置入口流量的路由
使用过程当中能够直接查如何使用,此处略
出口流量管理
默认状况下网格内部没法对外网网络请求,但Istio提供了如下几种方式用于网格外部通讯
设置Sidecar的流量劫持范围
流量支持由istio-init容器完成.
设置ServiceEntry
能够为外部服务设置ServiceEntry,至关于外部服务在网格内部进行了注册,相对于使用CIDR白名单方式,这种方式让Istio对外部访问有了更大的管理能力.
新建Gateway控制器
略
设置服务熔断
故障注入测试
微服务测试过程当中,每每须要对网络故障场景进行模拟,Istio提供了如下两种故障注入能力:
流量复制
导入markdown文件时,图片丢失,请下载附件PDF文件查看.