Azure Kubernetes Service (AKS) に Spring Boot Webサービスをデプロイする (Docker Hub カスタムコンテナイメージ)

Azure Kubernetes Service (AKS) に Spring Boot Webサービスをデプロイする (Docker Hub カスタムコンテナイメージ)

spring-boot_on_azure-kubernetes-service.png

为了什么?

我将在 Windows 11 上使用 Linux 进行云开发。

您可以从这里查看文章列表。

 

实现

在 Microsoft Azure Kubernetes Service (AKS) 上部署自定义的 Spring Boot Web 应用容器镜像。

在这篇文章中,我们使用了公开访问的自定义容器映像来发布到Docker Hub。在实际系统开发中,由于从哪个注册表获取容器映像可能会有所不同,请根据情况进行确认。
此外,Azure还提供了完全托管的注册表服务,即Azure Container Registry。我们还可以使用Azure CLI来操作,我希望在另一个机会上进行介绍。

技术主题

微软Azure Kubernetes服务(AKS)是什么?

这是在Microsoft Azure上运行的托管Kubernetes服务。AKS可简化Kubernetes的运营,使您能够轻松部署、管理和扩展Kubernetes集群。关键词
内容

可扩展性
AKS可以根据需求变化进行应用程序的扩展和缩减。利用Kubernetes的标准功能,通过调整Pod的数量,可以优化整个集群的资源利用率。

自动化
AKS可以自动化与集群部署、升级、监控、扩展和管理相关的任务。这样,用户可以简化与Kubernetes相关的复杂任务。

安全性
AKS有助于用户安全地配置Kubernetes集群。AKS支持可配置的网络策略、预配置的登录和基于角色的访问控制(RBAC)等功能。

可移植性
AKS使用开源的Kubernetes,以使云原生应用程序能够在任何地方运行。AKS可以部署到Azure的其他服务、本地环境和其他云提供商。

生产就绪
AKS专注于高可用性、监控、可扩展性和安全性,提供可用于生产环境的Kubernetes集群。AKS提供99.95%的可用性SLA。

开发环境 fā

    Windows 11 Home 22H2 を使用しています。
由于要操作WSL的Ubuntu,请您也可以参考macOS的方法。
WSL(Microsoft Store 应用程序版)※ 您可以从相关文章中确认安装方法
> wsl –version
WSL 版本: 1.0.3.0
内核版本: 5.15.79.1
WSLg 版本: 1.0.47Ubuntu ※ 您可以从相关文章中确认安装方法
$ lsb_release -a
没有可用的 LSB 模块。
发行版 ID: Ubuntu
描述: Ubuntu 22.04.1 LTS
发布: 22.04

Java JDK ※ 您可以从相关文章中确认安装方法
$ java -version
openjdk version “11.0.18” 2023-01-17
OpenJDK Runtime Environment (build 11.0.18+10-post-Ubuntu-0ubuntu122.04)
OpenJDK 64-Bit Server VM (build 11.0.18+10-post-Ubuntu-0ubuntu122.04, mixed mode, sharing)

Maven ※ 您可以从相关文章中确认安装方法
$ mvn -version
Apache Maven 3.6.3
Maven home: /usr/share/maven
Java version: 11.0.18, vendor: Ubuntu, runtime: /usr/lib/jvm/java-11-openjdk-amd64

Docker ※ 您可以从相关文章中确认安装方法
$ docker –version
Docker version 23.0.1, build a5ee5b1

在这篇文章中,我们会在 Ubuntu 的终端上进行操作。针对初次学习如何使用 Vim 进行复制和粘贴的人,我们在接下来的文章中介绍了相关步骤。请务必尝试一下。

 

显示“Hello World”的步骤

创建Spring Boot Web服务

这篇文章是从这篇相关文章的续篇开始,其中解释了一些步骤。

 

进入 Spring Boot 应用的项目文件夹

我們移動到專案資料夾。
※ 我們假設專案資料夾是 ~/tmp/hello-spring-boot。

$ cd ~/tmp/hello-spring-boot

确认容器镜像

下面是从这篇相关文章中继续解释步骤的文章。

 

启动Docker守护程序。

$ sudo service docker start
 * Starting Docker: docker      [ OK ]

我将检查容器镜像。

$ docker images | grep app-hello-spring-boot
app-hello-spring-boot   latest    39115028afa6   12 seconds ago   390MB

将容器映像注册到Docker Hub。

创建一个Docker Hub账号。

 

Docker Hub 是一个云端基于容器共享、存储和管理的注册表。在 Docker Hub 上存储了由社区创建的官方和社区共享的镜像。此外,用户还可以上传和共享自定义容器镜像。

登录Docker Hub。

$ docker login
Login Succeeded

给容器镜像打上标签。
※ 请将 “$USER” 部分替换为您自己的容器存储库。

$ docker tag app-hello-spring-boot $USER/app-hello-spring-boot:latest
説明を開きます。docker tag コマンドは、ローカルに保存されているコンテナイメージに、指定したタグを付けることで、コンテナイメージをリネームすることができます。
この例では、app-hello-spring-boot という名前のコンテナイメージに、user/app-hello-spring-boot:latest というタグを付けています。ここで user は、Docker Hub 上のユーザー名を表します。タグには、コロン : 以降にバージョンなどの情報を含めることができますが、ここでは latest を指定しているため、最新バージョンを表しています。

Docker Hub にコンテナイメージをプュシュします。

$ docker push $USER/app-hello-spring-boot:latest
説明を開きます。docker push コマンドは、コンテナイメージを Docker Hub のリポジトリにプッシュするために使用されます。user/app-hello-spring-boot はプッシュするイメージの名前とタグを指定し、latest はイメージのバージョンを指定しています。
これにより、Docker Hub 上に user というユーザー名のリポジトリが作成され、その中に app-hello-spring-boot という名前のコンテナイメージがアップロードされます。

ここまでで、Docker Hub に $USER/app-hello-spring-boot:latest としてカスタムコンテナイメージが公開出来ました。

登录到Azure环境

こちらの関連記事の続きから手順を説明する記事となります。

 

Azure CLI でログインします。

$ az login

蔚藍環境

资源组

创建资源组。

$ az group create \
    --name rg-hello \
    --location japaneast
説明を開きます。このコマンドは、Azure CLI を使用して Azure のリソースグループを作成しています。

コマンド
内容

az group create
Azure のリソースグループを作成するためのコマンドです。

オプション

内容

–name
rg-hello
リソースグループの名前を指定します。

–location
japaneast
リソースグループを作成する場所を japaneast に指定しています。 japaneast は Azure の日本東部地域を指します。

AKS环境 – Azure Kubernetes Service环境

AKS を作成すると、Kubernetes クラスター用の多数のリソースが自動的に作成されます。これらのリソースは、Azure Portal 上で確認することができます。ただし、AKS のリソースを削除すると自動的に関連リソースも削除されますが、共有している Azure サブスクリプションで検証される場合など、ご注意ください。

aks.png
$ az aks create \
    --resource-group rg-hello \
    --name aks-hello \
    --node-count 1 \
    --generate-ssh-keys
説明を開きます。このコマンドは、Azure 上に新しい Kubernetes クラスターを作成しています。

コマンド
内容

az aks create
Azure 上に、Kubernetes クラスターを作成するコマンドです。

オプション

内容

–resource-group
rg-hello
Kubernetes クラスターを作成するリソースグループの名前です。

–name
aks-hello
作成する Kubernetes クラスターの名前です。

–node-count
1
Kubernetes クラスターにデプロイするノードの数を指定します。

–generate-ssh-keys

Kubernetes クラスターに SSH キーを自動生成するかどうかを指定します。このオプションを指定することで、ユーザーが手動で SSH キーを生成する必要がなくなります。

让我们查看 AKS 集群的列表。

$ az aks list
如果要删除AKS集群,请使用以下命令。
$ az aks delete -n <aks-name> -g <group>

只需一个选项:
修改配置文件的权限。
※ 仅在第一次需要。

$ chmod 600 /home/$USER/.kube/config

AKS クラスターと接続します。
※ 既存設定の上書きを許可する為、yes を選択します。

$ az aks get-credentials \
    --resource-group rg-hello \
    --name aks-hello
説明を開きます。このコマンドは、Azure 上に作成された Kubernetes クラスターに接続するための認証情報を取得しています。

コマンド
内容

az aks get-credentials
Azure 上の、Kubernetes クラスターに接続するための認証情報を取得します。

オプション

内容

–resource-group
rg-hello
Kubernetes クラスターが作成されたリソースグループ名を指定します。

–name
aks-hello
作成する Kubernetes クラスターの名前を指定します。

このコマンドを実行すると、指定されたリソースグループと Kubernetes クラスターの認証情報がローカルに保存され、kubectl コマンドで Kubernetes クラスターに接続するために使用されます。これにより、Kubernetes クラスターに対してコマンドを発行する際に、手動で認証情報を指定する必要がなくなります。

接続設定が成功した場合の出力は、以下のようになります。

Merged "aks-hello" as current context in /home/$USER/.kube/config
在此之前,您已经成功地连接到在Azure上构建的Kubernetes集群。从现在开始,您将使用远程命令来操作该Kubernetes集群。

操作Kubernetes集群(AKS)

AKS にデプロイするために、Minikube を経由して kubectl を使用する代わりに、Azure CLI で kubectl を直接インストールする手順を紹介しています。

Kubernetes コマンドライン ツール、kubectl をインストールします。

$ sudo az aks install-cli

Minikube で使用したシンボリックリンクを削除します。

$ unalias kubectl

确认 kubectl 的版本。

$ kubectl version --short
Client Version: v1.26.2
Kustomize Version: v4.5.7
Server Version: v1.24.9

我要确认当前的连接目标。

$ kubectl config current-context
aks-hello
确认连接到Kubernetes集群是非常重要的,以防止在错误的集群上执行命令操作。例如,如果错误地对错误的集群应用部署或删除Pod,可能会由于错误操作而导致服务停止或数据丢失等严重问题。

创建Kubernetes清单文件

こちらの関連記事の続きから手順を説明する記事となります。

 

修改Kubernetes的清单文件。
※ 请将$USER部分更改为您自己的容器存储库。

$ vim kube-all-in-one.yaml
apiVersion: v1
kind: Service
metadata:
  name: app-service
spec:
  type: LoadBalancer
  ports:
  - port: 80
    targetPort: 8080
  selector:
    app: app
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: app
spec:
  replicas: 1
  selector:
    matchLabels:
      app: app
  template:
    metadata:
      labels:
        app: app
    spec:
      containers:
      - name: app
        image: $USER/app-hello-spring-boot:latest
        ports:
        - containerPort: 8080

将其部署到Kubernetes集群中。

$ kubectl apply -f kube-all-in-one.yaml
service/app-service created
deployment.apps/app-deployment created

检查Kubernetes集群的状态。

$ kubectl get pods,services,deployments
NAME                       READY   STATUS    RESTARTS   AGE
pod/app-b876686f6-87kjn    1/1     Running   0          3m42s

NAME                  TYPE           CLUSTER-IP    EXTERNAL-IP     PORT(S)        AGE
service/app-service   LoadBalancer   10.0.52.170   xx.xx.xx.xx   80:30634/TCP   3m42s
service/kubernetes    ClusterIP      10.0.0.1      <none>          443/TCP        52m

NAME                             READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/app-deployment   1/1     1            1           3m42s

确认容器操作

服务/应用服务的EXTERNAL-IP xx.xx.xx.xx 可以从外部访问。

请在网页浏览器中确认
※ 请根据环境更改URL。

http://xx.xx.xx.xx/api/data

在WEB浏览器上显示{“message”:”你好世界!”},并成功获取了JSON数据。

別ターミナルから curl コマンドで確認します。

$ curl -v https://xx.xx.xx.xx/api/data
*   Trying xx.xx.xx.xx:80...
* Connected to xx.xx.xx.xx (xx.xx.xx.xx) port 80 (#0)
> GET /api/data HTTP/1.1
> Host: xx.xx.xx.xx
> User-Agent: curl/7.81.0
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 200
< Content-Type: application/json
< Transfer-Encoding: chunked
< Date: Sat, 11 Mar 2023 07:47:53 GMT
<
* Connection #0 to host xx.xx.xx.xx left intact
{"message":"Hello World!"}

ターミナルに {“message”:”Hello World!”} と表示され、JSON データを取得することが出来ました。

连接到容器

我将尝试连接到Spring Boot自定义容器的另一个终端。

$ kubectl exec -it app-b876686f6-87kjn -- /bin/bash

在连接到容器之后,请确保确认目录。
※ 当需要退出容器时,请按下ctrl + D。

# pwd
/app
# ls -la
total 17248
drwxr-xr-x 1 root root     4096 Mar 10 13:00 .
drwxr-xr-x 1 root root     4096 Mar 11 07:42 ..
-rw-r--r-- 1 root root 17650415 Mar 10 12:59 app.jar

我尝试显示容器的信息。

# cat /etc/*-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=20.04
DISTRIB_CODENAME=focal
DISTRIB_DESCRIPTION="Ubuntu 20.04.5 LTS"
NAME="Ubuntu"
VERSION="20.04.5 LTS (Focal Fossa)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 20.04.5 LTS"
VERSION_ID="20.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=focal
UBUNTU_CODENAME=focal
image.png

このコンテナは Ubuntu をベースに作成されています。つまり、Ubuntu と同じように扱うことができます。

まとめ

Azure Kubernetes Service (AKS) 環境で、kube-all-in-one.yaml という YAML 形式のマニュフェストファイルを用いて、Spring Boot Web サービスのカスタムコンテナイメージをデプロイすることができました。

Maven、Docker、Azure CLI、kubectl を使って、Spring Boot アプリの開発からコンテナイメージの作成、Azure 環境へのデプロイまで、すべてをターミナルから行うことができます。このように、クラウドでのシステム開発に必要なスキルや理解を深めることができます。初めての人でも簡単に手順を追うことができるので、ぜひ挑戦してみてください。

你觉得怎么样?您可以尝试在WSL Ubuntu上,使用Spring Boot Web应用程序在Azure Kubernetes Service(AKS)环境中轻松地启动为容器,以便进行验证。请务必试试看。未来我们还会介绍更多Azure的开发环境等内容,请拭目以待。

广告
将在 10 秒后关闭
bannerAds