前言
Kubernetes 是目前最流行的容器编排系统之一,而 Istio 则是一款流行的服务网格框架。Istio 可以将 Kubernetes 上的应用程序连接起来,并提供许多有用的功能,例如负载均衡、流量管理、监控和追踪等。本文将介绍如何在 Kubernetes 上使用 Istio 进行应用间的服务发现和通信。
Istio 的基本概念
在开始介绍 Istio 如何在 Kubernetes 上使用之前,我们需要理解一些 Istio 的基本概念。
Sidecar
Sidecar 是一个代理容器,它与应用程序容器共存,并处理该容器与世界的所有通信。在 Kubernetes 中,Istio Sidecar 容器会附加到每个应用程序容器旁边,它拦截所有进出该容器的网络流量,并为应用程序容器提供服务网格所需的各种功能。
Service Mesh
Service Mesh 是一种基础设施层,它用于管理服务之间的通信。Istio 将所有应用程序容器的 Sidecar 连接成一个 Service Mesh,从而可以提供透明的服务通信和可观测性,例如服务发现、负载均衡、流量管理、监控和追踪等。
Envoy
Envoy 是 Istio 中使用的 Sidecar 的主要实现。Envoy 是一个开源的高性能代理服务器,用于处理进出应用程序容器的所有网络流量。Envoy 知道如何与 Kubernetes 以及其他 Envoy Sidecar 容器一起工作,以提供 Istio 所需的所有功能。
在 Kubernetes 上使用 Istio
安装 Istio
首先,我们需要安装 Istio。可以使用以下命令从 Istio 官方网站下载 Istio:
curl -L https://istio.io/downloadIstio | ISTIO_VERSION=1.9.8 sh -
然后将 Istio 添加到 PATH 环境变量中:
cd istio-1.9.8 export PATH=$PWD/bin:$PATH
接下来,要将 Istio 安装到 Kubernetes 集群中,可以使用以下命令:
istioctl install --set profile=default
默认情况下,Istio 会将 Sidecar 容器添加到所有命名空间中运行的所有容器中。您可以使用以下命令验证 Sidecar 容器是否已启动:
kubectl get pods -n istio-system
使用 Istio 进行服务发现和通信
在安装 Istio 后,您需要确保 Istio Sidecar 容器运行在应用程序容器旁边。为了让 Istio 自动注入 Sidecar 容器,我们可以通过以下命令启用 Istio 自动注入:
kubectl label namespace default istio-injection=enabled
现在,每当您部署一个新的 Pod 到默认命名空间中时,Istio 将自动添加 Sidecar 容器。
然后,我们需要创建一个 Kubernetes 服务。Istio 可以使用该服务来发现您的应用程序容器。例如,以下 YAML 定义了一个名为 my-app 的 Deployment 和一个名为 my-service 的 Service:
-- -------------------- ---- ------- ----------- ------- ----- ---------- --------- ----- ------ ----- --------- - --------- ------------ ---- ------ --------- --------- ------- ---- ------ ----- ----------- - ----- ------ ------ --------------- ------ - -------------- ---- --- ----------- -- ----- ------- --------- ----- ---------- ----- --------- ---- ------ ------ - ----- ---- ----- ---- ----------- ----
请注意,Deployment 的 selector 与 Service 的 selector 匹配。这样 Istio 将能够查找与该服务关联的所有 Pod。
现在,我们可以部署该服务。Istio 可以使用 kubectl apply 命令将该 YAML 文件部署到 Kubernetes:
kubectl apply -f my-app.yaml
在部署应用程序时,您还需要定义一个 Istio 路由规则。以下 YAML 使用 Istio 路由所有在 my-service 服务上接收到的流量:
-- -------------------- ---- ------- ----------- ---------------------------- ----- -------------- --------- ----- ---------- ----- ------ - ---------- ----- - ------ - ------------ ----- ---------- ----- ------- ----
您可以使用以下命令将该 YAML 文件部署到 Kubernetes:
kubectl apply -f my-service.yaml
示例代码
下面是一个简单的 Node.js 应用程序示例,它监听 8080 端口并向客户端发送“Hello World!”消息。
-- -------------------- ---- ------- ----- ---- - ---------------- ----- ------ - ----------------------- ---- -- - ------------------ - --------------- ------------ --- -------------- ----------- --- ------------------- -- -- - ------------------- ------- -- ------------------------- ---
使用以下 Dockerfile 构建和推送 Docker 镜像:
-- -------------------- ---- ------- ---- ------- ------- ---- ---- ------------- -- --- --- ------- ---- - - ------ ---- --- - ------ ------- -
docker build -t my-image . docker tag my-image my-docker-registry.com/my-image:latest docker push my-docker-registry.com/my-image:latest
最后,我们可以使用 kubectl apply 命令将 my-app.yaml 和 my-service.yaml 部署到 Kubernetes 集群中:
kubectl apply -f my-app.yaml kubectl apply -f my-service.yaml
现在,您可以使用 kubectl port-forward 命令将本地端口转发到 Kubernetes Pod,从而测试服务是否可用:
kubectl port-forward $(kubectl get pod -l app=my-app -o jsonpath='{.items[0].metadata.name}') 8080:8080
转到 http://localhost:8080/,您应该会看到“Hello World!”消息。
总结
在本文中,我们介绍了如何在 Kubernetes 上使用 Istio 进行应用程序间的服务发现和通信。我们学习了 Istio 的一些基本概念,例如 Sidecar、Service Mesh 和 Envoy,然后展示了如何通过创建 Kubernetes 服务和 Istio 路由规则来使用 Istio。最后,我们提供了一个简单的 Node.js 应用程序示例,演示了如何将其部署到 Kubernetes 上,并使用 Istio 进行服务发现和通信。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6479aa3c968c7c53b05a4d30