无论是vs还是dr这些都是入口的流量。对于pod来说也会有出去的流量的。
除了对进来的流量做有效的控制之外,其实也可以控制出去的流量。istio-egress是出口网关,pod出去的时候要经过egress-gateway到达外界的某个终端。
hosts: - www.baidu.com 这个是pod要访问的服务器。pod里面设置的是dnsPolicy:clusterFirst,它的意思就是优先使用集群里面的dns,这个也就是kube-system命名空间下面的coredns了,location: MESH_EXTERNAL这个意思hosts是在网格之外的主机。
- MESH_EXTERNAL -- 网格外部 控制去往网格外部的流量,百度就是网格之外的流量了
- MESH_INTERNAL -- 网格内部 控制到网格内部某个主机的流量。
[root@k8s-master se]# cat se.yaml
apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:name: mysenamespace: istio
spec:hosts:- www.baidu.comports:- number: 443name: httpsprotocol: HTTPSresolution: STATIClocation: MESH_EXTERNALendpoints:- address: 192.168.26.3
如果resolution: STATIC address: 192.168.26.3 这样是去解析www.baidu.com的时候解析为192.168.26.3(此处的endpoint的地址是www.baidu.com的IP)
这样就是将域名百度解析为192.168.26.3
结合VS进行流量控制
[root@k8s-master ~]# netstat -tpnl | grep 80tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 91791/nginx: master
tcp6 0 0 :::80 :::* LISTEN 91791/nginx: master [root@k8s-master se]# cat se.yaml
apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:name: mysenamespace: istio
spec:hosts:- xx.rhce.ccports:- number: 80name: httpsprotocol: HTTPSresolution: STATIClocation: MESH_EXTERNALendpoints:- address: 192.168.11.135
这里明确指出的是走向xx.rhce.cc,也就是出去的时候流量,xx.rhce.cc不是集群的,它不是我们网格里面的。得通过se加入到网格内。
# curl xx.rhce.cc
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>301 Moved Permanently</title>
</head><body>
<h1>Moved Permanently</h1>
<p>The document has moved <a href="https://www.rhce.cc//">here</a>.</p>
</body></html>
我们要想通过vs来控制出口流量的话,那么一定要把服务器端写入到serviceEntry里,如果不写的话,则vs对他不生效。
如果只是单单的在里面加一条域名解析,那么是没问题可以访问集群外部的机器的,但是要实现控制必须使用se + vs
# cat /etc/hosts
# Kubernetes-managed hosts file.
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
fe00::0 ip6-mcastprefix
fe00::1 ip6-allnodes
fe00::2 ip6-allrouters
10.244.169.156 pod1
流量想出口到网格之外的主机,就是将网格之外的主机纳管进入网格之内再去控制。
要想控制pod往网格之外的主机,那么要为网格之外的主机建立se,然后结合vs去做控制。
如果我们没有定义se,默认情况下,所有的出去的流量都是允许的