在Kubernetes中创建基本的微服务看似简单。在我们的
上一篇文章中,我们展示了使用容器部署是多么容易。我们构建了一个简单的Docker镜像,使用Kubernetes部署它,并查询我们的应用程序。当然,那是相对无痛的!但在现实世界中,云架构通常比这更复杂,涉及数十或数百种服务,包括数据库,身份验证和其他现实问题。
管理所有这些服务是一个真正的麻烦。在本文中,我们将介绍Istio,它是提高和管理大规模云部署的下一代利器。早些时候,我们讨论了微服务的网状结构,这是Istio所支持的。
微服务网格能使你获得微服务架构的可扩展性优势,同时还支持基于集中的优势,例如日志记录和版本控制。有关网格的更多信息,请参阅我们之前的
讨论,概述网格的基础知识及其提供的优势。
在这篇文章中,我们将了解Istio在实现云网格架构模式时所提供的能力。我们将安装控制平面,然后查看Istio有什么优势。最后,我们将采用上次定义的Kubernetes服务并添加一个sidecar代理,并将其链接到上面的控制面板。
深入:数据平面和边车(sidecar)
Istio定义了两个关键的架构术语,数据平面和控制平面。数据平面是指通过应用程序流动的数据,传递给不同的服务实例并由服务本身处理。数据平面主要通过边车代理(sidecar-proxy)实现。控制层确定如何实例化服务以及保持服务的遥测和信息的位置。控制平面的关键元素是Pilot和Mixer。让我们按顺序看看它们。
sidecar代理与Pod一起运行,定义了你在Kubernetes的服务。顾名思义,它与主要服务组件一起添加,并且它针对该服务的流量进行操作。此设计允许你在Pod中为现有服务定义添加sidecar代理:只需将定义sidecar的行添加到服务中即可开始工作。
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/e69b50624b8713ec765f32c9e8fb42ce.png)
你获得的回报是Istio云网产品的核心优点。sidecar代理拦截进入服务的流量,并允许你以智能方式路由它。这可能意味着像负载均衡和处理TLS终止这样简单的事情,这是一种加快速度的简单方法,或者更复杂的事情,例如处理新版本服务的版本控制和分阶段部署以及收集使用指标。sidecar允许你将这些功能添加到现有的微服务架构中,而无需重新设计整个系统。
在掌握了sidecar的最初目标之后,Istio和云网的大部分功能都成为焦点。由于它们充当服务舱之间的单一、统一的桥梁,因此sidecar会共同遇到并查看流经你的应用程序的所有流量。这意味着如果你想加强安全性,sidecar可以提供一个位置,你可以在其中添加服务之间的身份验证和https,记录事件以检查异常情况,以及添加流量控制和守门(gatekeeping)以进行身份验证。
最重要的是,由于sidecar充当服务之间的中央通信端点,因此它们允许你在应用程序中构建弹性并添加额外级别的可伸缩性。微服务的一个常见问题是服务器Pod都是隔离的,如果微服务出现问题,请求可能会被缓慢处理或丢弃。使用sidecar,你可以在一个地方添加超时,更智能的负载均衡和额外的监控。
集中:控制平面
在此设施的另一端是控制平面。控制平面充当应用程序中运行的sidecar的控制器,以及网格中的服务可视为单一事实来源的所有信息(如日志记录和版本更新)的中央存储库。
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/fa6436b6ace5705edefab219b08fe7cc.png)
使用Istio时,与控制平面交互的主要方式是通过Kubernetes。安装Istio包和定义后,可以通过操纵系统状态的kubectl命令访问控制平面。例如,使用kubectl将Pod升级到新版本时,版本更新将通过更新本地控制平面变量开始。
最简单的方法是使用kubectl中的get-svc命令列出与给定库相关的服务。要检查正在运行的内容,你可以运行:
kubectl get svc -n istio-system
并查看在后台运行的Istio核心控制平面功能列表。你可能会认识到其中的一些,例如Citadel,即管理服务之间流量安全性的服务。
安装Istio
首先,让我们来看看Istio提供的开箱即用产品。我们将安装Istio控制平面来管理我们在
上一篇文章中定义的基本HTTP API。该API服务是在Kubernetes上定义的,并且作为单个Kubernetes Pod实现,其中运行了API。
要安装Istio,请按照Istio官方快速入门指南[1]中的步骤操作。首先,从Istio版本页面[2]下载最新版本。Istio仍处于非常活跃的开发阶段,最新版本始终是最佳起点。要做到这一点,你只需下拉文件并确保它在你的路径中可用。
然后,将Istio定义添加到你的Kubernetes中,以便它们可以与kubectl命令行工具一起使用。只需使用kubectl apply将你在上面下拉的.yaml文件添加到安装目录中:
kubectl apply -f install/kubernetes/helm/istio/templates/crds.yaml
然后,你需要通过选择身份验证方法来激活Istio安装。对于本演示,我将使用默认的相互HTTPS身份验证,这对于演示项目和开始新工作非常有用。要将网格添加到现有项目,你需要更多地查看选项。现在,你可以运行以下命令:
kubectl apply -f install/kubernetes/istio-demo-auth.yaml
有了这个,你就可以继续往前了。你需要将Istio设施添加到你创建的现有Pod中,对于新Pod,你需要添加Istio作为依赖项。
部署helloworld App
我们使用helloworld示例应用程序,该应用程序已在我们的上一篇博客中讲过。这将创建一个部署,一个服务,一个网关和一个VirtualService。更新配置文件以匹配以下内容:
helloworld.yaml
apiVersion: v1
kind: Service
metadata:
name: helloworld
spec:
type: ClusterIP
ports:
- port: 80
targetPort: 8080
selector:
app: helloworld
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: helloworld-v1
spec:
replicas: 1
selector:
matchLabels:
app: helloworld
template:
metadata:
labels:
app: helloworld
version: v1
spec:
containers:
- name: helloworld-kubernetes
image: haseebm/helloworld-kubernetes
ports:
- containerPort: 8080
---
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: helloworld-gateway
spec:
selector:
istio: ingressgateway # use istio default controller
servers:
- port:
number: 80
name: http
protocol: HTTP
hosts:
- "*"
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: helloworld
spec:
hosts:
- "*"
gateways:
- helloworld-gateway
http:
route:
- destination:
host: helloworld
port:
number: 80
手动注入Istio Sidecar
Istio使用sidecar模式将istio sidecar容器与helloworld app容器放在同一个Pod中。
$ kubectl apply -f <(istioctl kube-inject -f helloworld.yaml)
service/helloworld created
deployment.extensions/helloworld-v1 created
gateway.networking.istio.io/helloworld-gateway created
virtualservice.networking.istio.io/helloworld created
确认Pod和服务正在运行:
$ kubectl get pod,svc | grep helloworld
pod/helloworld-v1-1cbca3f8d5-achr2 2/2 Running
service/helloworld ClusterIP 10.160.58.61
现在,查看helloworld的流量:
$ curl a2******.ap-southeast-1.elb.amazonaws.com/api/hello
Hello world v1
下一步
Istio是开展云网格技术和智能微服务管理的一个很好的方式。正如我们在过去的几篇文章中看到的那样,正确管理的微服务在技术优势和可扩展性方面有很多优势,但充分利用可用技术对于获得这些优势至关重要。
在接下来的几篇文章中,我们将介绍一些Istio和云网格的应用程序,以增强我们的示例体系结构的安全性和可管理性。在下一篇文章中,我们将讨论如何在Istio中管理部署和版本更新,以无缝地推送代码更新,而不会出现部署中断。
相关链接:
https://istio.io/docs/setup/kubernetes/install/kubernetes/
https://istio.io/docs/setup/kubernetes/
原文链接:https://medium.com/faun/microservices-mesh-part-ii-istio-basics-b9c343594a05
基于Kubernetes的DevOps实战培训