示例一:

apiVersion: networking.istio.io/v1beta1
kind: Sidecar
metadata:
  name: client
  namespace: default # default空间下的sidecar的envoy侦听器
spec:
  workloadSelector:
    labels:
      run: client # 选择带有这个标签的Pod的sidecar的envoy上
  egress: # 出站侦听器
  - hosts:
    - "./*" # 当前名称空间下的所有服务都创建出站侦听器(格式:namespace/servicename)
    - "istio-system/*" # 在istio-system名称空间下的所有服务创建出站侦听器

示例二:

apiVersion: networking.istio.io/v1beta1
kind: Sidecar
metadata:
  name: client
  namespace: default
spec:
  workloadSelector:
    labels:
      run: client
  outboundTrafficPolicy:
    mode: REGISTRY_ONLY # 仅注册的服务可以出,其他流量都丢弃
  egress:
  - port: # 只为满足下面条件的服务创建出站侦听器,其他的服务都不创建
      number: 80
      protocol: HTTP
      name: proxy
  - hosts:
    - "./*"

实例:接着上面几篇的实例,这个sidecar应用在名为client的服务上。

下面这个配置是仅注册的流量可以出去,其他出去的流量直接丢弃进入blackhole。

apiVersion: networking.istio.io/v1beta1
kind: Sidecar
metadata:
  name: client
  namespace: default
spec:
  workloadSelector:
    labels:
      run: client
  outboundTrafficPolicy:
    mode: REGISTRY_ONLY # 只有访问端口为8080且协议为http的流量可以出去
  egress:
  - port:
      number: 8080
      protocol: HTTP
      name: demoapp
    hosts:
    - "./*"

应用sidecar前client中envoy的侦听器:

]# kubectl exec -it client -c istio-proxy -- pilot-agent request GET /listeners
932a1f2f-df89-4e0e-a661-f92e426d521b::0.0.0.0:15090
01246b9d-b814-4a7b-9bf2-c691937831a0::0.0.0.0:15021
10.96.204.80_15012::10.96.204.80:15012
10.96.204.80_443::10.96.204.80:443
10.105.56.24_443::10.105.56.24:443
10.99.143.236_31400::10.99.143.236:31400
10.106.32.122_443::10.106.32.122:443
10.99.143.236_443::10.99.143.236:443
10.99.143.236_15443::10.99.143.236:15443
10.101.185.70_443::10.101.185.70:443
10.96.0.1_443::10.96.0.1:443
10.96.0.10_53::10.96.0.10:53
10.103.44.131_443::10.103.44.131:443
0.0.0.0_9090::0.0.0.0:9090
0.0.0.0_15010::0.0.0.0:15010
0.0.0.0_15014::0.0.0.0:15014
0.0.0.0_80::0.0.0.0:80
10.99.186.117_80::10.99.186.117:80
10.103.231.91_80::10.103.231.91:80
10.96.0.10_9153::10.96.0.10:9153
0.0.0.0_8000::0.0.0.0:8000
10.106.250.70_14268::10.106.250.70:14268
0.0.0.0_16685::0.0.0.0:16685
10.104.246.237_80::10.104.246.237:80
0.0.0.0_20001::0.0.0.0:20001
10.99.143.236_15021::10.99.143.236:15021
10.108.57.115_3000::10.108.57.115:3000
10.106.250.70_14250::10.106.250.70:14250
0.0.0.0_9411::0.0.0.0:9411
virtualOutbound::0.0.0.0:15001
virtualInbound::0.0.0.0:15006
10.99.26.101_8080::10.99.26.101:8080
0.0.0.0_8082::0.0.0.0:8082

应用sidecar配置之后client中envoy的侦听器:

]# kubectl exec -it client -c istio-proxy -- pilot-agent request GET /listeners
932a1f2f-df89-4e0e-a661-f92e426d521b::0.0.0.0:15090 # prometheus的指标
01246b9d-b814-4a7b-9bf2-c691937831a0::0.0.0.0:15021 # 聚合的指标
virtualOutbound::0.0.0.0:15001 # 流量出口
virtualInbound::0.0.0.0:15006 # 流量入口
0.0.0.0_8080::0.0.0.0:8080 # 手动开放的服务

透传效果:

apiVersion: networking.istio.io/v1beta1
kind: Sidecar
metadata:
  name: client
  namespace: default
spec:
  workloadSelector:
    labels:
      run: client
  outboundTrafficPolicy:
    mode: ALLOW_ANY # 除了下面定义的端口和协议是进行代理的,其他流量直接透传,不通过envoy代理
  egress:
  - port:
      number: 8080
      protocol: HTTP
      name: demoapp
    hosts:
    - "./*"

如图:client访问的是proxy服务,透传就是没有经过envoy代理,所以envoy看不到流量是怎么出去的怎么进来的。

image.png