1. 什么是服务入口(ServiceEntry)
网关可以认为是将网格内的服务暴露给外部访问。而服务入口正好相反,是将外部的服务纳入到网格内部进行管理。
那为什么要设置服务入口呐?
- 主要的原因是我们希望能够管理外部服务的请求。比如说你需要对访问外部服务的请求作一些流量控制, 就需要用到服务入口。
- 另一个主要的功能是帮助扩展我们的Mesh。例如,当我们 需要给多个集群共享同一个Mesh的时候, 就需要用到服务入口。
服务入口相当于抽象了外部服务,内部服务就像访问网格内部服务一样去访问外部服务。同样,如果需要对流量进行控制或者说路由,还是需要定义一个虚拟服务去协助他
2.案例演示
部署外部服务Sleep
使用官方提供后的demo,在安装目录下执行 kubectl apply -f samples/sleep/sleep.yaml
PS:sleep这个服务的配置信息如下
(定义了一个service和deployment)
################################################################################################### Sleep service##################################################################################################apiVersion: v1kind: ServiceAccountmetadata:name: sleep---apiVersion: v1kind: Servicemetadata:name: sleeplabels:app: sleepspec:ports:- port: 80name: httpselector:app: sleep---apiVersion: apps/v1kind: Deploymentmetadata:name: sleepspec:replicas: 1selector:matchLabels:app: sleeptemplate:metadata:labels:app: sleepspec:serviceAccountName: sleepcontainers:- name: sleepimage: governmentpaas/curl-sslcommand: ["/bin/sleep", "3650d"]imagePullPolicy: IfNotPresentvolumeMounts:- mountPath: /etc/sleep/tlsname: secret-volumevolumes:- name: secret-volumesecret:secretName: sleep-secretoptional: true---
在sleep容器内,访问一个外部请求,以 http://httpbin.org/headers 为例,会返回headers信息,如下图
现在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 创建服务入口这样一个资源
查看创建的“服务入口”资源
kubectl get serviceentry
“服务入口”创建完成后,再次尝试从服务内部访问 http://httpbin.org/headers ,经测试 可以正常访问,服务入口已经生效
2. 配置分析
服务入口配置清单如下,serviceentry.yaml
apiVersion: networking.istio.io/v1alpha3kind: ServiceEntry # 资源类型metadata:name: httpbin-ext # 定义名为httpbin-ext这样一个服务入口spec:hosts:- httpbin.org # hosts为要外部服务的域名ports:- number: 80name: httpprotocol: HTTPresolution: DNS # 服务发现的机制,这里配置用dns发现的location: MESH_EXTERNAL # 定义是在网格内部还是网格外部

