我使用Codewind在Kubernetes上构建了一个Spring Boot应用

首先

Kabanero是一个开源项目,在Kubernetes环境中提供了一组用于应用开发和运营的工具(如Knative、Tekton、Appsody、Codewind等)。在IBM Cloud Pak for Applications中,它被命名为Accelerators for Teams,提供了云原生应用开发框架。

然而,事实上,在写这篇文章的时候,IBM Cloud Pak for Applications已经停止销售,并且后续产品WebSphere Hybrid Edition不再提供Accelerators for Teams。

因此,虽然现在有点晚了,但作为想尝试云原生应用开发的起点,我试着完成了IBM Developer网站上的”使用Kabanero、Appsody和Codewind构建基于Kubernetes的Spring Boot应用程序”教程,并记录下了步骤。

环境

在本教程中,需要以下前提软件。

Docker

docker是一個後續所提及的kind和Codewind都需要安裝的前提條件。需要v17.06或以上的版本。

Kubernetes

通過使用kind或minikube能夠在本地PC上建立Kubernetes集群。本次使用了kind(Kubernetes IN Docker)。

Knative

Knative是在Kubernetes上構建無服務器基礎設施的一個組件。本次在kind上進行了設置。

Appsody CLI

Appsody CLI是一個能夠在VS Code或Eclipse等IDE中開發和建構雲原生應用程序的工具。本次使用了VS Code。

Codewind

Codewind是在VS Code或Eclipse等IDE中開發和建構雲原生應用程序的工具。本次使用了VS Code。

这次使用的环境如下:
Ubuntu 20.04.3
Docker版本20.10.12
docker-compose版本1.29.2
kind版本0.11.1
Knative版本1.1.0
Visual Studio Code
Codewind版本0.14.1
Appsody版本0.6.5

安装配置

亲切

由于kind在本次使用的Kubernetes环境中非常实用和方便,所以我们将其设置步骤整理到了另一篇文章中。
在Linux环境下运行Kubernetes集群。

Docker:容器化

由于Docker Engine是`kind`的前提条件,所以请参考上述其他文章。
顺便说一下,在Linux环境中,作为Codewind的前提条件,也需要安装Docker Compose,请按照官方提供的步骤进行安装。

    docker-composeをダウンロードして、実行権限を付与します。
$ sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose
    コマンド実行してみます。以下のようにバージョンが表示されればOKです。
$ docker-compose --version
docker-compose version 1.29.2, build 5becea4c

Knative: 原生中国文字如下:
Knative (原生事务)

因为Knative也可以用于通用用途,所以将设置步骤整理在另一篇文章中。使用kind + Knative在本地创建无服务器环境。

Applications身份认证接口命令行工具 (Appsody CLI)

安装 Appsody CLI。如果你使用的是 Linux 环境,需要将用户添加到 docker 组以便访问 docker。请参考 Appsody 的 Release 页面,下载并安装最新的软件包。在这次操作中,使用的是 appsody_0.6.5_amd64.deb。

VS Code与Codewind

image.png

应用程序开发

创建一个Spring Boot项目

在本教程中,我们使用Appsody CLI来创建项目,但是这次我们将尝试仅使用Codewind的功能来进行操作,而不需要安装Appsody CLI。

image.png

输入姓名并按下Enter,选择目录后,将从名为java-spring-boot2的模板开始创建项目。以下是日志摘录,但可以看出它在内部拉取Docker镜像并执行。

Running development environment...
Pulling docker image docker.io/appsody/java-spring-boot2:0.3
Running command: docker pull docker.io/appsody/java-spring-boot2:0.3
0.3: Pulling from appsody/java-spring-boot2
Digest: sha256:b1dc6398a112888f2b4a5e46a517f5f39b13d0712132e2ec53d9382c15be8aaa
Status: Image is up to date for appsody/java-spring-boot2:0.3
[Warning] The stack image does not contain APPSODY_DEPS
Running command: docker run --rm -v appsody-controller-0.3.5:/.appsody appsody/init-controller:0.3.5
Unable to find image 'appsody/init-controller:0.3.5' locally
0.3.5: Pulling from appsody/init-controller
0669b0daf1fb: Pulling fs layer
e83a650ab835: Pulling fs layer
050bec57020f: Pulling fs layer
050bec57020f: Verifying Checksum
050bec57020f: Download complete
0669b0daf1fb: Download complete
0669b0daf1fb: Pull complete
e83a650ab835: Verifying Checksum
e83a650ab835: Download complete
e83a650ab835: Pull complete
050bec57020f: Pull complete
Digest: sha256:056ff05de4a425b710d970d308faf1f022ed50ddbf591cc571cc9e776128b98d
Status: Downloaded newer image for appsody/init-controller:0.3.5
Running command: docker run --rm -P --name cw-kabanerotestspringboot2-35a7a7d0-60c0-11ec-a1db-bb1d995c8778 --network codewind_network -u 0:0 -e "APPSODY_USER=0" -e "APPSODY_GROUP=0" -v /home/goma/codewind-data/kabanero-test-springboot2/:/project/user-app -v appsody-kabanero-test-springboot2-cwdeps1:/mvn/repository -v appsody-controller-0.3.5:/.appsody -t --entrypoint /.appsody/appsody-controller docker.io/appsody/java-spring-boot2:0.3 "--mode=run"
[Container] Running command:  /project/java-spring-boot2-build.sh run
[Container] [0;34mInstalling parent dev.appsody:spring-boot2-stack:0.3.30 and required dependencies...[0m
[Container] [0;32m> mvn install -q -f /project/appsody-boot2-pom.xml[0m
image.png
image.png

我尝试编辑源代码。我在VS Code中打开src/main/resources/public/index.html并尝试重写文本。保存更改后,通过浏览器重新显示,可以确认更改立即生效。

  <body>
    <h3>Hello from Appsody & Codewind!</h3>
image.png

部署至Kubernetes集群。

下一步是最终部署到 Kubernetes 集群上。
事实上,我本想在 Kubernetes 上设置 Codewind,并通过 VS Code 进行远程连接和操作,但是遇到了一些问题,现在暂时先使用 Appsody CLI 进行执行。

    Appsody Operatorのインストール

请安装Appsody提供的功能来将开发的应用部署到Kubernetes环境中。

$ sudo appsody operator install 
    プロジェクトをビルド、DockerリポジトリーへPush

请先在VS Code中转到已创建的项目(kabanero-test-springboot2)的目录,并开始工作。
首先进行构建。

$ sudo appsody build --knative -t {username}/kabanero-test-springboot2
$ sudo docker push {username}/kabanero-test-springboot2

将{username}替换为您的Docker Hub用户名。appsody命令中的–knative选项用于将其部署为Knative服务。

将构建的镜像推送到Docker仓库。

$ sudo docker push {username}/kabanero-test-springboot2
    デプロイ

部署应用程序。

$ sudo appsody deploy --knative -t {username}/kabanero-test-springboot2

在上面,我们可以直接部署,做法如下:
1. 通过执行”appsody deploy –generate-only”命令生成yaml文件
2. 使用”kubectl apply -f app-deploy.yaml”命令进行部署
以下是生成的app-deploy.yaml示例。顺便提一句,指定了–knative选项时,”createKnativeService”将会设置为true。

apiVersion: appsody.dev/v1beta1
kind: AppsodyApplication
metadata:
  annotations:
    commit.stack.appsody.dev/contextDir: /incubator/java-spring-boot2
    commit.stack.appsody.dev/date: Thu Jun 4 12:03:56 2020 +0100
    commit.stack.appsody.dev/message: 'java-springboot2: define APPSODY_DEBUG_PORT
      (#819)'
    image.opencontainers.org/created: "2021-12-20T15:17:35+09:00"
    stack.appsody.dev/authors: Erin Schnabel <ebullient>, Ozzy Osborne <bardweller>,
      Richard Trotter <richard-trotter>, Harish Yayi <yharish991>
    stack.appsody.dev/configured: docker.io/appsody/java-spring-boot2:0.3
    stack.appsody.dev/created: "2020-06-04T11:06:14Z"
    stack.appsody.dev/description: Spring Boot using OpenJ9 and Maven
    stack.appsody.dev/digest: sha256:b1dc6398a112888f2b4a5e46a517f5f39b13d0712132e2ec53d9382c15be8aaa
    stack.appsody.dev/documentation: https://github.com/appsody/stacks/tree/master/incubator/java-spring-boot2/README.md
    stack.appsody.dev/licenses: Apache-2.0
    stack.appsody.dev/revision: 7417563d37f987bc803711298b29817519cc648d
    stack.appsody.dev/source: https://github.com/appsody/stacks/tree/master/incubator/java-spring-boot2/image
    stack.appsody.dev/tag: docker.io/appsody/java-spring-boot2:0.3.30
    stack.appsody.dev/title: Spring BootR
    stack.appsody.dev/url: https://github.com/appsody/stacks/tree/master/incubator/java-spring-boot2
  creationTimestamp: null
  labels:
    image.opencontainers.org/title: kabanero-test-springboot2
    stack.appsody.dev/id: java-spring-boot2
    stack.appsody.dev/version: 0.3.30
  name: kabanero-test-springboot2
spec:
  applicationImage: {username}/kabanero-test-springboot2
  createKnativeService: true
  expose: true
  livenessProbe:
    failureThreshold: 12
    httpGet:
      path: /actuator/liveness
      port: 8080
    initialDelaySeconds: 5
    periodSeconds: 2
  monitoring:
    endpoints:
    - path: /actuator/prometheus
    labels:
      k8s-app: kabanero-test-springboot2
  readinessProbe:
    failureThreshold: 12
    httpGet:
      path: /actuator/health
      port: 8080
    initialDelaySeconds: 5
    periodSeconds: 2
    timeoutSeconds: 1
  service:
    annotations:
      prometheus.io/path: /actuator/prometheus
      prometheus.io/scrape: "true"
    port: 8080
    type: NodePort
  stack: java-spring-boot2
  version: 1.0.0
    アプリ実行

如果部署成功,您应该可以通过以下命令确认URL并访问。

$ sudo kubectl get serving

写了一句但目前无法确认是否工作… 等问题解决后再更新。

总结

使用VS Code,根据模板可以轻松开发云原生应用程序。

广告
将在 10 秒后关闭
bannerAds