发布于 2026-01-05 2 阅读
0

使用 Kubernetes 和 Istio 轻松构建微服务 ✅ ☸️ ⛵️ 微服务很棒,但维护起来很麻烦。 代码 代码 代码 使用 KHipster 生成微服务 生成 Kubernetes 和 Istio 配置文件 代码演练 将应用程序部署到 GCP 开发者全球展示挑战赛 由 Mux 呈现:展示你的项目!

使用 Kubernetes 和 Istio 轻松构建微服务 ✅ ☸️ ⛵️

微服务很棒

但维护微服务很麻烦。

代码 代码 代码

使用 KHipster 生成微服务

生成 Kubernetes 和 Istio 配置文件

代码讲解

将应用程序部署到 GCP

由 Mux 主办的 DEV 全球展示挑战赛:展示你的项目!

微服务很棒

他们负责你的申请

  • 模块化且松散耦合
  • 更快的开发速度和更高的生产力
  • 单独部署
  • 粒度尺度
  • 误隔离

但维护微服务很麻烦。

由于微服务包含众多动态组件,因此难以维护和识别瓶颈。

微服务将问题从应用程序内部转移到应用程序层之间。

这使得问题出现时更难解决,因为网络并非始终处于理想状态。

除此之外,我们在设计能够应对失败或混乱情况的应用程序时,还需要转变思维方式。

这导致了以下方面的新问题:

连接

将应用程序开发成微服务意味着将应用程序拆分成多个小型/微型/纳米/宏服务。这些服务应该能够在任何地方运行。但为了正常工作,这些服务之间必须相互通信。

这些小型服务应该相互关联。它们应该知道其他服务的位置以及如何与它们连接。即使服务运行的是不同版本,它们也应该兼容。

它们应该稳定可靠且高度可用。连接应该是智能的且可配置的。

安全的

这些服务必须安全可靠。所有请求都必须经过适当的授权和身份验证。

服务间的通信流量应进行加密,以防止中间人攻击。所有服务请求都应进行适当的审计。

控制

我们需要能够动态控制服务,例如仅向部分客户提供新功能,而对其他客户则不提供。每次版本变更(升级或降级)时,我们不应手动启用或禁用服务,而应动态启用或禁用,且对最终用户完全透明。

监视器

由于这些服务能够自主地进行扩展和缩减,因此对其进行监控至关重要。需要观察是否存在任何问题、错误、异常情况以及请求和响应之间的延迟。一旦发现这些瓶颈,我们就能快速修复并发布新版本。

虽然有很多新的应用程序、项目和产品被开发出来以解决微服务存在的问题,但要同时保持高可用性、弹性和可靠性仍然是一个更难解决的问题。

Istio——改变游戏规则的产品。

Istio组件无需在每个服务中安装或配置。相反,它可以与您的服务一起独立运行。(没错,它是独立运行的)*

Istio 让您能够轻松创建部署服务的网络,实现负载均衡、服务间身份验证、监控等功能,而无需更改服务代码。— Istio

Istio有助于解决这些问题。Istio有助于……

  • 自动在服务之间进行流量负载均衡
  • 配置和控制服务间的路由
  • 提供身份验证和授权,以保护这些服务。
  • 自动收集指标、日志和跟踪信息,以观察这些服务

最棒的是,您无需对现有服务进行任何更改。Istio 与平台无关,旨在运行于各种环境中。— 点击此处查看 Istio 架构。

* 此处“单独”指的是它们不在您的应用程序内部,而是独立运行。

代码 代码 代码

别光说不练了,咱们来谈谈代码吧。

我们将使用Kotlin Hipster生成应用程序。

KHipster 构建于JHipster之上。有了 KHipster,生成微服务不再是件难事。它提供了一种简单、快捷的方式,可以生成健壮的基于 Kotlin + Angular / React / Vue 的微服务。

K(J)Hipster 是一个开发平台,用于生成、开发和部署 Spring Boot + Angular/React Web 应用程序和 Spring 微服务。

那么我们今天要做什么呢?

  • 使用 KHipster 生成微服务
  • 为生成的 KHipster 微服务应用程序生成 Kubernetes 和 Istio 配置文件
  • 代码讲解
  • 将它们部署在 GCP 上。(技术上讲,可以部署在任何 Kubernetes 集群上)

使用 KHipster 生成微服务

使用 KHipster 生成微服务非常简单易行。让我们创建一个 JDL(JHipster 领域特定语言)文件。

$ mkdir hello-istio
$ cd hello-istio
$ touch app.jdl
Enter fullscreen mode Exit fullscreen mode

请输入以下内容:

// Gateway application
application {
    config {
        baseName gateway,
        applicationType gateway,
        clientFramework react,
        serviceDiscoveryType no
    }
}

// Microservice Application 1
application {
    config {
        baseName application1,
        applicationType  microservice,
        serviceDiscoveryType no,
    }
}
Enter fullscreen mode Exit fullscreen mode

通过安装 KHipster(这是一个 NPM 库)来生成应用程序。

$ npm install -g generator-jhipster-kotlin
Enter fullscreen mode Exit fullscreen mode

安装完成后运行khipster import-jdl application.jdl

好了,我们的微服务应用已经准备就绪。您可以向应用中添加实体等等。点击此处查看关于JDLJDL 示例的更详细指南。

生成 Kubernetes 和 Istio 配置文件

k8s在文件夹内创建一个新文件夹hello-istio

$ khipster kubernetes
Enter fullscreen mode Exit fullscreen mode

注意:它会检查你是否已安装 Docker,因为我们需要 Docker 来创建和推送镜像,并在以后使用它们。

与其他 KHipster / JHipster 命令一样,此命令会询问您一系列问题。让我们来回答这些问题。

我们先选择微服务应用程序来回答第一个问题。

? Which *type* of application would you like to dep?
    Monolithic Application
  > Microservice Application 
Enter fullscreen mode Exit fullscreen mode

下一个问题是关联你的应用程序,你需要为这些应用程序生成配置文件。如果你遵循这个示例文件夹结构,只需使用默认路径即可;否则(感谢你的创意✨),请使用你的微服务应用程序所在的文件夹。

? Enter the root directory where your gateway(s) and microservices are located (../)
Enter fullscreen mode Exit fullscreen mode

下一个问题是选择这里相应的微服务应用程序。

? Which applications do you want to include in your configuration? (Press <space> to select, <a> to toggle all, <i> to invert selection)
❯◯ application1
 ◯ gateway
Enter fullscreen mode Exit fullscreen mode

由于微服务需要监控,这有助于开发人员和运维人员了解正在发生的事情以及故障所在。

JHipster 提供了两种选择:一种是使用我们自己的 JHipster-Console,另一种是使用 Prometheus。在本示例中,我将不使用任何一种。

Do you want to set up monitoring for your applications? (Use arrow keys)
❯ No
  Yes, for logs and metrics with the JHipster Console (based on ELK and Zipkin)
  Yes, for metrics only with Prometheus (only compatible with JHipster >= v3.12)
Enter fullscreen mode Exit fullscreen mode

下一个问题是关于 Kubernetes 命名空间的,我们选择默认值。

? What should we use for the Kubernetes namespace? (default)
Enter fullscreen mode Exit fullscreen mode

由于我们需要创建一个 Docker 镜像并将其推送到 Docker 仓库,那么下一个问题是 Docker 仓库的名称。

? What should we use for the base Docker repository name? sendilkumarn
Enter fullscreen mode Exit fullscreen mode

让我们使用 docker push 命令推送 Docker 镜像。

? What command should we use for push Docker image to the repository? (docker push)
Enter fullscreen mode Exit fullscreen mode

下一个问题是是否需要配置 Istio。这里有三种选项供您选择。

  • 完全不需要 Istio
  • 手动边车喷射系统。
  • 使用标签的自动边车喷射

那么它们之间有什么区别呢Manual / Automatic sidecar injection

  • 如果是手动部署,则需要修改部署 pod 规范,使其包含 sidecar 相关的详细信息。
  • 对于自动化的情况,边车是在 pod 创建时注入的。

我们选择自动注入。这样我们就无需在每次部署时都手动添加它了。

注:请点击此处查看有关边车喷射系统的详细信息。

? Do you want to configure Istio? (Use arrow keys)
  Not required
  Manual sidecar injection (ensure istioctl in $PATH)
❯ Label tag namespace as an automatic injection is already configured
Enter fullscreen mode Exit fullscreen mode

路由和负载均衡是 Istio 开箱即用的最酷的功能之一。

它们存在于你的服务之外,控制着请求到服务的路由,并在服务或服务的各种版本之间进行负载均衡。

下一个问题是是否需要生成 Istio 路由文件。我们选择“是”来生成路由文件。

? Do you want to generate Istio route files?
  No
❯ Yes
Enter fullscreen mode Exit fullscreen mode

路由文件可以帮助您配置路由请求、设置请求超时、切换到 HTTPS、控制流量、熔断和健康检查。

下一个问题是边缘服务的服务类型。我们这里使用 Ingress。

? Choose the kubernetes service type for your edge services
  LoadBalancer - Let a kubernetes cloud provider automatically assign an IP
  NodePort - expose the services to a random port (30000 - 32767) on all cluster nodes
❯ Ingress - create ingresses for your services. Requires a running ingress controller
Enter fullscreen mode Exit fullscreen mode

这里有三个选择。

  • 负载均衡器——这将为服务创建一个外部 IP 地址,您可以使用该 IP 地址访问应用程序。
  • Nodeport — 这将使用集群 IP 并通过静态端口暴露服务。
  • Ingress——它是一组允许入站连接到服务的规则。

既然我们已经选择了IngressDNS 服务器,那么接下来的问题就是指定一个 DNS 服务器来路由服务。如果您有域名,可以直接使用;否则,请在此处添加一个虚拟条目,并修改您的 `etc/hosts` 文件,使 IP 地址与域名匹配。

? What is the root FQDN for your ingress services (e.g. example.com, sub.domain.co, www.10.10.10.10.xip.io, [namespace.ip]...)? (default.192.168.99.100.nip.io) sendilkumarn.com
Enter fullscreen mode Exit fullscreen mode

如果没有 DNS,请编辑您的/etc/hosts文件添加以下内容:

x.x.x.x  sendilkumarn.com
Enter fullscreen mode Exit fullscreen mode

代码讲解

是时候看看 KHipster 生成了什么了。

.
├── README.md
├── application1
│   ├── application1-deployment.yml
│   ├── application1-destination-rule.yml
│   ├── application1-mysql.yml
│   ├── application1-service.yml
│   ├── application1-virtual-service.yml
│   └── jwt-secret.yml
├── gateway
│   ├── gateway-deployment.yml
│   ├── gateway-destination-rule.yml
│   ├── gateway-gateway.yml
│   ├── gateway-mysql.yml
│   ├── gateway-service.yml
│   ├── gateway-virtual-service.yml
│   └── jwt-secret.yml
├── istio
│   ├── grafana-gateway.yml
│   ├── jaeger-gateway.yml
│   └── kiali-gateway.yml
└── kubectl-apply.sh
Enter fullscreen mode Exit fullscreen mode
  • application1文件夹包含微服务应用程序的配置文件
  • gateway文件夹包含微服务网关的配置文件
  • istio文件夹包含 Istio 网关的配置文件。
  • kubectl-apply.sh是一个用于同时部署所有服务的 bash 脚本。

在 Gateway 文件夹内,

其中gate-deployment.yaml包含网关应用程序部署的应用程序配置。

包含gate-destination-rule.yml与负载均衡和连接超时相关的网络定义。

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: gateway-destinationrule
  namespace: default
spec:
  host: gateway
  trafficPolicy:
    loadBalancer:
      simple: RANDOM
    connectionPool:
      tcp:
        maxConnections: 30
        connectTimeout: 100ms
      http:
        http1MaxPendingRequests: 10
        http2MaxRequests: 100
        maxRequestsPerConnection: 10
        maxRetries: 5
    outlierDetection:
      consecutiveErrors: 5
      interval: 30s
      baseEjectionTime: 60s
  subsets:
    - name: v1
      labels:
        version: 'v1'
Enter fullscreen mode Exit fullscreen mode

在规范中,我们将主机称为网关应用程序。

然后我们定义交通策略

负载均衡器可以是简单的,也可以是一致的。

简单易用——预配置。默认情况下支持

  • 循环赛
  • 最少连接
  • 随机的
  • 通过

这里我们选择了随机路由。Istio 团队建议,如果没有健康配置,随机路由比轮询路由更好。它会检查哪些服务运行状况良好,并将请求路由到这些服务。更多信息,请点击此处。

gateway-gateway.yml包含 Istio 服务的配置Istio’s Ingress gateway。该服务位于 Istio 创建的服务网格边缘。它配置暴露的端口和协议,并帮助连接到底层服务。

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: gateway-gateway
  namespace: default
  labels:
    gateway: gateway-gateway
    istio: ingressgateway
spec:
  selector:
    istio: ingressgateway
  servers:
    - port:
        number: 80
        name: http
        protocol: HTTP
      hosts:
        - gateway.sendilkumarn.com
    - port:
        number: 80
        name: http2
        protocol: HTTP2
      hosts:
        - gateway.sendilkumarn.com
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: gateway-gw-virtualservice
  namespace: default
  labels:
    service: gateway-gw-virtualservice
spec:
  hosts:
    - gateway.sendilkumarn.com
  gateways:
    - gateway-gateway
  http:
    - match:
        - uri:
            prefix: /application1/
      route:
        - destination:
            host: application1
    - match:
        - uri:
            prefix: /
      route:
        - destination:
            host: gateway
Enter fullscreen mode Exit fullscreen mode

请注意,配置文件中的主机名是基于我们提供的 DNS 名称。这样,整个应用程序就可以通过浏览器轻松访问。

配置文件中还定义了一个虚拟服务。由于 Istio 中的 Ingress 网关不包含任何流量路由配置(这与 Kubernetes 的做法截然相反),因此这里的虚拟服务有助于实现流量路由。

其中gate-service.yml包含微服务网关服务的配置。

该文件gate-mysql.yml包含 . 的配置信息MySQL Database。(此文件可能因您在生成应用程序时选择的生产数据库而异。)

gate-virtual-service.yaml包含虚拟服务的配置,该虚拟服务有助于在网格中路由请求。

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: gateway-virtualservice
  namespace: default
spec:
  hosts:
    - gateway
  http:
    - route:
        - destination:
            host: gateway
            subset: 'v1'
          weight: 100
      retries:
        attempts: 3
        perTryTimeout: 2s
Enter fullscreen mode Exit fullscreen mode

同样,微服务应用程序也有相同的配置。

Istio 文件夹包含一些用于在命名空间内运行的服务的网关istio-system

  • graphana - 分析和监控
  • jaegar - 端到端分布式跟踪
  • kiali - 服务网格可观测性和配置

哇,这么多配置文件。不过KHipster/JHipster能让你的工作轻松很多KHipster FTW

将应用程序部署到 GCP

现在到了有趣的部分,将生成的应用程序部署到运行在 Google Cloud 上的 Google Kubernetes Engine 上。

登录 Google Cloud 控制台,您可以创建新项目或使用现有项目。我使用的项目是:amazing-istio

项目创建完成后,在项目内创建一个 Kubernetes 集群。

安装Google Cloud SDK

gcloud container clusters create hello-istio --region=us-central1-a --machine-type=n1-standard-2 --num-nodes=8  --cluster-version=1.12.7-gke.22
Enter fullscreen mode Exit fullscreen mode

这里我们使用 gcloud 工具创建一个集群,集群名称为 `<cluster name>` hello-istio,区域为 `<region>` us-central1-a,机器类型为 `<machine type> n1-standard-2`(根据需要选择),节点数为 `<node number>` 8

上述命令将启动 8 个节点的 Kubernetes 集群。这对于我们测试这个简单的微服务应用程序来说绰绰有余。

另外,请注意 --cluster-version 参数,该参数将 Kubernetes 集群设置为version 1.12.7-gke.22

注:如果您想更改此处的任何内容,请随意更改。

您也可以使用用户界面来生成集群。

集群启动需要一些时间。我们去喝杯咖啡☕️,吃个披萨🍪吧。

集群启动并运行后,让我们从您的云 shell(或)终端连接到集群。

gcloud container clusters get-credentials hello-istio --zone us-central1-a --project amazing-istio
Enter fullscreen mode Exit fullscreen mode

下一步,设置集群的管理员权限。打开云 shell(或终端),然后使用以下命令启用管理员权限。

kubectl create clusterrolebinding cluster-admin-binding --clusterrole=cluster-admin --user=$(gcloud config get-value core/account)
Enter fullscreen mode Exit fullscreen mode

现在是时候Istio在 Kubernetes 集群内部进行安装了。

最简单的安装方法是下载最新版本的 Istio。

curl -L https://git.io/getLatestIstio | sh -
Enter fullscreen mode Exit fullscreen mode

它会获取最新的 Istio 源,然后将 Istio 添加到路径中。

export PATH="$PATH:/home/<username>/istio-x.x.x/bin"
Enter fullscreen mode Exit fullscreen mode

检查 Kubernetes 版本与 Istio 版本的兼容性。

安装 Istio 所需的 CRD

for i in istio-x.x.x/install/kubernetes/helm/istio-init/files/crd*yaml; do kubectl apply -f $i; done
Enter fullscreen mode Exit fullscreen mode

现在应用该istio-demo.yaml文件,在集群中创建与 Istio 相关的组件。这将istio-system在集群中创建一个命名空间,并在集群内部安装所有必要的组件。

kubectl apply -f istio-x.x.x/install/kubernetes/istio-demo.yaml
Enter fullscreen mode Exit fullscreen mode

您可以通过运行以下命令来检查使用情况和安装情况。

kubectl get pods -n istio-system
Enter fullscreen mode Exit fullscreen mode

这将显示命名空间中正在运行的 pod 列表istio-system

现在让我们转到本地生成的 K8s 配置文件,开始部署它们。

KHipster/JHipster Kubernetes 集群部署完成后,提示缺少一些 Docker 镜像。现在我们需要创建这些 Docker 镜像并将其推送到 Docker 仓库。之后,我们就可以使用 Kubernetes 集群来获取这些镜像,并将它们部署到 GCP 上。

要构建 Docker 镜像,请在 Microservice Gateway 和 Application 文件夹中运行以下命令。

./mvnw verify -Pprod dockerfile:build
Enter fullscreen mode Exit fullscreen mode

然后我们需要给构建好的 Docker 镜像打标签,并将其推送到 Docker 仓库。

docker image tag gate <docker-repo-name>/gateway
docker image push <docker-repo-name>/gateway
docker image tag gate <docker-repo-name>/application1 
docker image push <docker-repo-name>/application1
Enter fullscreen mode Exit fullscreen mode

完成后,前往 k8s 文件夹并运行

注意:如果您尚未将集群连接到本地终端,请执行以下命令

$ gcloud container clusters get-credentials hello-istio --zone us-central1-a --project <your project name>
Enter fullscreen mode Exit fullscreen mode
$ ./kubectl-apply.sh
Enter fullscreen mode Exit fullscreen mode

这将把所有服务和数据库部署到 Kubernetes 集群中。完美!您已经使用 Istio 将出色的微服务应用程序部署到了运行在 GCP 上的 GKE 中。

请前往gate.sendilkumarn.com (or) any URLgiven 查看应用程序是否已启动并运行。

恭喜🎉🎉🎉🎉。

如果这是你的第一次申请,恭喜你,请分享你的故事。

现在,您只需考虑如何设计您的应用程序,而 JHipster 可以让您轻松创建、开发和部署您的想法到生产环境中。

你可以在推特上关注我。

如果你喜欢这篇文章,请点赞或留言。❤️

文章来源:https://dev.to/sendilkumarn/easy-microservices-with-kubernetes-and-istio-3nl3