如何安装和配置 Istio 服务网格

什么是服务网格?

服务网格是帮助服务或微服务之间交互的层。 它使用服务网格中内置的逻辑帮助控制服务之间的附带信息流。 网格本身利用所谓的 sidecar 代理通过网络共享该数据。

什么是 Sidecar 代理?

Sidecar 代理是附加到每个服务或微服务的功能。 Sidecar 流程扩展了服务的功能,因为它将通信、监控和安全等补充任务从服务的主要工作中转移出来。 这允许边车在与网格控制平面中的其他服务通信的同时简化应用程序的维护。

什么是控制平面?

控制平面是网络中发生特定进程的部分,例如路由网状流量。 服务网格分为两个平面:

  • 数据平面 – 数据平面(或转发平面)采用称为 Envoy 的基于逻辑的代理,该代理部署为 sidecar。 它旨在协商和控制微服务之间的通信。 它还收集和报告所有网状流量遥测数据。
  • 控制平面 – 控制平面位于数据平面之上并配置和管理代理的行为。

什么是 Istio?

Istio 是一个现代服务网格网络层,它提供了一种透明且独立于语言的方法来快速灵活地自动化应用程序网络功能。 它的主要功能是支持微服务如何通信和共享数据。 与来自 Google 和 IMB 的团队以及 Lyft 的 Envoy 团队一起创建并分享了这个项目 GitHub 作为开源软件解决方案。 Istio 被许多知名公司使用,包括 eBay、Lowes、Spotify、沃尔玛、雅虎和美国空军。

Istio 是如何工作的?

Istio 管理微服务之间的通信和交互。 Istio 由两个主要组件组成:

  • 使者 – Envoy 是高级性能边车代理,用于促进服务网格中的所有入站和出站服务流量。 Envoy 主要与数据平面流量交互。
  • 工作室 – 该组件将高级路由模式转换为 Envoy 特定的格式,并将它们传输到网格中的其他边车。

如何安装 minikube

先决条件

在本教程中,我们将使用 minikube。

以下步骤要求我们使用以下 Kubernetes 版本之一启动并运行基于 Kubernetes 的集群:1.17、1.18、1.19、1.20。 其他支持的平台,如 MicroK8s、minikube 和 Kops,在 备用平台 设置说明。

为了让 Secret Discovery Service (SDS) 在 minikube 中正确运行,一些 额外配置 是必要的。 对于最新的标志,请始终查看 API 服务器 参考信息.

第1步。

安装最新版本的 minikube。

第2步。

安装最新版本的 minikube 管理程序驱动程序 适用于您的特定操作系统(Linux、macOS 或 Windows)。 我们将使用 Linux 版本。

以具有提升权限的用户身份运行以下命令。

二进制 (amd64 / x86_64)

[email protected]:~# curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 [email protected]:~# install minikube-linux-amd64 /usr/local/bin/minikube

Debian/Ubuntu

[email protected]:~# curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube_latest_amd64.deb [email protected]:~# dpkg -i minikube_latest_amd64.deb

红帽/CentOS RPM

[email protected]:~# curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-latest.x86_64.rpm [email protected]:~# rpm -ivh minikube-latest.x86_64.rpm

第 3 步。

启动集群。

[email protected]:~# minikube start

第四步。

设置 minikube 管理程序驱动程序类型(如果我们不使用默认驱动程序)。 例如,如果我们设置 KVM 管理程序,请使用此命令在 minikube 配置文件中设置驱动程序类型。

[email protected]:~# minikube config set driver kvm2

5.

使用 4 个 CPU 和 16384 MB 内存启动 minikube。 在我们的示例中,我们使用 Kubernetes 的 1.20.0 版。 用户可以将 Kubernetes 的变体修改为 Istio 支持的任何版本。 这可以使用以下命令中的 –kubernetes-version 值来完成。

[email protected]:~# minikube start --memory=16384 --cpus=4 --kubernetes-version=v1.20.0

注意:根据选择的平台和管理程序,最低内存要求可能会有所不同。 在这里,我们使用 16384 MB 的推荐要求来运行 Istio 和我们正在使用的名为 Bookinfo 的项目示例。 如果没有足够的分配 RAM 可用,可能会发生各种错误(VM 锁定、网络不稳定、kubectl 故障等)。

安装 Istio

步骤 1. 下载 Istio

自动下载并解压最新的 Istio 版本。

[email protected]:~# curl -L https://istio.io/downloadIstio | sh -

注意:用户也可以手动下载您的备用安装文件 操作系统版本.

上述命令下载并安装最新版本的 Istio。 用户可以下载特定的或 替代版本 使用以下语法变量 curl 命令。

[email protected]:~# curl -L https://istio.io/downloadIstio | ISTIO_VERSION=x.x.x TARGET_ARCH=x86_64 sh -

步骤 2. 更改目录

使用 cd 命令进入 Istio 解压目录。

[email protected]:~# cd istio-1.8.4

此目录包含应用程序示例和 istioctl 客户端二进制文件(在 /bin 文件夹中)。

步骤 3. 添加路径

将 istioctl 客户端添加到我们的路径中。

[email protected]:~#  PATH=$PWD/bin:$PATH

步骤 4. 配置配置文件

配置演示配置文件。

[email protected]:~# istioctl install --set profile=demo -y  ✔ Istio core installed  ✔ Istiod installed  ✔ Egress gateways installed  ✔ Ingress gateways installed  ✔ Installation complete

步骤 5. 添加名称

添加命名空间指定。 此信息告诉 Istio 在我们部署应用程序时自动插入 Envoy sidecar 代理的位置。 命名空间名称是此过程的重要组成部分。

[email protected]:~# kubectl label namespace lwdefault istio-injection=enabled namespace/lwdefault labeled

步骤 6. 部署应用程序

部署默认的 Bookinfo 示例应用程序。

adminu[email protected]:~# kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml  service/details created  serviceaccount/bookinfo-details created  deployment.apps/details-v1 created  service/ratings created  serviceaccount/bookinfo-ratings created  deployment.apps/ratings-v1 created  service/reviews created  serviceaccount/bookinfo-reviews created  deployment.apps/reviews-v1 created  deployment.apps/reviews-v2 created  deployment.apps/reviews-v3 created  service/productpage created  serviceaccount/bookinfo-productpage created  deployment.apps/productpage-v1 created

现在,默认应用程序将开始构建 Pod。 当每个 pod 可用时,Istio sidecar 将安装在它旁边。 要查看 pod 信息,请运行以下命令。

[email protected]:~# kubectl get services NAME        TYPE       CLUSTER-IP   EXTERNAL-IP   PORT(S)    AGE details     ClusterIP  10.1.0.212   <none>        9080/TCP    25s kubernetes  ClusterIP  10.1.0.1     <none>         443/TCP    20m Productpage ClusterIP  10.1.0.57    <none>        9080/TCP    25s ratings     ClusterIP  10.1.0.33    <none>        9080/TCP    25s reviews     ClusterIP  10.1.0.28    <none>        9080/TCP    25s
[email protected]:~# kubectl get pods NAME	                           READY   STATUS    RESTARTS   AGE details-v1-558b8b4b76-2llld      2/2     Running   	0          	2m24s productpage-v1-6987489c74-lpkgl  2/2     Running   	0          	2m24s ratings-v1-7dc98c7588-vzftc      2/2     Running   	0          	2m24s reviews-v1-7f99cc4496-gdxfn      2/2     Running   	0          	2m24s reviews-v2-7d79d5bd5d-8zzqd      2/2     Running   	0          	2m24s reviews-v3-7dbcdcbc56-m8dph      2/2     Running   	0          	2m24s

继续运行 kubectl get pods 命令,直到所有 pod 报告为 准备 2/2状态运行 在进入下一步之前。

步骤 7. 验证服务

运行以下命令以检查默认应用程序是否在集群内运行。 它应该通过检查响应中的页面标题来提供 HTML 页面。

[email protected]:~# kubectl exec "$(kubectl get pod -l app=ratings -o jsonpath="{.items[0].metadata.name}")" -c ratings -- curl -sS productpage:9080/productpage | grep -o "<title>.*</title>"

允许外部流量

Bookinfo 应用程序现已部署,但无法从外部访问。 为了实现外部访问,我们需要建立一个 Istio Ingress Gateway。 此步骤绘制到网格边缘路线的路径。 现在我们将默认应用程序与 Istio 的网关相关联。

$ kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml gateway.networking.istio.io/bookinfo-gateway created virtualservice.networking.istio.io/bookinfo created

接下来,为确保配置没有任何问题,请运行此命令。

$ istioctl analyze ✔ No validation issues found when analyzing namespace: default.

识别入口 IP 和端口

使用以下命令设置 INGRESS_HOST 和 INGRESS_PORT 设置以访问网关。

$  INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath="{.spec.ports[?(@.name=="http2")].nodePort}") $  SECURE_INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath="{.spec.ports[?(@.name=="https")].nodePort}")

为确保为每个环境变量有效设置端口,请运行这些命令。

$ echo "$INGRESS_PORT" 32194  $ echo "$SECURE_INGRESS_PORT" 31632

接下来,设置 Ingress 的 IP 地址。

$  INGRESS_HOST=$(minikube ip)

要验证 IP 地址已成功分配给环境变量,请运行此命令。

$ echo "$INGRESS_HOST" 192.168.4.102

现在,在新的终端窗口中运行此命令。 这会启动一个 minikube 隧道,将流量路由到 Istio Ingress Gateway。

$ minikube tunnel

接下来,我们可以设置 GATEWAY_URL 变量。

$  GATEWAY_URL=$INGRESS_HOST:$INGRESS_PORT

为确保端口和 IP 地址已成功分配给环境变量,请运行此命令。

$ echo "$GATEWAY_URL" 192.168.99.100:32194

确认外部访问

现在我们可以通过在浏览器中访问产品页面来确认默认的 Bookinfo 应用程序可以从外部访问。 运行此命令以调用 Bookinfo 应用程序的外部 IP 地址。

$ echo "https://$GATEWAY_URL/productpage"

最后,我们将先前命令的输出粘贴到我们的 Web 浏览器中,以确认产品页面正确显示。

结论

由于大多数主要的微服务架构都使用成​​百上千个服务和微服务,因此必须要有一个可靠的服务网格。 Istio 满足了这一需求,因为它可靠地控制了这些服务之间的外围数据流。

Istio、Kubernetes 或其他现代平台在服务器集群上运行良好。 立即联系我们,与托管主机顾问交谈以了解更多信息。