今天来学习Istio关于流量管理的另一个CRD——DestinationRule,根据字面意思即目标规则,我们可以理解VirtualService为流量的路由,那么DestinationRule则为流量路由之后的去处。
介绍
首先献上官方文档:https://istio.io/latest/zh/docs/reference/config/networking/destination-rule/
样例
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: bookinfo-ratings
spec:
# 含义同VirtualService中destination的host字段一致。
host: ratings.prod.svc.cluster.local
# 流量策略,包括负载均衡、连接池策略、异常点检查等
trafficPolicy:
# 负载均衡策略,支持随机负载均衡 /按权重负载均衡 /最少请求负载均衡 / hash轮训等
loadBalancer:
simple: LEAST_CONN
# 连接池策略
connectionPool:
# tcp连接池设置
tcp:
maxConnections: 100
connectTimeout: 30ms
tcpKeepalive:
time: 7200s
interval: 75s
http:
http2MaxRequests: 1000
maxRequestsPerConnection: 10
# 异常点检查
outlierDetection:
consecutiveErrors: 7
interval: 5m
baseEjectionTime: 15m
# tls设置
tls:
mode: MUTUAL
clientCertificate: /etc/certs/myclientcert.pem
privateKey: /etc/certs/client_private_key.pem
caCertificates: /etc/certs/rootcacerts.pem
# 服务端点集合
subsets:
# subset名称可以用于路由规则中的流量拆分,与virtualService的subset的引用
- name: testversion
# 使用标签对服务注册表中的服务端点进行筛选
labels:
version: v3
trafficPolicy:
loadBalancer:
simple: ROUND_ROBIN
- 作用:我们可以通过结合virtualService,使用 Destination Rule 对流量划分不同的子集,根据不同的条件比如用户不同的身份、地址位置等条件的识别后的进行不同的流量路由,或者在版本更新的时候,使用灰度发布。
- VirtualService对象和DestinationRule对象既可以单独使用、也可以结合使用。功能上VirtualService的功能之一是在后端不同Service中选择一个转发请求,而Service是在后端不同Pod中选择一个转发请求。DestinationRule是对不同后端的同一个Service上进行划分不同的subset。VirtualService和DestinationRule是通过subnet关联起来的。
演示
还是以上次VirtualService的httpd和tomcat例子为演示,首先创建对应的Deployment
httpd
apiVersion: apps/v1
kind: Deployment
metadata:
name: httpd
labels:
server: httpd
app: web
spec:
replicas: 1
selector:
matchLabels:
server: httpd
app: web
template:
metadata:
labels:
server: httpd
app: web
spec:
containers:
- name: busybox
image: busybox
imagePullPolicy: IfNotPresent
command: ["/bin/sh", "-c", "echo 'this is httpd' > /var/www/index.html; httpd -f -p 8080 -h /var/www"]
tomcat
apiVersion: apps/v1
kind: Deployment
metadata:
name: tomcat
labels:
server: tomcat
app: web
spec:
replicas: 1
selector:
matchLabels:
server: tomcat
app: web
template:
metadata:
labels:
server: tomcat
app: web
spec:
containers:
- name: tomcat
image: docker.io/kubeguide/tomcat-app:v1
imagePullPolicy: IfNotPresent
创建对应的service
apiVersion: v1
kind: Service
metadata:
name: web-svc
spec:
selector:
app: web
ports:
- name: http
port: 8080
targetPort: 8080
protocol: TCP
使用DestinationRule根据label将我们的流量划分为不同的版本,假设把httpd为我们服务的v1版本,tomcat为v2版本,使用VirtualService进行不同的路由
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: demo-des
spec:
host: web-svc
subsets:
- name: v1
labels:
server: httpd
- name: v2
labels:
server: tomcat
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: web-svc-vs3
spec:
hosts:
- web-svc
http:
- route:
- destination:
host: web-svc
subset: v2
创建busybox进入测试
apiVersion: apps/v1
kind: Deployment
metadata:
name: hexiaohong-client
spec:
replicas: 1
selector:
matchLabels:
app: hexiaohong-client
template:
metadata:
labels:
app: hexiaohong-client
spec:
containers:
- name: busybox
image: busybox
imagePullPolicy: IfNotPresent
command: ["/bin/sh", "-c", "sleep 3600"]
---
apiVersion: v1
kind: Service
metadata:
name: hexiaohong-client-svc
spec:
selector:
app: hexiaohong-client
ports:
- name: http
port: 8080
targetPort: 8080
protocol: TCP
查看virtualService与DestinationRule
进入busybox 请求
- 使用kubectl edit virtualservices XXX,修改subset的版本为v2,进入busybox请求,流量则导入到v2/tomcat去了