使用 Sidecar CRD 优化 Istio 性能( 二 )


  • ALLOW_ANY:表示允许访问任意服务,sidecar 代理在拦截到这个出流量后,会直接透传 。
  • REGISTRY_ONLY:sidecar 代理会拦截所有的出口流量 , 只允许服务网格内部服务可以被访问,对于外部服务需要使用 ServiceEntry 注册才可以被访问 。
  • Sidecar 对象可以定义在根命名空间 istio-system 下,这样就会应用到所有命名空间下的工作负载上 , 比如我们可以创建一个如下所示的 Sidecar 对象:
    # 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"}


    推荐阅读