2020-11-30

Istio 之ServiceEntry

使用服务条目资源(ServiceEntry)可以将条目添加到 Istio 内部维护的服务注册表中。添加服务条目后,Envoy 代理可以将流量发送到该服务,就好像该服务条目是网格中的服务一样。通过配置服务条目,可以管理在网格外部运行的服务的流量。

此外,可以配置虚拟服务和目标规则,以更精细的方式控制到服务条目的流量,就像为网格中的其他任何服务配置流量一样。

serviceentry样例

  • client.yaml # istio 要注入的客户端资源文件
  • baidu-se.yaml # baidu ServiceEntry
  • baidu-dr.yaml # baidu DestinationRule
  • baidu-vs.yaml # baidu VirtualService

Sidercar 注入

手动注入# istioctl kube-inject -f xxx.yaml|kubectl apply -f -自动注入# kubectl label namespace default istio-injection=enabled

服务条目资源

client.yaml

apiVersion: apps/v1kind: Deploymentmetadata: name: clientspec: replicas: 1 selector: matchLabels:  app: client template: metadata:  labels:  app: client spec:  containers:  - name: busybox  image: busybox  imagePullPolicy: IfNotPresent  command: ["/bin/sh","-c","sleep 3600"]# kubectl get poNAME      READY STATUS RESTARTS AGEclient-86bc9bd5f-mj2pq 2/2  Running 0   11mIstio 注入后,client 就处于 Istio 服务网格之中。

baidu-se.yaml

apiVersion: networking.istio.io/v1beta1kind: ServiceEntrymetadata: name: baidu-sespec: hosts: - www.baidu.com location: MESH_EXTERNAL # 定义网格外部还是内部,表示服务在网格外部。通常用于指示通过API使用的外部服务。 # location: MESH_INTERNAL # 表示服务是网格的一部分。通常用于指示在扩展服务网格以包括不受管理的基础架构时显式添加的服务 ports: - name: http  number: 80  protocol: HTTP resolution: DNS该服务条目资源定义了一个外部网站 baidu,并将它纳入到 Istio 内部维护的服务注册表中。# kubectl get se NAME  HOSTS    LOCATION  RESOLUTION AGEbaidu-se [www.baidu.com] MESH_EXTERNAL DNS   53m
  • hosts:DNS名称。可以具有通配符前缀。
  • ports:关联的端口。
  • ports.protocol: 以下之一:HTTP,HTTPS,HTTP2,GRPC,MONGO,TCP或TLS。
  • exportTo:默认情况下使用"*",这意味着该ServiceEntry公开给每个命名空间。 "."仅将其限制为当前命名空间。目前,exportTo值仅限于这两个。
  • resolution:主机的服务发现模式
  • location:从网格的角度来看,应将此服务视为内部或外部服务。

验证服务条目案例

# kubectl exec -it $(kubectl get pods | grep -i client | awk '{print $1}') -- sh # wget -q -O - html><!--STATUS OK--><html> <head><meta http-equiv=content-type content=text/html;charset=utf-8><meta http-equiv=X-UA-Compatible content=IE=Edge><meta content=always name=referrer><link rel=stylesheet type=text/css href=http://s1.bdstatic.com/r/www/cache/bdorz/baidu.min.css><title>百度一下,你就知道</title></head> <body link=#0000cc> <div id=wrapper> <div id=head> <div class=head_wrapper> <div class=s_form> <div class=s_form_wrapper> <div id=lg> <img hidefocus=truew.baidu.com/img/bd_logo1.png width=270 height=129> </div> <form id=form name=f action=//www.baidu.com/s class=fm> <input type=hidden name=bdorz_come value=1> <input type=hidden name=ie value=utf-8> <input type=hidden name=f value=8> <input type=hidden name=rsv_bp value=1> <input type=hidden name=rsv_idx value=1> <input type=hidden name=tn value=baidu><span ><input id=kw name=wd class=s_ipt value maxlength=255 autocomplete=off autofocus></span><span ><input type=submit id=su value=百度一下 ></span> </form> </div> </div> <div id=u1> <a href=http://news.baidu.com name=tj_trnews class=mnav>新闻</a> <a href=http://www.hao123.com name=tj_tr class=mnav>hao123</a> <a href=http://map.baidu.com name=tj_trmap class=mnav>地图</a> <a href=http://v.baidu.com name=tj_trvideo class=mnav>视频</a> <a href=http://tieba.baidu.com name=tj_trtieba class=mnav>贴吧</a> <noscript> <a hrp://www.baidu.com/bdorz/login.gif?login&amp;tpl=mn&amp;u=http%3A%2F%2Fwww.baidu.com%2f%3fbdorz_come%3d1 name=tj_login class=lb>登录</a> </noscript> <script>document.write('<a href="http://www.baidu.com/bdorz/login.gif?login&tpl=mn&u+ encodeURIComponent(window.location.href+ (window.location.search === "" ? "?" : "&")+ "bdorz_come=1")+ '" name="tj_login" >登录</a>');</script> <a href=//www.baidu.com/more/ name=tj_briicon class=bri >更多产品</a> </div> </div> </div> <div id=ftCon> <div id=ftConw> <p id=lh> <a href=http://home.baidu.com>关于百度</a> <a href=http://ir.baidu.com>About Baidu</a> </p> <p id=cp>&copy;2017&nbsp;Baidu&nbsp;<a href=http://www.baidu.com/duty/>使用百度前必读</a>&nbsp; <a href=http://jianyi.baidu.com/ class=cp-feedback>意见反馈</a>&nbsp;京ICP证030173号&nbsp; <img src=//www.baidu.com/img/gs.gif> </p> </div> </div> </div> </body> </html>

对刚才编写的 ServiceEntry 资源做一些改动

baidu-se-gai.yaml

... #resolution: DNS resolution: STATIC # 静态 endpoints: - address: 10.10.10.10 # 自定义一个内网的ip

验证

# kubectl exec -it $(kubectl get pods | grep -i client | awk '{print $1}') -- shDefaulting container name to busybox.Use 'kubectl describe pod/client-86bc9bd5f-mj2pq -n default' to see all of the containers in this pod./ # wget -q -O - server returned error: HTTP/1.1 503 Service Unavailable
  • 出现此问题的原因是,serviceentry 一直都在发挥作用,前面没报错的原因是默认指定的域名解析是基于DNS的。而调整后,设置了静态域名解析的方式,并随意给了一个内网IP来标识baidu。kubectl apply serviceentry后此配置立刻就被应用在网格内(client)的 envoy,那么在网格内访问baidu的时候,流量就被路由到了所指定的 10.10.10.10去了。

精细的流控

使用 service entry 使用场景有哪些?这里假设一个场景,比如工作过程中需要调用外部合作方服务,该服务跟你的集群毫无关系,甚至对方服务可以布置在美国。但是通过服务条目,你可以将对方服务纳入到自己的 Istio 网格之内,就像它本身存在你的集群之内一样,就好像你做了内网拦截一样。而且服务条目可以结合虚拟服务(virtual service)、目的地规则(destination rule)做更加精细的流量控制,不仅如此,还可以做失败注入、重试等功能。

baidu-se.yaml

apiVersion: networking.istio.io/v1beta1kind: ServiceEntrymetadata: name: baidu-sespec: hosts: - www.baidu.com location: MESH_EXTERNAL ports: - name: http number: 80 protocol: HTTP resolution: DNS# kubectl get seNAME  HOSTS    LOCATION  RESOLUTION AGEbaidu-se [www.baidu.com] MESH_EXTERNAL DNS   67m# kubectl exec -it $(kubectl get pods | grep -i client | awk '{print $1}') -- shDefaulting container name to busybox.Use 'kubectl describe pod/client-86bc9bd5f-mj2pq -n default' to see all of the containers in this pod./ # wget -q -O - html><!--STATUS OK--><html> <head><meta http-equiv=content-type content=text/html;charset=utf-8><meta http-equiv=X-UA-Compatible content=IE=Edge><meta content=always name=referrer><link rel=stylesheet type=text/css href=http://s1.bdstatic.com/r/www/cache/bdorz/baidu.min.css><title>百度一下,你就知道</title></head> <body link=#0000cc> <div id=wrapper> <div id=head> <div class=head_wrapper> <div class=s_form> <div class=s_form_wrapper> <div id=lg> <img hidefocus=truew.baidu.com/img/bd_logo1.png width=270 height=129> </div> <form id=form name=f action=//www.baidu.com/s class=fm> <input type=hidden name=bdorz_come value=1> <input type=hidden name=ie value=utf-8> <input type=hidden name=f value=8> <input type=hidden name=rsv_bp value=1> <input type=hidden name=rsv_idx value=1> <input type=hidden name=tn value=baidu><span ><input id=kw name=wd class=s_ipt value maxlength=255 autocomplete=off autofocus></span><span ><input type=submit id=su value=百度一下 ></span> </form> </div> </div> <div id=u1> <a href=http://news.baidu.com name=tj_trnews class=mnav>新闻</a> <a href=http://www.hao123.com name=tj_tr class=mnav>hao123</a> <a href=http://map.baidu.com name=tj_trmap class=mnav>地图</a> <a href=http://v.baidu.com name=tj_trvideo class=mnav>视频</a> <a href=http://tieba.baidu.com name=tj_trtieba class=mnav>贴吧</a> <noscript> <a hrp://www.baidu.com/bdorz/login.gif?login&amp;tpl=mn&amp;u=http%3A%2F%2Fwww.baidu.com%2f%3fbdorz_come%3d1 name=tj_login class=lb>登录</a> </noscript> <script>document.write('<a href="http://www.baidu.com/bdorz/login.gif?login&tpl=mn&u+ encodeURIComponent(window.location.href+ (window.location.search === "" ? "?" : "&")+ "bdorz_come=1")+ '" name="tj_login" >登录</a>');</script> <a href=//www.baidu.com/more/ name=tj_briicon class=bri >更多产品</a> </div> </div> </div> <div id=ftCon> <div id=ftConw> <p id=lh> <a href=http://home.baidu.com>关于百度</a> <a href=http://ir.baidu.com>About Baidu</a> </p> <p id=cp>&copy;2017&nbsp;Baidu&nbsp;<a href=http://www.baidu.com/duty/>使用百度前必读</a>&nbsp; <a href=http://jianyi.baidu.com/ class=cp-feedback>意见反馈</a>&nbsp;京ICP证030173号&nbsp; <img src=//www.baidu.com/img/gs.gif> </p> </div> </div> </div> </body> </html>

baidu-dr.yaml

apiVersion: networking.istio.io/v1beta1kind: DestinationRulemetadata: name: baidu-drspec: host: www.baidu.com trafficPolicy: # 流量策略,包括:负载平衡策略、连接池大小、异常检测 loadBalancer: # 默认LB策略  simple: ROUND_ROBIN     # ROUND_ROBIN-循环,LEAST_CONN-最小连接,RANDOM-随机,PASSTHROUGH-只连# kubectl get drNAME  HOST   AGEbaidu-dr www.baidu.com 54m

baidu-vs.yaml

apiVersion: networking.istio.io/v1beta1kind: VirtualServicemetadata: name: baidu-vsspec: hosts: - www.baidu.com http: - route: - destination:  host: www.baidu.com  port:   number: 80  #subset: tls-origination timeout: 1ms# kubectl get vsNAME  GATEWAYS HOSTS    AGEbaidu-vs    [www.baidu.com] 54m

再次测试

# kubectl exec -it $(kubectl get pods | grep -i client | awk '{print $1}') -- shDefaulting container name to busybox.Use 'kubectl describe pod/client-86bc9bd5f-mj2pq -n default' to see all of the containers in this pod./ # wget -q -O - server returned error: HTTP/1.1 408 Request Timeout

👌!经过简单的测试可以对网格外部服务进行精细的流控









原文转载:http://www.shaoqun.com/a/494343.html

贝贝特卖:https://www.ikjzd.com/w/1321

西集网:https://www.ikjzd.com/w/1353

亚马逊全球开店:https://www.ikjzd.com/w/1299


使用服务条目资源(ServiceEntry)可以将条目添加到Istio内部维护的服务注册表中。添加服务条目后,Envoy代理可以将流量发送到该服务,就好像该服务条目是网格中的服务一样。通过配置服务条目,可以管理在网格外部运行的服务的流量。此外,可以配置虚拟服务和目标规则,以更精细的方式控制到服务条目的流量,就像为网格中的其他任何服务配置流量一样。serviceentry样例client.yaml#
易麦:易麦
大森林:大森林
深圳周边游之西冲旅游攻略 西冲旅游景点大全(图):深圳周边游之西冲旅游攻略 西冲旅游景点大全(图)
流溪河国家森林公园兰花展什么时间举行?流溪河公园玉兰节介绍:流溪河国家森林公园兰花展什么时间举行?流溪河公园玉兰节介绍
中国山东青岛小吃:鲅鱼水饺 - :中国山东青岛小吃:鲅鱼水饺 -

No comments:

Post a Comment