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

什么是服务网格?

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

什么是边车代理?

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

什么是控制平面?

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

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

什么是 Istio?

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

Istio 是如何工作的?

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

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

如何安装 minikube

先决条件

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

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

为了让秘密发现服务 (SDS) 在 minikube 中正常运行,一些 额外配置 是必须的。 对于最新的标志,请始终查看 API 服务器 参考信息.

第1步。

安装最新版本的 minikube。

第2步。

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

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

二进制 (amd64 / x86_64)

adminuser@host:~# curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
adminuser@host:~# install minikube-linux-amd64 /usr/local/bin/minikube

Debian/Ubuntu

adminuser@host:~# curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube_latest_amd64.deb
adminuser@host:~# dpkg -i minikube_latest_amd64.deb

红帽/CentOS RPM

adminuser@host:~# curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-latest.x86_64.rpm
adminuser@host:~# rpm -ivh minikube-latest.x86_64.rpm

步骤 3。

启动集群。

adminuser@host:~# minikube start

第4步。

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

adminuser@host:~# minikube config set driver kvm2

5.

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

adminuser@host:~# minikube start --memory=16384 --cpus=4 --kubernetes-version=v1.20.0

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

安装 Istio

步骤 1. 下载 Istio

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

adminuser@host:~# curl -L https://istio.io/downloadIstio | sh -

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

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

adminuser@host:~# curl -L https://istio.io/downloadIstio | ISTIO_VERSION=x.x.x TARGET_ARCH=x86_64 sh -

步骤 2. 更改目录

使用 cd 命令进入提取 Istio 的目录。

adminuser@host:~# cd istio-1.8.4

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

步骤 3. 添加路径

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

adminuser@host:~# export PATH=$PWD/bin:$PATH

步骤 4. 配置配置文件

配置演示配置文件。

adminuser@host:~# istioctl install --set profile=demo -y
 ✔ Istio core installed
 ✔ Istiod installed
 ✔ Egress gateways installed
 ✔ Ingress gateways installed
 ✔ Installation complete

步骤 5. 添加名称

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

adminuser@host:~# kubectl label namespace lwdefault istio-injection=enabled
namespace/lwdefault labeled

步骤 6. 部署应用程序

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

adminuser@host:~# 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 信息,请运行以下命令。

adminuser@host:~# 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
adminuser@host:~# 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 页面。

adminuser@host:~# 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 设置以访问网关。

$ export INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].nodePort}')
$ export 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 地址。

$ export INGRESS_HOST=$(minikube ip)

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

$ echo "$INGRESS_HOST"
192.168.4.102

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

$ minikube tunnel

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

$ export 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 或其他现代平台在服务器集群上运行良好。 立即联系我们,与托管托管顾问交谈以了解更多信息。