这里vs可以控制往svc1和svc2流量走的比例,但是这里只假设往svc3里面走。现在想控制的是往pod1和pod2各走多少流量。
流量到了svc3的时候还是使用的是kube-proxy对流量进行转发。
了解DR
DR定义的是经过VS之后已经到达service的流量,主要可以用于:
1.定义子集(流量到达了svc3之后,它到底如何区分pod1和pod2呢?对于svc来说如何区分后面的pod就是使用subnet来标记后端的两个pod)
2.定义流量管理
1.LB策略
LB算法
哈希一致性算法
2.连接池(去做熔断的时候需要去定义连接池)
3.异常处理
上面这些都是在dr里面去定义的。
DR的基本用法,定义子集
定义dr的时候,要指定此dr用于在哪个service上的。这里host就需要修改为svc3。也就是经过svc3的流量将会受到dr的控制。
这里定义了两个子集v1 v2,子集的名称是可以自己随意定义的,v1所对应的pod具有标签v1,v2对应的pod具有标签v2。如果按照上面图片上面所定义的就是 v1 run: pod1 v2 run: pod2。
在写vs的时候要指定subset,往svc3去转发的,然后往哪个子集去走呢?这里就需要指定v1 v2。上面就是往同一个svc走,那么就可以有效的管控后面的pod1 pod2走的流量。
如果上面要使用k8s去控制流量,这样就是比较困难的。利用权限来控制流量就很容易实现常用的功能了。比如蓝绿部署,金丝雀发布。
[root@k8s-master dr]# cat pod1.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod1
namespace: istio
labels:
run: pod
version: v1
spec:
containers:
- name: pod
image: nginx
[root@k8s-master dr]# cat pod3.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod3
namespace: istio
labels:
run: pod
version: v3
spec:
containers:
- name: pod
image: nginx
[root@k8s-master vs]# cat svc.yaml
apiVersion: v1
kind: Service
metadata:
name: service-dr
namespace: istio
spec:
ports:
- port: 80
protocol: TCP
targetPort: 80
selector:
run: pod
type: ClusterIP
[root@k8s-master dr]# cat drsubset.yaml
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: mydr
namespace: istio
spec:
host: service-dr
subsets:
- name: v1
labels:
version: v1
- name: v3
labels:
version: v3
[root@k8s-master vs]# cat vs.yaml
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: myvs
namespace: istio
spec:
hosts:
- "cc.rhce.cc"
gateways:
- mygateway
http:
- route:
- destination:
host: service-dr
subset: v1
weight: 50
- destination:
host: service-dr
subset: v3
weight: 50
蓝绿部署
这两套环境可以在同一个svc下面部署,也就是同一个svc下面的不同pod,上面的weigth注意一下一个是0一个是100,即两个环境。这样就很方便从一个环境切换到另外一个环境。
上面就是蓝绿部署,同一个svc挂在了两组pod。不同组的pod具有不同的标签,同时他们还有共同的标签。
或者两套deploy 两套svc。如果是这种话就没有必要使用dr了,直接使用vs就行了。
金丝雀发布
流量管理
要求客户端去访问的时候,是否需要使用tls也就是https的方式去连接。
在使用tls的时候必须指定自己的证书,公钥这些信息。默认不加上这块配置就是disable。
通过这个配置就限定了当pod去访问是必须要使用tls加密。