(以后补充)
Istio核心组件及功能
Pilot
Pilot是Istio主要控制点,Istio流量由Pilot管理由Sidecar执行完成.
Mixer
主要功能:
Mixer中包含多个adapter来处理预检和报告.
Citadel
早期版本称之为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/')
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
默认是开启的.
http://localhost:9090
开放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
http://127.0.0.1:16686
跟踪参数的传递:
(以后有时间再补充)
开放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文件查看.
http://down.51cto.com/data/2459723
转载于:https://blog.51cto.com/8745668/2366184