



5.2 常用资源类型 |
|
流量控制资源有:DestinationRule、VirtualService、Gateway、ServiceEntry、EnvoyFilter,主要用于控制服务的路由,控制集群出入口的流量等功能。下面分别介绍。
(1)DestinationRule
DestinationRule定义了流量路由规则匹配后流量的访问策略。在这些策略中可以定义负载均衡、连接池大小,以及负载均衡池中不健康实例的探测和实例的摘除规则等。示例如下:
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: reviews-destination
spec:
host: reviews.prod.svc.cluster.local
subsets:
- name: v1
labels:
version: v1
- name: v2
labels:
version: v2
(2)VirtualService
VirtualService定义了一系列的流量路由规则,将流量路由到指定的目标服务或者目标服务的子版本。示例如下:
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: reviews-route
spec:
hosts:
- reviews.prod.svc.cluster.local
http:
- match:
- uri:
prefix: "/wpcatalog"
- uri:
prefix: "/consumercatalog"
rewrite:
uri: "/newcatalog"
route:
- destination:
host: reviews.prod.svc.cluster.local
subset: v2
- route:
- destination:
host: reviews.prod.svc.cluster.local
subset: v1
(3)Gateway
Gateway用于配置服务网格流量的边界负载均衡器,负责接收进入服务网格和流出服务网格的HTTP/TCP连接。用于定义一系列应该开放的端口及其协议。示例如下:
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: bookinfo-gateway
spec:
selector:
istio: ingressgateway # use istio default controller
servers:
- port:
number: 80
name: http
protocol: HTTP
hosts:
- "*"
(4)ServiceEntry
ServiceEntry用于添加额外的注册条目到Istio内部的注册中心,以此来满足服务网格里自动发现的服务访问或者路由到这些手动指定的服务,这可以把外部服务导入网格内部。示例如下:
apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:
name: external-svc-mongocluster
spec:
hosts:
- mymongodb.somedomain # not used
addresses:
- 192.192.192.192/24 # VIPs
ports:
- number: 27018
name: mongodb
protocol: MONGO
location: MESH_INTERNAL
resolution: STATIC
endpoints:
- address: 2.2.2.2
- address: 3.3.3.3
(5)EnvoyFilter
EnvoyFilter描述了Envoy代理特有的过滤配置,这些配置可用于定制Envoy代理,改变Istio配置的Envoy代理的行为。使用这个特性时要非常的小心,因为错误的配置可能会破坏整个服务网格的稳定性。示例如下:
apiVersion: networking.istio.io/v1alpha3
kind: EnvoyFilter
metadata:
name: httpbin
spec:
workloadLabels:
app: httpbin
filters:
- listenerMatch:
portNumber: 8000
listenerType: SIDECAR_INBOUND
filterName: envoy.lua
filterType: HTTP
filterConfig:
inlineCode: |
function envoy_on_request(request_handle)
request_handle:headers():add("X-Foo", "bar")
end
function envoy_on_response(response_handle)
body_size = response_handle:body():length()
response_handle:headers():add("X-Response-Body-Size", tostring(body_size))
end
请求配额可以对服务请求进行限流配置:
·Quota——指定用于配额限制的数据维度。可以理解为需要从请求中提取的信息及其提取规则,如:源地址、目标地址、目标版本等。示例如下:
apiVersion: "config.istio.io/v1alpha2"
kind: quota
metadata:
name: requestcount
namespace: istio-system
spec:
dimensions:
source: request.headers["x-forwarded-for"] | "unknown"
destination: destination.labels["app"] | destination.service | "unknown"
destinationVersion: destination.labels["version"] | "unknown"
·Redisquota——基于Redis实现的具体Quota,使用Quota定义的规则进行数据维度提取,指定具体的维度来进行配额。
·Memquota——基于内存实现的具体Quota,使用Quota定义的规则进行数据维度提取,指定具体的维度来进行配额。
·Quotaspec——定义指定Quota配额标准,例如:每次请求计数加1,或者每次请求计数加2,可以方便地用于限流、计费等场景。
·Quotaspecbinding——把Quotaspec和具体的Service相绑定。
·Rule——把配置的Instance对象传递给Handler来处理,在配额功能中使用时,负责绑定Quota和具体Quota实现,把Quota对象传递给具体的Quota进行处理。
mTLS认证策略包括:MeshPolicy、Policy,主要用于服务间的流量加密和认证。
(1)MeshPolicy
MeshPolicy定义了全局的mTLS认证策略,这个资源的定义只能有一个实例。示例如下:
apiVersion: authentication.istio.io/v1alpha1
kind: MeshPolicy
metadata:
name: default
spec:
peers:
- mtls: {}
(2)Policy
Policy用于配置命名空间或者服务的mTLS认证策略。示例如下:
apiVersion: authentication.istio.io/v1alpha1
kind: Policy
metadata:
name: service-go
spec:
targets:
- name: service-go
peers:
- mtls: {}
---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: service-go
spec:
host: "service-go.default.svc.cluster.local"
trafficPolicy:
tls:
mode: ISTIO_MUTUAL
RBAC访问权限包括:ServiceRole、ServiceRoleBinding、RbacConfig,主要用于服务间的细粒度访问控制。
(1)ServiceRole
ServiceRole用于定义一系列的服务访问控制权限,示例如下:
apiVersion: "rbac.istio.io/v1alpha1"
kind: ServiceRole
metadata:
name: products-viewer
namespace: default
spec:
rules:
- services: ["products.svc.cluster.local"]
methods: ["GET", "HEAD"]
constraints:
- key: "destination.labels[version]"
value: ["v1", "v2"]
(2)ServiceRoleBinding
ServiceRoleBinding给ServiceRole分配一系列的授权对象,示例如下:
apiVersion: "rbac.istio.io/v1alpha1"
kind: ServiceRoleBinding
metadata:
name: test-binding-products
namespace: default
spec:
subjects:
- user: alice@yahoo.com
- properties:
source.namespace: "abc"
roleRef:
kind: ServiceRole
name: "products-viewer"
(3)RbacConfig
RbacConfig定义全局配置,用来控制Istio RBAC的行为,这个资源的定义只能有一个实例,示例如下:
apiVersion: rbac.istio.io/v1alpha1
kind: RbacConfig
metadata:
name: default
spec:
mode: 'ON_WITH_INCLUSION'
inclusion:
namespaces:
- default