# global-sidecar.yamlapiVersion: networking.istio.io/v1beta1kind: Sidecarmetadata:name: defaultnamespace: istio-systemspec:egress:- hosts:- "./*"
上面的这个 Sidecar 对象定义在 istio-system 命名空间下 , 这样就会应用到所有命名空间下的工作负载上,其中 egress 字段中的 hosts 字段指定了可以访问的服务,这里我们指定了 "./*" , 表示限制整个服务网格中的服务只能访问本命名空间的服务 。在实践中我们推荐使用这种方式在全局范围定义一个统一的 Sidecar 规则,然后在特定的命名空间下再定义一个 Sidecar 对象来覆盖全局的 Sidecar 规则 。比如我们可以在 default 命名空间下创建一个如下所示的 Sidecar 对象来覆盖上面全局的这个对象:
# default-sidecar.yamlapiVersion: networking.istio.io/v1beta1kind: Sidecarmetadata:name: defaultnamespace: defaultspec:egress:- hosts:- "foo/*"
这个对象就允许 default 命名空间的服务可以访问 foo 命名空间的服务 。同样我们还可以使用 workloadSelector 字段来指定 sidecar 代理所属的工作负载,比如我们可以创建一个如下所示的 Sidecar 对象:
# default-sidecar.yamlapiVersion: networking.istio.io/v1beta1kind: Sidecarmetadata:name: defaultnamespace: defaultspec:workloadSelector:labels:App: baregress:- hosts:- "bar/foo-api"
上面的这个对象只会应用到 app: bar 标签的工作负载上,并覆盖以上命名空间级别的规则 , 使得 default 命名空间下面的 app: bar 标签的工作负载只能访问 bar 命名空间下面的 foo-api 服务 。接下来我们使用 sleep 和 httpbin 应用来进行测试说明,将这两个应用部署到 default 和 other 两个命名空间下面:
kubectl create ns otherkubectl label ns other istio-injectinotallow=enabledkubectl apply -f samples/sleep/sleep.yaml -n defaultkubectl apply -f samples/sleep/sleep.yaml -n otherkubectl apply -f samples/httpbin/httpbin.yaml -n defaultkubectl apply -f samples/httpbin/httpbin.yaml -n other
默认情况下 , 注入了 Istio 的工作负载会进行全网格的传播,假设 default 和 other 两个不相干的命名空间,other 中有大量的服务,而 default 中只有几个,因为路由传播的关系,default 命名空间中的工作负载,其 sidecar 代理中也会带上 other 命名空间中的路由信息 。例如:$ istioctl proxy-config clusters sleep-9454cc476-jfw97 |grep otherhttpbin.other.svc.cluster.local8000-outboundEDSsleep.other.svc.cluster.local80-outboundEDS
可以看到,在 default 命名空间中的 Pod,保存了其它命名空间中的路由信息 。这不管是对内存消耗还是路由控制来说,都会造成一定浪费 , 这个时候我们就可以定义一个 Sidecar 资源,限制 sleep 服务只访问同一命名空间的其他服务,如下所示:# sleep-sidecar.yamlapiVersion: networking.istio.io/v1alpha3kind: Sidecarmetadata:name: sleepspec:workloadSelector:labels:app: sleepegress:- hosts:- "default/*"
直接应用上面的资源对象即可:$ kubectl apply -f sleep-sidecar.yaml$ kubectl get sidecarNAMEAGEsleep16s
这个时候可以看到在 sleep 应用中只剩下了本命名空间之内的服务了:$ istioctl proxy-config clusters sleep-9454cc476-jfw97SERVICE FQDNPORTSUBSETDIRECTIONTYPEDESTINATION RULE80-inboundORIGINAL_DSTBlackHoleCluster---STATICInboundPassthroughClusterIpv4---ORIGINAL_DSTPassthroughCluster---ORIGINAL_DSTagent---STATIChttpbin.default.svc.cluster.local8000-outboundEDSkubernetes.default.svc.cluster.local443-outboundEDSprometheus_stats---STATICsds-grpc---STATICsleep.default.svc.cluster.local80-outboundEDSxds-grpc---STATICzipkin---STRICT_DNS
现在我们可以在 sleep 应用中去访问下 httpbin 的应用:$ kubectl exec -it sleep-9454cc476-jfw97 -- curl http://httpbin.default:8000/ip{"origin": "127.0.0.6"}
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 防电弧服国家标准有没有,电弧防护服的使用条件
- 如何使用OPPO手机进行录屏,OPPO手机怎么重新设置录屏
- oppo应用使用时间怎么删除
- 邦迪创可贴属于什么垃圾,使用过的创可贴属于什么垃圾
- 干粉灭火器的使用方法和有效期
- 粘粘卡怎么用,支付宝沾福卡怎么使用?
- 手游加速器怎么开启加速,海豚手游加速器怎么免费使用
- 解决重启Docker时卡住问题
- Vue3 学习笔记,如何使用 Watch 监听数据变化
- 使用加湿器会导致加湿器肺炎吗?如何正确使用