目录
Gateway(gw)
VirtualService(vs)
DestinationRule(dr)
ServiceEntry(se)
sidecar注入以及流量劫持
sidecar注入过程
sidecar注入原理
sidecar注入结果
istio中gateway资源可以将网格内部的服务暴露给网格外部的服务,供网格外部的服务调用,该资源描述了需要公开的端口、端口的协议类型、以及域名等。
下面是服务的gw资源配置文件示例。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
selector标明了该gateway选择用的pod,ingressgateway实际上是一个istio-proxy,这里gateway用label关联了istio的ingressgateway。
我们可以用命令查找出该pod:
|
我们查看该pod的配置,发现该pod有一个container,名称为istio-proxy,该服务负责从网格外转发请求到网格内。
istio-proxy实际上是envoy + 管理envoy的父进程pilot-agent。
|
virtualService用来与Gateway绑定,实现服务访问路由控制、服务版本与流量的控制。
下面是服务的vs配置示例:
|
协议支持:
http协议流量规则:
外部请求经过VirtualService的路由规则后,如果目标服务设置了dr,那么dr配置的目标服务策略会生效。
下面是服务的dr配置示例:
|
trafficPolicy是对于服务pod的流量规则,比较重要的如loadBalancer、connectionPool、outlierDetection
http connectionPool规则:
outlierDetection可实现异常点检测与熔断:
subset描述了服务的子集,该子集由带有标签(version: v2)的pod组成,不同的子集也可以设置不同的trafficPolicy,如下面的例子,默认lb策略是least_conn,而v3版本则是轮询策略。
|
功能:
机制:
sidecar模式:
Sidecar 连接到父应用并且为其添加扩展或者增强功能。
使用sidecar的优势:
在创建namespace lyl时,我们使用了istio的自动注入:
|
注入以后,我们看下namespace的配置,多了一个label,istio-injection=enable
sidecar注入依赖于Kubernetes 的准入控制器。
来自 Kubernetes 文档:
准入控制器是一段代码,会拦截 Kubernetes API Server 收到的请求,拦截发生在认证和鉴权完成之后,对象进行持久化之前。可以定义两种类型的 Admission webhook:Validating 和 Mutating。Validating 类型的 Webhook 可以根据自定义的准入策略决定是否拒绝请求;Mutating 类型的 Webhook 可以根据自定义配置来对请求进行编辑。
简单来说,sidecar的注入是在api-server接收到deployment pod的请求之后,写入etcd之前做的事情。
对于 sidecar 自动注入,Istio 依赖于 Mutating Admission Webhook
。让我们来看看 istio-sidecar-injector
中的配置详情。
kubectl get mutatingwebhookconfiguration istio-sidecar-injector -o yaml
|
在配置文件中,我们看到有namespaceSelector配置,matchLabels表明如果namespace满足有label:istio-injection=enable(上面截图可以看到我们的namespace lyl已经满足这个条件),并且满足下面列的rules:v1 version,且动作是pod的创建,那么mutatingWebhook会执行istio-sidecar-injector这个service,给创建的pod注入配置。
sidecar注入以后,查看服务启动的pod信息
可以看到,每个pod都有两个ready的容器,一个是我们的服务容器,另一个就是sidecar容器。
查看下第一个pod具体的配置信息:
|
发现有两个containers,具体展开可以看到一个是我们自己服务的容器,第二个是istio-proxy容器,也就是sidecar容器,之前说到istio-proxy实际上是pilot-agent + envoy两个父子进程,pilot负责管理envoy,所以实际上服务的sidecar就是envoy。
同时,在配置下方,我们还发现了另一个container,叫作istio-init container,这个init容器在pod初始化时创建,pod初始化完成就自动销毁了,从配置的command中可以看出,init容器主要用来创建iptables规则。istio-iptables的代码位于istio代码仓库的tools/istio-iptables目录。
所以,Istio 给应用 Pod 注入的配置主要包括:
istio-init
:用于 pod 中设置 iptables 端口转发。istio-proxy
:运行 sidecar 代理,即envoy。iptables注入解析(以下iptables规则引用自这里,本文不在详述):
|
参考资料:
https://jimmysong.io/blog/sidecar-injection-iptables-and-traffic-routing/
https://istio.io/zh/docs/reference/config/networking/destination-rule/#OutlierDetection