Google Kubernetes引擎上使用Istio简化微服务 — 第II部分
作者:Nithin Mallya
翻译:狄卫华
首发: https://mp.weixin.qq.com/s/3jBza5239cFe4dIVzP_kegServiceMesh中文网
原文:Simplifying Microservices with Istio in Google Kubernetes Engine — Part II
本系列翻译链接:
我所写的关于 Istio 的文章是 Istio 非常棒的官方文档 中的一部分。如果想了解更多,请阅读官方文档。
在本系列 第一部分PartI , 我们展示了如何使用 Istio 简化我们微服务间的通信。
在这个部分,我们将会看到在服务网格内部的服务是如何与外部服务通过 HTTPS 协议进行通信的
图1:微服务通信模型的逻辑视图
在上面的图1,PetService(直接与 PetDetailsService 和 PetMedicalHistoryService 服务进行通信)现在将也会调用外部的服务,外部服务位于 https://thedogapi.co.uk,返回 dog 图片的 url 地址。
Istio 服务网格与外部的服务通信展示在下面的图 2 所示。
- 与往常一样,在服务网格内的服务通信通过HTTP协议代理
- 与使用 HTTPS 协议的外部服务通信,内部服务仍然是发送 HTTP 请求,HTTP 请求会被以边车(sidecar)方式部署的代理所拦截,并作为 TLS 协议的发起方与外部的服务在加密通道上进行通信
图2: Istio 服务网格展示与外部服务通信
petservice 代码如下所示:
备注:展示我们如何调用 DogAPI https,地址为 http://api.thedogapi.co.uk:443/v2/dog.php
让我们看一下当运行以下命令时会发生什么?其中 108.59.82.93 为 入口(Ingress)IP 地址 (参见 第一部分)
curl http://108.59.82.93/pet/123
响应内容如下:
{ "petDetails": { "petName": "Maximus", "petAge": 5, "petOwner": "Nithin Mallya", "petBreed": "Dog" }, "petMedicalHistory": { "vaccinationList": [ "Bordetella, Leptospirosis, Rabies, Lyme Disease" ] }, "dogAPIResponse": { "message": "request to https://api.thedogapi.co.uk/v2/dog.php failed, reason: read ECONNRESET", "type": "system", "errno": "ECONNRESET", "code": "ECONNRESET" } }
你会注意到当 petservice 访问位于 https://api.thedogapi.co.uk 的外部服务时,上述的响应内容中 dogAPIResponse(不是最原始的名字)部分有一个错误信息。
这是因为所有外部的流量(egress)在默认情况下被阻止。在前面的文章中解释过边车(sidecar)代理只允许集群内的通信。
备注:正如我在第一部分提及的那样,当我们想要管控服务与外部服务通信的方式和阻止任何未经授权的访问的时候,这个限制非常有用。
医疗保健/金融系统可以特别利用此功能来保护PHI / PII数据不会被无意地甚至恶意地从内部服务中共享。
为了启用出口(egress)流量,你需要创建如下所示的出口规则(egress rule):
cat <<EOF | istioctl create -f - apiVersion: config.istio.io/v1alpha2 kind: EgressRule metadata: name: dogapi-egress-rule spec: destination: service: api.thedogapi.co.uk ports: - port: 443 protocol: https EOF
为了检查该出口规则(egress rule)是否已被创建,你可以运行下面的命令,你应该看到出口规则(egress rule)dogapi-egress-rule已经被创建。
$ kubectl get egressrule NAME AGE dogapi-egress-rule 5m
我们再次运行上面的 curl 命令:
$ curl http://108.59.82.93/pet/123 { "petDetails": { "petName": "Maximus", "petAge": 5, "petOwner": "Nithin Mallya", "petBreed": "Dog" }, "petMedicalHistory": { "vaccinationList": [ "Bordetella, Leptospirosis, Rabies, Lyme Disease" ] }, "dogAPIResponse": { "count": 1, "api_version": "v2", "error": null, "data": [ { "id": "rCaz-LNuzCC", "url": "https://i.thedogapi.co.uk/rCaz-LNuzCC.jpg", "time": "2017-08-30T21:43:03.0", "format": "jpg", "verified": "1", "checked": "1" } ], "response_code": 200 } }
已经可以工作了,我们可以从 DogAPI 响应的样例中看到返回的 Pet 图片地址。
结论:我们看到如何通过创建明确规则来启用从服务网格(service mesh )到外部服务的通信。
在后续的文章中,我们将会看到如何实施其他重要的任务比如流量路由(traffic routing)和流量变化(ramping),使用断路器(circuit breaker)等。
资源:
- 本系列文章的第 I 部分: https://medium.com/google-cloud/simplifying-microservices-with-istio-in-google-kubernetes-engine-part-i-849555f922b8
- Istio 官方地址 https://istio.io/
- DevOxx 的RayTsang的Istio演讲材料: https://www.youtube.com/watch?v=AGztKw580yQ&t=231s
- 案例的Github: https://github.com/nmallya/istiodemo
- Kubernetes: https://kubernetes.io/
- DogAPI 网址: https://thedogapi.co.uk/