1. 什么是服务入口(ServiceEntry)

网关可以认为是将网格内的服务暴露给外部访问。而服务入口正好相反,是将外部的服务纳入到网格内部进行管理。

那为什么要设置服务入口呐?

  • 主要的原因是我们希望能够管理外部服务的请求。比如说你需要对访问外部服务的请求作一些流量控制, 就需要用到服务入口。
  • 另一个主要的功能是帮助扩展我们的Mesh。例如,当我们 需要给多个集群共享同一个Mesh的时候, 就需要用到服务入口。

服务入口相当于抽象了外部服务,内部服务就像访问网格内部服务一样去访问外部服务。同样,如果需要对流量进行控制或者说路由,还是需要定义一个虚拟服务去协助他
image.png

2.案例演示

部署外部服务Sleep
使用官方提供后的demo,在安装目录下执行 kubectl apply -f samples/sleep/sleep.yaml
image.png
PS:sleep这个服务的配置信息如下
(定义了一个service和deployment)

  1. ##################################################################################################
  2. # Sleep service
  3. ##################################################################################################
  4. apiVersion: v1
  5. kind: ServiceAccount
  6. metadata:
  7. name: sleep
  8. ---
  9. apiVersion: v1
  10. kind: Service
  11. metadata:
  12. name: sleep
  13. labels:
  14. app: sleep
  15. spec:
  16. ports:
  17. - port: 80
  18. name: http
  19. selector:
  20. app: sleep
  21. ---
  22. apiVersion: apps/v1
  23. kind: Deployment
  24. metadata:
  25. name: sleep
  26. spec:
  27. replicas: 1
  28. selector:
  29. matchLabels:
  30. app: sleep
  31. template:
  32. metadata:
  33. labels:
  34. app: sleep
  35. spec:
  36. serviceAccountName: sleep
  37. containers:
  38. - name: sleep
  39. image: governmentpaas/curl-ssl
  40. command: ["/bin/sleep", "3650d"]
  41. imagePullPolicy: IfNotPresent
  42. volumeMounts:
  43. - mountPath: /etc/sleep/tls
  44. name: secret-volume
  45. volumes:
  46. - name: secret-volume
  47. secret:
  48. secretName: sleep-secret
  49. optional: true
  50. ---

在sleep容器内,访问一个外部请求,以 http://httpbin.org/headers 为例,会返回headers信息,如下图
image.png

现在Istio里面默认所有网格内的服务允许直接访问外部服务,为了测试服务入口,需要把“允许访问外部服务”的方式给关掉,改成“只有注册过的服务才能访问外部服务”
关闭出流量可访问权限(outboundTrafficPolicy = REGISTRY_ONLY),这个配置存在与Istio的configMap里
命令如下 kubectl get configmap istio -n istio-system -o yaml | sed ‘s/mode: ALLOW_ANY/mode:REGISTRY_ONLY/g’ | kubectl replace -n istio-system -f -

现在定义一个服务入口,可以通过服务入口来访问外部服务

1. 创建服务入口

执行命令 kubectl apply -f linshi/serviceentry.yaml 创建服务入口这样一个资源
image.png
查看创建的“服务入口”资源
kubectl get serviceentry
image.png

“服务入口”创建完成后,再次尝试从服务内部访问 http://httpbin.org/headers ,经测试 可以正常访问,服务入口已经生效

2. 配置分析

服务入口配置清单如下,serviceentry.yaml

  1. apiVersion: networking.istio.io/v1alpha3
  2. kind: ServiceEntry # 资源类型
  3. metadata:
  4. name: httpbin-ext # 定义名为httpbin-ext这样一个服务入口
  5. spec:
  6. hosts:
  7. - httpbin.org # hosts为要外部服务的域名
  8. ports:
  9. - number: 80
  10. name: http
  11. protocol: HTTP
  12. resolution: DNS # 服务发现的机制,这里配置用dns发现的
  13. location: MESH_EXTERNAL # 定义是在网格内部还是网格外部

image.png