使用 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
请输入以下内容:
// Gateway application
application {
config {
baseName gateway,
applicationType gateway,
clientFramework react,
serviceDiscoveryType no
}
}
// Microservice Application 1
application {
config {
baseName application1,
applicationType microservice,
serviceDiscoveryType no,
}
}
通过安装 KHipster(这是一个 NPM 库)来生成应用程序。
$ npm install -g generator-jhipster-kotlin
安装完成后运行khipster import-jdl application.jdl。
好了,我们的微服务应用已经准备就绪。您可以向应用中添加实体等等。点击此处查看关于JDL和JDL 示例的更详细指南。
生成 Kubernetes 和 Istio 配置文件
k8s在文件夹内创建一个新文件夹hello-istio。
$ khipster kubernetes
注意:它会检查你是否已安装 Docker,因为我们需要 Docker 来创建和推送镜像,并在以后使用它们。
与其他 KHipster / JHipster 命令一样,此命令会询问您一系列问题。让我们来回答这些问题。
我们先选择微服务应用程序来回答第一个问题。
? Which *type* of application would you like to dep?
Monolithic Application
> Microservice Application
下一个问题是关联你的应用程序,你需要为这些应用程序生成配置文件。如果你遵循这个示例文件夹结构,只需使用默认路径即可;否则(感谢你的创意✨),请使用你的微服务应用程序所在的文件夹。
? Enter the root directory where your gateway(s) and microservices are located (../)
下一个问题是选择这里相应的微服务应用程序。
? Which applications do you want to include in your configuration? (Press <space> to select, <a> to toggle all, <i> to invert selection)
❯◯ application1
◯ gateway
由于微服务需要监控,这有助于开发人员和运维人员了解正在发生的事情以及故障所在。
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)
下一个问题是关于 Kubernetes 命名空间的,我们选择默认值。
? What should we use for the Kubernetes namespace? (default)
由于我们需要创建一个 Docker 镜像并将其推送到 Docker 仓库,那么下一个问题是 Docker 仓库的名称。
? What should we use for the base Docker repository name? sendilkumarn
让我们使用 docker push 命令推送 Docker 镜像。
? What command should we use for push Docker image to the repository? (docker push)
下一个问题是是否需要配置 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
路由和负载均衡是 Istio 开箱即用的最酷的功能之一。
它们存在于你的服务之外,控制着请求到服务的路由,并在服务或服务的各种版本之间进行负载均衡。
下一个问题是是否需要生成 Istio 路由文件。我们选择“是”来生成路由文件。
? Do you want to generate Istio route files?
No
❯ Yes
路由文件可以帮助您配置路由请求、设置请求超时、切换到 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
这里有三个选择。
- 负载均衡器——这将为服务创建一个外部 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
如果没有 DNS,请编辑您的/etc/hosts文件添加以下内容:
x.x.x.x sendilkumarn.com
代码讲解
是时候看看 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
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'
在规范中,我们将主机称为网关应用程序。
然后我们定义交通策略
负载均衡器可以是简单的,也可以是一致的。
简单易用——预配置。默认情况下支持
- 循环赛
- 最少连接
- 随机的
- 通过
这里我们选择了随机路由。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
请注意,配置文件中的主机名是基于我们提供的 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
同样,微服务应用程序也有相同的配置。
Istio 文件夹包含一些用于在命名空间内运行的服务的网关istio-system。
哇,这么多配置文件。不过KHipster/JHipster能让你的工作轻松很多KHipster FTW。
将应用程序部署到 GCP
现在到了有趣的部分,将生成的应用程序部署到运行在 Google Cloud 上的 Google Kubernetes Engine 上。
登录 Google Cloud 控制台,您可以创建新项目或使用现有项目。我使用的项目是:amazing-istio
项目创建完成后,在项目内创建一个 Kubernetes 集群。
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
这里我们使用 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
下一步,设置集群的管理员权限。打开云 shell(或终端),然后使用以下命令启用管理员权限。
kubectl create clusterrolebinding cluster-admin-binding --clusterrole=cluster-admin --user=$(gcloud config get-value core/account)
现在是时候Istio在 Kubernetes 集群内部进行安装了。
最简单的安装方法是下载最新版本的 Istio。
curl -L https://git.io/getLatestIstio | sh -
它会获取最新的 Istio 源,然后将 Istio 添加到路径中。
export PATH="$PATH:/home/<username>/istio-x.x.x/bin"
检查 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
现在应用该istio-demo.yaml文件,在集群中创建与 Istio 相关的组件。这将istio-system在集群中创建一个命名空间,并在集群内部安装所有必要的组件。
kubectl apply -f istio-x.x.x/install/kubernetes/istio-demo.yaml
您可以通过运行以下命令来检查使用情况和安装情况。
kubectl get pods -n istio-system
这将显示命名空间中正在运行的 pod 列表istio-system。
现在让我们转到本地生成的 K8s 配置文件,开始部署它们。
KHipster/JHipster Kubernetes 集群部署完成后,提示缺少一些 Docker 镜像。现在我们需要创建这些 Docker 镜像并将其推送到 Docker 仓库。之后,我们就可以使用 Kubernetes 集群来获取这些镜像,并将它们部署到 GCP 上。
要构建 Docker 镜像,请在 Microservice Gateway 和 Application 文件夹中运行以下命令。
./mvnw verify -Pprod dockerfile:build
然后我们需要给构建好的 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
完成后,前往 k8s 文件夹并运行
注意:如果您尚未将集群连接到本地终端,请执行以下命令
$ gcloud container clusters get-credentials hello-istio --zone us-central1-a --project <your project name>
$ ./kubectl-apply.sh
这将把所有服务和数据库部署到 Kubernetes 集群中。完美!您已经使用 Istio 将出色的微服务应用程序部署到了运行在 GCP 上的 GKE 中。
请前往gate.sendilkumarn.com (or) any URLgiven 查看应用程序是否已启动并运行。
恭喜🎉🎉🎉🎉。
如果这是你的第一次申请,恭喜你,请分享你的故事。
现在,您只需考虑如何设计您的应用程序,而 JHipster 可以让您轻松创建、开发和部署您的想法到生产环境中。
你可以在推特上关注我。
如果你喜欢这篇文章,请点赞或留言。❤️
文章来源:https://dev.to/sendilkumarn/easy-microservices-with-kubernetes-and-istio-3nl3


