订阅业界RSS CSDN首页> 业界

利用 Kabanero、Appsody 和 Codewind,在 Kubernetes 上构建 Spring Boot 应用

发表于2020-02-17 18:27| 来源IBM| 作者IBM

摘要:介绍如何利用 Kabanero 在 Kubernetes 上开发现代微服务 作者:Hafid Haddouti 更新日期:2019 年 10 月 15 日 | 发布日期:2019 年 10 月 15 日 要构建现代化云原生应用,您必须考虑应用的方方面面,包括在适当的位置纳入业务逻辑的最佳方式,以及如何处理弹性、可靠性和监控这类技术考量因素等等。此外,在云端或...

介绍如何利用 Kabanero 在 Kubernetes 上开发现代微服务

作者:Hafid Haddouti

更新日期:2019 年 10 月 15 日 | 发布日期:2019 年 10 月 15 日


要构建现代化云原生应用,您必须考虑应用的方方面面,包括在适当的位置纳入业务逻辑的最佳方式,以及如何处理弹性、可靠性和监控这类技术考量因素等等。此外,在云端或 Kubernetes 集群中运行应用时,您还必须处理 Dockerfiles 的构建和必要的 Kubernetes 资源文件。

在 DevOps 时代,团队负责在整个应用生命周期构建和运行应用。这种情况下,选择理想的工具对于您减少构建和部署云原生应用所需的工作至关重要。IBM 的全新开源工具 - Kabanero、Appsody 和 Codewind - 旨在帮助开发人员更轻松地构建云原生应用,并在 Kubernetes 上部署该应用。

在本文中,我们将为您介绍 Kabanero,以及如何利用 Kabanero、Appsody 和 Codewind,构建在 Kubernetes 上运行的 Spring Boot 应用。

在讨论具体步骤之前,我们将简单介绍一下这些新的开源组件:

  • Kabanero 将多个成熟的开源项目(如 Appsody 和 Codewind)集成一体,以支持 DevOps,并减少基础架构方面的工作,从而支持云原生开发。
  • Appsody 提供预定义的代码堆栈,尽可能减少创建项目的初期工作。目前,Appsody 提供面向 Eclipse Microprofile、Spring Boot、Quarkus、Node.js、Node.js Express 和 Swift 应用的堆栈。更多堆栈正在开发中,您可以定制现有堆栈或构建新堆栈。通过使用这些堆栈,企业或者大型开发团队能够设置应用结构的最低标准。
  • Eclipse Codewind 是一个 IDE 扩展组件,您可以利用它在容器内构建、测试和部署应用。鉴于您使用的是您选择的 IDE(目前 Eclipse Codewind 支持 Eclipse、Eclipse Che 和 VSCode),因此,您不需要熟悉容器环境。

在本教材中,我使用了以下版本:

  • Knative:v0.7
  • Appsody:v0.4.5
  • Codewind:v0.4.0

先决条件

要完成本教材中的各个步骤,您需要在系统上安装并运行以下工具:

安装

我们将结合使用 VSCode 和 Codewind 扩展组件,在本地 Kubernetes 集群中运行示例。您可以针对 IBM Cloud Kubernetes Services 或 OpenShift 集群使用同样的方法。

  • 安装 Appsody CLI
  • 从 VSCode 市场安装 Codewind - 您只需要在市场上搜索“Codewind”。在这个过程中,您也将安装一些 Docker 映像和 Appsody 插件
eclipse/codewind-initialize-amd64                                    0.4.0                  7f31c5b7db69        6 days ago           206MB
codewind-initialize-amd64                         0.4.0                  7f31c5b7db69        6 days ago           206MB
codewind-performance-amd64                                            0.4.0                  09ac0adfa6b5        6 days ago           86.4MB
eclipse/codewind-performance-amd64                                           0.4.0                  09ac0adfa6b5        6 days ago           86.4MB
codewind-pfe-amd64                                                      0.4.0                  224a9df6df08        6 days ago           706MB
eclipse/codewind-pfe-amd64                                                  0.4.0                  224a9df6df08        6 days ago           706MB

利用 Appsody 创建 Spring Boot 项目

要创建新的 Spring Boot 项目请使用源自 Appsody java-spring-boot2 堆栈。

Appsody 堆栈代表的是 Kubernetes 应用的基础,包含基础容器映像和项目模板。项目模板使用基础容器映像,提供运行时和依赖关系,旨在让您能够轻松启用项目。

点击此处,查看当前的默认堆栈存储库。您也可以增加其他存储库。

要创建新项目,我们将使用源自 Appsody 的 Spring Boot 2 堆栈。使用 appsody list 命令,查看可用堆栈。

$ appsody list
Your default repository is now set to appsodyhub
 
REPO        ID                VERSION   TEMPLATES         DESCRIPTION
*appsodyhub java-microprofile 0.2.14    *default          Eclipse MicroProfile on Open Liberty & OpenJ9 using Maven
*appsodyhub java-spring-boot2 0.3.14    *default, kotlin  Spring Boot using OpenJ9 and Maven
*appsodyhub nodejs            0.2.5     *simple           Runtime for Node.js applications
*appsodyhub nodejs-express    0.2.6     *simple, skaffold Express web framework for Node.js
*appsodyhub nodejs-loopback   0.1.4     *scaffold         LoopBack 4 API Framework for Node.js
*appsodyhub python-flask      0.1.3     *simple           Flask web Framework for Python
*appsodyhub swift             0.1.4     *simple           Runtime for Swift applications

在空目录中利用 Spring Boot 2 模板创建新目录。要做到这一点利用您选择的堆栈运行 appsody init 命令。

$ mkdir kabanero-test-springboot2
$ cd kabanero-test-springboot2
$ appsody init java-spring-boot2
 
Running appsody init...
Downloading java-spring-boot2 template project from https://github.com/appsody/stacks/releases/download/java-spring-boot2-v0.3.14/incubator.java-spring-boot2.v0.3.14.templates.default.tar.gz
Download complete.Extracting files from java-spring-boot2.tar.gz
Setting up the development environment
Running command: docker pull appsody/java-spring-boot2:0.3
Running command: docker run --rm --entrypoint /bin/bash appsody/java-spring-boot2:0.3 -c find /project -type f -name .appsody-init.sh
Extracting project from development environment
Running command: docker create --name my-project-extract -v /Users/haddouti/codewind-workspace/kabanero-test-springboot2/.:/project/user-app -v /Users/haddouti/.m2/repository:/mvn/repository appsody/java-spring-boot2:0.3
Running command: docker cp my-project-extract:/project /Users/haddouti/.appsody/extract/kabanero-test-springboot2
Running command: docker rm my-project-extract -f
Project extracted to /Users/haddouti/codewind-workspace/kabanero-test-springboot2/.appsody_init
Running command:./.appsody-init.sh
Successfully initialized Appsody project
 
 
$ ls -la
total 24
drwxr-xr-x  7 haddouti  staff   224 Sep 25 22:21 .
drwxr-xr-x  8 haddouti  staff   256 Sep 25 22:20 ..
-rw-r--r--  1 haddouti  staff    37 Sep 25 22:21 .appsody-config.yaml
-rw-r--r--  1 haddouti  staff   288 Sep 25 22:21 .gitignore
drwxr-xr-x  4 haddouti  staff   128 Sep 25 22:21 .vscode
-rw-r--r--  1 haddouti  staff  1189 Sep 25 22:21 pom.xml
drwxr-xr-x  4 haddouti  staff   128 Sep 25 22:21 src

结果您将利用运行状况端点监控端点获得一个基于 Spring Boot 2 Maven 的工作框架项目。.Appsody-config.yaml 包含所用 Appsody 堆栈的引用。

# cat .appsody-config.yaml
stack: appsody/java-spring-boot2:0.3

Spring Boot 应用依赖 spring-boot2-stack,后者将管理依赖关系和插件。其中包括 Prometheus、OpenTracing 和面向动态重新加载的 Spring Developer Tool。

下面,您将看到 pom.xml 依赖关系:

<parent><!--required parent POM-->
<groupId>dev.appsody</groupId>
<artifactId>spring-boot2-stack</artifactId>
<version>[0.3, 0.4)</version>
<relativePath/>
</parent>

如果您在项目目录中使用 appsody run它将构建和运行应用且您将在 http://localhost:8080/ 中找到该应用

 

在内部,Appsody 构建了一个 Docker 映像,并运行容器,以构建和测试项目。一旦项目通过测试,它将运行容器。

$ docker ps
CONTAINER ID        IMAGE                              COMMAND                  CREATED              STATUS              PORTS                                                                                              NAMES
40e448a63904        appsody/java-spring-boot2:0.3      "/appsody/appsody-co…"   About a minute ago   Up About a minute   0.0.0.0:5005->5005/tcp, 0.0.0.0:8080->8080/tcp, 0.0.0.0:8443->8443/tcp, 0.0.0.0:35729->35729/tcp   kabanero-test-springboot2-dev

要终止应用请使用 ctrl+c 或者在项目目录中输入 appsody stop

$ appsody stop
 
Stopping development environment
Running command: docker[stop kabanero-test-springboot-dev]

要获得 Docker 容器您可以明确调用 appsody build以便提取所有工具构建 Dockerfile并生成 Docker 容器。所有文件都保存在 $HOME/.appsody/extract/<project-name>/ 中,如以下代码所示:

# appsody build
 
Extracting project from development environment
Running command: docker pull appsody/java-spring-boot2:0.3
Running command: docker create --name kabanero-test-springboot2-extract -v /Users/haddouti/codewind-workspace/kabanero-test-springboot2/.:/project/user-app -v /Users/haddouti/.m2/repository:/mvn/repository appsody/java-spring-boot2:0.3
Running command: docker cp kabanero-test-springboot2-extract:/project /Users/haddouti/.appsody/extract/kabanero-test-springboot2
Running command: docker rm kabanero-test-springboot2-extract -f
Project extracted to /Users/haddouti/.appsody/extract/kabanero-test-springboot2
Running docker command: docker build -t kabanero-test-springboot2 -f /Users/haddouti/.appsody/extract/kabanero-test-springboot2/Dockerfile /Users/haddouti/.appsody/extract/kabanero-test-springboot2
[Docker] Sending build context to Docker daemon  597.5kB
[Docker] Step 1/16 :FROM appsody/java-spring-boot2:0.3 as compile
[Docker]  ---> 4ea7128b4908
[Docker] Step 2/16 :COPY ./project
[Docker]  ---> fba0fb3e1e4d
[Docker] Step 3/16 :WORKDIR /project/user-app
[Docker]  ---> Running in 62b15dd73734
[Docker] Removing intermediate container 62b15dd73734
[Docker]  ---> 83fd7058ad5b
[Docker] Step 4/16 :RUN /project/util/check_version build  && /project/java-spring-boot2-build.sh package
[Docker]  ---> Running in 7e1232e17fb4
[Docker] Installing parent dev.appsody:spring-boot2-stack:0.3.14
[Docker] > mvn install -q -f /project/appsody-boot2-pom.xml
...
[Docker]  ---> Running in 254e0c44af86
[Docker] Removing intermediate container 254e0c44af86
[Docker]  ---> 7b3cf8460bc3
[Docker] Successfully built 7b3cf8460bc3
[Docker] Successfully tagged kabanero-test-springboot2:latest
Built docker image kabanero-test-springboot2
 
# ll $HOME/.appsody/extract/kabanero-test-springboot2
total 88
-rw-rw-r--  1 haddouti  staff   926B Sep 25 15:20 Dockerfile
-rw-rw-r--  1 haddouti  staff   6.6K Sep 25 15:20 appsody-boot2-pom.xml
-rwxrwxr-x  1 haddouti  staff   4.8K Sep 25 15:19 java-spring-boot2-build.sh
-rw-rw-r--  1 haddouti  staff   628B Sep 25 15:19 mvn-stack-settings.xml
-rwxrwxr-x  1 haddouti  staff   9.8K Sep 25 15:20 mvnw
-rw-rw-r--  1 haddouti  staff   6.5K Sep 25 15:20 mvnw.cmd
drwxr-xr-x  9 haddouti  staff   288B Sep 25 22:25 user-app
drwxrwxr-x  6 haddouti  staff   192B Sep 25 15:20 util
 
# docker images | grep -i kabanero-test-springboot2
kabanero-test-springboot2                                                                                                    latest                 7b3cf8460bc3        3 minutes ago       400MB

Codewind 集成

Codewind 提供了一个 Appsody 插件您可以利用该插件管理 Appsody 项目。在 Codewind 视图中您可以添加一个现有项目该项目可能保存在 $HOME/codewind-workspace/ ),或者利用现有的 Appsody 模板创建新项目。

 

项目的上下文菜单提供不同的选项,比如在默认浏览器中打开应用、重启应用,或者在 Docker 容器中打开 shell。您还可以从 Docker 容器访问日志文件。

 

Codewind 集成还支持应用运行时的动态重新加载。因此,您对项目所做的任何修改都将重构应用。

比如,如果您修改 HTML 文件 kabanero-test-springboot2/src/main/resources/public/index.html,它将重启 Spring Boot 服务器,变更将立即显现。

借助 Codewind,您无需接触基础 Docker 容器,即可处理云原生应用。

迁移至云端

要将应用部署到 Kubernetes 集群,您可以复用构建的 Docker 映像,或者您可以将责任转移给 Appsody Operator 或 Knative Serving。在该案例中,只需使用 appsody deploy,即可提取工具,将 Docker 映像部署到 Kubernetes 集群。

您将使用 Knative Serving 或 Appsody Operator 管理部署,具体取决于您所用的堆栈。通常,Knative Serving 是后备方案,您可以利用 --knative 标记实施该方案。

首选的 Appsody Operator 负责部署应用,并执行处理路由、高可用性和持久卷管理等活动。

Appsody 将创建一个可随时部署的清单文件,比如,如下所示:

apiVersion: appsody.dev/v1beta1
kind:AppsodyApplication
metadata:
  name: kabanero-test-springboot2
spec:
  # Add fields here
  version:1.0.0
  applicationImage: dev.local/kabanero-test-springboot2
  stack: java-spring-boot2
  service:
    type:NodePort
    port:8080
    annotations:
      prometheus.io/scrape:'true'
      prometheus.io/path:'/actuator/prometheus'
  readinessProbe:
    failureThreshold:12
    httpGet:
      path:/actuator/health
      port:8080
    initialDelaySeconds:5
    periodSeconds:2
  livenessProbe:
    failureThreshold:12
    httpGet:
      path:/actuator/liveness
      port:8080
    initialDelaySeconds:5
    periodSeconds:2
  expose: true
  # In case Knative is used, is the next line enabled
  #createKnativeService: true

这样您可以利用我们的应用生成一个运行的 pod

# kubect get pods
NAME                                          READY   STATUS    RESTARTS   AGE
appsody-operator-859b97bb98-kwpz4             1/1     Running   0          2m41s
kabanero-test-springboot-595c4cc494-rwh5z     1/1     Running   0          64s

如果您使用 Knative Serving 部署应用,您将创建以下资源:

  • 服务、部署和 ReplicaSet
  • Knative Service (service.serving.knative.dev):对整个生命周期和资源对象创建的综合管理
  • Knative Revision (revision.serving.knative.dev):代码和配置的快照
  • Knative Route (route.serving.knative.dev):将网络端点映射到修订
  • Knative Configuration (configuration.serving.knative.dev):维持部署的预期状态
  • 以及面向 PodAutoscaling 的多种其他内部 Knative 资源,Image Caching。
# kubectl get serving
NAME                                                  URL                                                         LATESTCREATED                   LATESTREADY                     READY   REASON
service.serving.knative.dev/kabanero-test-springboot  http://kabanero-test-springboot.default.9.145.41.194.nip.io kabanero-test-springboot-4mvb4  kabanero-test-springboot-4mvb4  True
 
NAME                                                  URL                                                         READY   REASON
route.serving.knative.dev/kabanero-test-springboot    http://kabanero-test-springboot.default.9.145.41.194.nip.io True
 
NAME                                                          SERVICE NAME                    GENERATION   READY   REASON
revision.serving.knative.dev/kabanero-test-springboot-4mvb4   kabanero-test-springboot-4mvb4  1            True
 
NAME                                                        LATESTCREATED                   LATESTREADY                     READY   REASON
configuration.serving.knative.dev/kabanero-test-springboot  kabanero-test-springboot-4mvb4  kabanero-test-springboot-4mvb4  True

如需了解更多信息请阅读 Knative Serving 文档

要删除应用和所有 Kubernetes 资源请使用以下命令appsody deploy delete

结语

Kabanero 是新兴且快速变化的云原生环境中的一个新工具。在本文中,我们介绍了 Kabanero 如何与其他热门的开源项目(比如 Knative、Istio 和 Tekton 等等)相集成,以及开箱即用的 Kabanero 如何处理配置、安装和其他基础架构活动。它允许您利用提供的提取功能,更好地将应用逻辑从所用的基础架构中解耦出来。

随着支持的 Appsody 堆栈越来越多,您可以构建和管理更多统一的云原生应用。

了解有关 Kabanero Enterpirse 的更多信息,这是一个完全受支持的企业级 Kabanero 实施项目。