Istio系列学习----Istio的路由规则配置:VirtualService
Posted 归来少年Plus
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Istio系列学习----Istio的路由规则配置:VirtualService相关的知识,希望对你有一定的参考价值。
VirtualService是istio流量治理的核心配置.
一、路由规则配置示例
含义:对于forecast服务的访问,如果在请求的Header中location取值是north,则将该请求转发到服务的v2版本上,其他请求转发到服务的v1版本上。
二、路由规则定义
virtualService:用于定义对特定目标服务的一组流量规则。描述一个具体的服务对象,包含了对流量的各种处理。
virtualService中的术语:
service:服务
service version:服务版本
source: 发起调用的服务
host: 服务调用方连接和调用目标服务时使用的地址
VirtualService的1级定义,包括通用字段hosts、gateways,复合字段HttpRoute、TCPRoute、TLSRoute,表示istio支持的http\\TCP\\TLS协议的流量规则。
hosts和gateways是每种协议都要用到的公共字段。
1、hosts
必选,表示流量发送的目标。用于匹配访问地址,可以是一个DNS名称或IP地址。
DNS可以使用通配符前缀,也可以使用短域名。但是建议在规则中明确写完整的域名。
对k8s平台来说,hosts中一般是Service的短域名。如forecast对应的完整域名是:forecast.weather.svc.cluster.local,其中weather是forecast服务部署的命名空间。
isito中,hosts的全域名是 forecats.default.svc.cluster.local。其中命名空间default是virtualService的命名空间,不是Service的命名空间。
2、gateways
标识应用这些流量规则的gateway。VirtualService描述的规则可以作用到网格里的Sidecar和入口处的Gateway。具体场景如下:
1)服务仅在网格内访问,规则也仅作用于网格内的sideCar。此时gateways字段可以省略。
2)服务仅在网格外访问,需要配置关联的Gateway,对应gateway进来的流量执行在这个VirtualService上定义的规则。
3)服务在网格内核网格外都要访问,那对gateways数组字段至少配置两个元素,一个是是外部访问的gateway,另一个是保留关键字”mesh“。
3、http
用于处理http的流量,是一个与HTTPRoute类似的路由集合
4、tls
用于处理非终结的TLS和HTTPS的流量,是一个TLSRoute类型的路由集合。
5、tcp
用于处理TCP的流量,所有其他非HTTP和TLS端口的流量,是一个TCPRoute类型的路由集合
注意:http tls tcp3各字段在定义上都是数组,可以定义多个元素;使用上都是一个有序列表,应用时匹配的第一个规则生效。不会检查后面的规则
6、exportTo
新增字段,控制VirtualService跨命名空间的可见性,即VirtualService是否可以被其他命名空间下的sidecar和Gateway使用。
默认全局可见。 .表示仅应用到当前命名空间, *表示应用到所有的命名空间。
三、HTTP路由(HttpRoute)
1、HTTPRoute
http是当前最通用、内容最丰富的协议。除了可以路由,还可以进行如:重定向、重写、重试、流量镜像、故障注入、跨资源共享等操作。
实际的协议包括:http http2 grpc
2、http的配置规则
支持将uri schema method authority port等作为条件来匹配。
URI 的完整格式是:URI=scheme:[//authority]path [?query][#fragment]
Authority的标准定义是:“authority=[userinfo@]host[:port]
具体匹配规则:
1)uri schema method authority都是StringMatch类型,在匹配时支持extract-全部匹配、prefix-前缀匹配、regex-正则匹配
2)headers map类型,也可以采用全部、前缀、正则三种方式匹配。
匹配headers中source取值为north,并且uri以/advertisement开头的请求
3)port 请求的服务端口
4)sourcelabels map类型的键值对,标识请求来源的负载匹配标签。可以对一组服务都打一个相同的标签,然后使用sourceLabels字段对这些服务试试相同的流量规则。
k8s平台中,label就是pod上的标签。
标识请求来源是frontend服务的v2版本负载。
5)gateways:规则应用的gateway名称
匹配逻辑:HTTPMatchRequest中多个match是或的关系,
某个match中的诸多属性如uri、 headers、method等是“与”逻辑,而属性数组中几个元素间的关系是“或”逻辑。
match有两个,其条件的语义是:headers中的source取值 为“north”,并且uri以“/advertisement”开头的请求,或者uri以“/forecast”开头的请求。
在生产环境运行Istio
我们部署服务的一个新版本。
取决于sidecar容器的注入类型,在配置阶段添加istio-init容器和istio-agent容器(Envoy),或者手动插入到Kubernetes实体的Pod描述里。
istio-init容器是一些脚本,为Pod设置iptables规则。有两种方式配置流量重定向到istio-agent容器里:使用直接的iptables规则或者TPROXY[2]。撰写本文时,默认使用的是重定向规则。在istio-init里,可以配置截获哪些流量并发送给istio-agent。比如,为了截获所有入站和出站流量,用户需要将参数 -i和 -b设置为 *。用户也可以指定截获特定端口的流量。为了避免截获特定子网的流量,可以使用 -x参数。
在init运行后,会启动容器,包括pilot-agent(Envoy)。它通过GRPC连接上已经部署的Pilot,得到集群内所有已有服务以及路由策略的信息。根据接收到的数据,它配置集群,将这些流量直接映射到Kubernetes集群里的应用程序端口。重要的地方是:Envoy动态配置监听器(IP,端口对)开始监听。因此,当请求进入Pod,并且使用iptables规则重定向到sidecar时,Envoy已经准备好处理这些连接,并且知道将这些代理流量转发到哪里去。这一步里,信息发送给Mixer,下文会详细介绍。
服务1发送请求给服务2
在已有的服务1里,请求重定向到sidecar
Sidecar Envoy监控到给服务2的请求,并准备所需信息
然后它使用Report请求发送给istio-telemetry。
Istio-telemetry决定是否将Report发送给后台,这里也负责发送请求以及请求内容。
apiVersion: v1
kind: ConfigMap
metadata:
name: istio
namespace: istio-system
labels:
app: istio
service: istio
data:
mesh: |-
# disable tracing mechanism for now
enableTracing: false
# do not specify mixer endpoints, so that sidecar containers do not send the information
#mixerCheckServer: istio-policy.istio-system:15004
#mixerReportServer: istio-telemetry.istio-system:15004
# interval for envoy to check Pilot
rdsRefreshDelay: 5s
# default config for envoy sidecar
defaultConfig:
# like rdsRefreshDelay
discoveryRefreshDelay: 5s
# path to envoy executable
configPath: "/etc/istio/proxy"
binaryPath: "/usr/local/bin/envoy"
# default name for sidecar container
serviceCluster: istio-proxy
# time for envoy to wait before it shuts down all existing connections
drainDuration: 45s
parentShutdownDuration: 1m0s
# by default, REDIRECT rule for iptables is used. TPROXY can be used as well.
#interceptionMode: REDIRECT
# port for sidecar container admin panel
proxyAdminPort: 15000
# address for sending traces using zipkin protocol (not used as turned off in enableTracing option)
zipkinAddress: tracing-collector.tracing:9411
# statsd address for envoy containers metrics
# statsdUdpAddress: aggregator:8126
# turn off Mutual TLS
controlPlaneAuthPolicy: NONE
# istio-pilot listen port to report service discovery information to sidecars
discoveryAddress: istio-pilot.istio-system:15007
initContainers:
- name: istio-init
args:
- -p
- "15001"
- -u
- "1337"
- -m
- REDIRECT
- -i
- '*'
- -b
- '*'
- -d
- ""
image: istio/proxy_init:1.0.0
imagePullPolicy: IfNotPresent
resources:
limits:
memory: 128Mi
securityContext:
capabilities:
add:
- NET_ADMIN
- name: istio-proxy
command:
- "bash"
- "-c"
- |
exec /usr/local/bin/pilot-agent proxy sidecar
--configPath
/etc/istio/proxy
--binaryPath
/usr/local/bin/envoy
--serviceCluster
service-name
--drainDuration
45s
--parentShutdownDuration
1m0s
--discoveryAddress
istio-pilot.istio-system:15007
--discoveryRefreshDelay
1s
--connectTimeout
10s
--proxyAdminPort
"15000"
--controlPlaneAuthPolicy
NONE
env:
- name: POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
- name: POD_NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
- name: INSTANCE_IP
valueFrom:
fieldRef:
fieldPath: status.podIP
- name: ISTIO_META_POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
- name: ISTIO_META_INTERCEPTION_MODE
value: REDIRECT
image: istio/proxyv2:1.0.0
imagePullPolicy: IfNotPresent
resources:
requests:
cpu: 100m
memory: 128Mi
limits:
memory: 2048Mi
securityContext:
privileged: false
readOnlyRootFilesystem: true
runAsUser: 1337
volumeMounts:
- mountPath: /etc/istio/proxy
name: istio-envoy
CIDR Pod和Service CIDR必须在所有集群里都是唯一的,不能重叠。
集群间的任意Pod CIDR必须能够访问所有CIDR Pod。
所有Kubernetes API server都必须能够相互访问。
https://istio.io/docs/concepts/
https://www.envoyproxy.io/
https://github.com/kristrev/tproxy-example/blob/master/tproxy_example.c
https://istio.io/docs/concepts/policies-and-telemetry/overview/
https://github.com/istio/istio/blob/release-1.0/install/kubernetes/helm/istio/charts/pilot/templates/deployment.yaml
https://github.com/istio/istio/tree/release-1.0/install/kubernetes/helm/istio/charts/pilot/templates
https://istio.io/docs/setup/kubernetes/multicluster-install/
以上是关于Istio系列学习----Istio的路由规则配置:VirtualService的主要内容,如果未能解决你的问题,请参考以下文章