1. 什么是服务入口(ServiceEntry)
网关可以认为是将网格内的服务暴露给外部访问。而服务入口正好相反,是将外部的服务纳入到网格内部进行管理。
那为什么要设置服务入口呐?
- 主要的原因是我们希望能够管理外部服务的请求。比如说你需要对访问外部服务的请求作一些流量控制, 就需要用到服务入口。
- 另一个主要的功能是帮助扩展我们的Mesh。例如,当我们 需要给多个集群共享同一个Mesh的时候, 就需要用到服务入口。
服务入口相当于抽象了外部服务,内部服务就像访问网格内部服务一样去访问外部服务。同样,如果需要对流量进行控制或者说路由,还是需要定义一个虚拟服务去协助他
2.案例演示
部署外部服务Sleep
使用官方提供后的demo,在安装目录下执行 kubectl apply -f samples/sleep/sleep.yaml
PS:sleep这个服务的配置信息如下
(定义了一个service和deployment)
##################################################################################################
# Sleep service
##################################################################################################
apiVersion: v1
kind: ServiceAccount
metadata:
name: sleep
---
apiVersion: v1
kind: Service
metadata:
name: sleep
labels:
app: sleep
spec:
ports:
- port: 80
name: http
selector:
app: sleep
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: sleep
spec:
replicas: 1
selector:
matchLabels:
app: sleep
template:
metadata:
labels:
app: sleep
spec:
serviceAccountName: sleep
containers:
- name: sleep
image: governmentpaas/curl-ssl
command: ["/bin/sleep", "3650d"]
imagePullPolicy: IfNotPresent
volumeMounts:
- mountPath: /etc/sleep/tls
name: secret-volume
volumes:
- name: secret-volume
secret:
secretName: sleep-secret
optional: 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/v1alpha3
kind: ServiceEntry # 资源类型
metadata:
name: httpbin-ext # 定义名为httpbin-ext这样一个服务入口
spec:
hosts:
- httpbin.org # hosts为要外部服务的域名
ports:
- number: 80
name: http
protocol: HTTP
resolution: DNS # 服务发现的机制,这里配置用dns发现的
location: MESH_EXTERNAL # 定义是在网格内部还是网格外部