使用 AKS(Azure Kubernetes Service)启动 Spring Boot WEB 服务(使用 ACR 自定义容器镜像)

使用 Azure Kubernetes 服务 (AKS) 在 Spring Boot WEB 服务上启动 (ACR 自定义容器镜像)。

在汉语中有以下几种方式重述这个句子:

1. 目的-
2. 目的是- shì
3. 为了达到目的-
4. 为了实现目的-
5. 以达到目的- yǐ

在 Azure Kubernetes Service 環境中启动 Spring Boot WEB 服务,以加深理解。

实现

在Microsoft Azure Kubernetes Service(AKS)中部署Spring Boot WEB应用的自定义容器映像。

技术背景

Azure Kubernetes Service(AKS)是什么?

這個可以在此處展開以供查看。Microsoft Azure Kubernetes Service (AKS)

Microsoft Azure Kubernetes Service (AKS) 是Azure的全管服務,用於管理Kubernetes集群。
AKS的特點和優勢如下。

可擴展性
AKS可根據需求變化,對應用進行擴展/縮小。通過使用Kubernetes的標準功能,調整Pod數量,可以優化整個集群的資源使用率。

自動化
AKS自動化了與集群的部署、升級、監視、擴展和管理相關的任務。這樣用戶可以簡化與Kubernetes相關的複雜任務。

安全性
AKS幫助用戶對Kubernetes集群進行安全設置。AKS支援可配置的網絡策略、預設的登錄、基於角色的訪問控制(RBAC)等功能。

可移植性
AKS使用開源的Kubernetes使雲原生應用程序可以在任何地方運行。AKS可以部署到Azure的其他服務、本地環境和其他雲提供商上。

生產就緒
AKS專注於高可用性、監視、可擴展性和安全性,提供生產就緒的Kubernetes集群。AKS提供99.95%的可用性保證。

开发环境

    • 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 JDK和Hello World!
$ java -version
openjdk version “11.0.17” 2022-10-18
OpenJDK Runtime Environment (build 11.0.17+8-post-Ubuntu-1ubuntu222.04)
OpenJDK 64位Server VM (build 11.0.17+8-post-Ubuntu-1ubuntu222.04, 混合模式, 共享)

Maven ※ 安装Maven和Hello World!
$ mvn -version
Apache Maven 3.6.3
Maven主目录:/usr/share/maven
Java版本:11.0.17,供应商:Ubuntu,运行时:/usr/lib/jvm/java-11-openjdk-amd64

Docker Desktop
版本4.16.3(96739)

$ docker –version
Docker版本20.10.22,构建3a2c30b

$ docker-compose –version
Docker Compose版本v2.15.1

$ kubectl version –short
客户端版本:v1.25.4
Kustomize版本:v4.5.7
服务器版本:v1.25.4

※ 本文中基本上只使用 Ubuntu 终端进行操作。

展示“Hello World”的步骤

创建一个 Spring Boot Web 服务

您可以参考Spring Boot WEB服务的“Hello World!”例子。

进入项目文件夹

假设~/tmp/hello-spring-boot为项目文件夹。

$ cd ~/tmp/hello-spring-boot

以 Java 构建应用程序 (※ 参考)

※ 将生成 target/app.jar。
※ 在创建下面的容器镜像的操作中同时生成 target/app.jar,并非必需。

$ mvn clean install

创建容器镜像

构建容器映像

在本地的Docker环境(Docker Desktop)中将创建app-hello-spring-boot容器映像。
容器映像的创建时间符合spring-boot:build-image规范,以Unix纪元开始。

$ mvn spring-boot:build-image \
    -Dspring-boot.build-image.imageName=app-hello-spring-boot

确认容器镜像

$ docker images | grep app-hello-spring-boot-app
app-hello-spring-boot-app   latest   e37cc77f2b36   43 years ago   262MB

注册Azure账号

使用Azure的免费帐户在云上构建。

使用 Azure CLI 进行登录

请参考安装 Azure CLI 的步骤。

$ az login

天藍色的環境

资源组

创建资源组

$ az group create \
    --name rg-hello \
    --location japaneast

显示资源组列表

$ az group list

如果要删除资源组

$ az group delete -n <group>

容器注册表

创建容器注册表
※ 不能使用 –sku Free 进行创建。
※ –name 必须是公开且唯一的值。

$ az acr create \
    --resource-group rg-hello \
    --name cr20230212 \
    --sku Basic

展示容器仓库列表

$ az acr list

显示容器注册表登录凭证信息

$ az acr update -n cr20230212 --admin-enabled true
$ az acr credential show \
    --resource-group rg-hello \
    --name cr20230212
{
  "passwords": [
    {
      "name": "password",
      "value": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
    },
    {
      "name": "password2",
      "value": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
    }
  ],
  "username": "cr20230212"
}

※ 如果要删除容器注册表

$ az acr delete --n <acr-name>

登录到容器注册表

$ az acr login --name cr20230212

将容器镜像推送到容器注册表中

$ docker tag app-hello-spring-boot cr20230212.azurecr.io/app-hello-spring-boot:latest
$ docker push cr20230212.azurecr.io/app-hello-spring-boot:latest

确认容器注册表的图像

$ az acr repository list --name cr20230212 --output table
Result
---------------------
app-hello-spring-boot

我能够将本地的容器镜像推送到 Azure 容器注册表中。

AKS环境可以被改写为:Azure Kubernetes Service环境

创建 AKS 集群

$ az aks create \
    --resource-group rg-hello \
    --name aks-hello \
    --node-count 1 \
    --generate-ssh-keys

列出 AKS 集群

$ az aks list

如果要删除AKS集群

$ az aks delete -n <aks-name> -g <group>

首次设定文件权限修改

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

与 AKS 集群连接
※ 覆写现有设置:是的

$ az aks get-credentials \
    --resource-group rg-hello \
    --name aks-hello

连接设置成功的输出

Merged "aks-hello" as current context in /home/$USER/.kube/config

Kubernetes (AKS) 环境

确认当前的连接地点

$ kubectl config current-context
aks-hello

连接目标列表

$ kubectl config get-contexts
CURRENT   NAME             CLUSTER          AUTHINFO                         NAMESPACE
*         aks-hello        aks-hello        clusterUser_rg-hello_aks-hello
          docker-desktop   docker-desktop   docker-desktop

如果要将连接恢复到本地(docker-desktop)上,只需以下操作

$ kubectl config use-context docker-desktop

如果要删除连接目标

$ kubectl config delete-context <context>

请确认连接。

$ kubectl get nodes
NAME                                STATUS   ROLES   AGE     VERSION
aks-nodepool1-11584399-vmss000000   Ready    agent   4m43s   v1.24.9

创建容器注册表的身份验证信息

$ kubectl create secret docker-registry regcred \
    --docker-server cr20230212.azurecr.io \
    --docker-username cr20230212 \
    --docker-password XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

修改 Kubernetes 清单文件

$ 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-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: app
  template:
    metadata:
      labels:
        app: app
    spec:
      containers:
      - name: app
        image: cr20230212.azurecr.io/app-hello-spring-boot:latest
        ports:
        - containerPort: 8080
      imagePullSecrets:
      - name: regcred

请务必确认连接目标。

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

确认状态

$ kubectl get pods,services,deployments
NAME                                 READY   STATUS    RESTARTS   AGE
pod/app-deployment-7888b4769-wsc2f   1/1     Running   0          60s

NAME                  TYPE           CLUSTER-IP     EXTERNAL-IP    PORT(S)        AGE
service/app-service   LoadBalancer   10.0.164.159   20.48.75.231   80:31657/TCP   60s
service/kubernetes    ClusterIP      10.0.0.1       <none>         443/TCP        24m

NAME                             READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/app-deployment   1/1     1            1           60s

服务/应用服务的外部IP地址为20.48.75.231,可从外部访问。

请使用网络浏览器进行确认
※ 请根据环境进行URL的更改。

http://20.48.75.231/api/data

在网页浏览器上显示了{“message”:”Hello World!”},并成功获取了JSON数据。

用curl命令从另一个终端确认。

$ curl -v http://20.48.75.231/api/data
*   Trying 20.48.75.231:80...
* Connected to 20.48.75.231 (20.48.75.231) port 80 (#0)
> GET /api/data HTTP/1.1
> Host: 20.48.75.231
> 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: Mon, 27 Feb 2023 09:21:21 GMT
<
* Connection #0 to host 20.48.75.231 left intact
{"message":"Hello World!"}

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

※ 据看起来,Azure 平台上似乎没有实现 SSL/TLS 支持和应用 HTTP/2 协议。

连接到容器

$ kubectl exec -it app-deployment-7888b4769-wsc2f -- /bin/bash

连接到容器以后

$ pwd
/workspace
$ ls -la
total 20
drwxr-xr-x 1 cnb  cnb  4096 Jan  1  1980 .
drwxr-xr-x 1 root root 4096 Feb 27 08:10 ..
drwxr-xr-x 1 cnb  cnb  4096 Jan  1  1980 BOOT-INF
drwxr-xr-x 3 cnb  cnb  4096 Jan  1  1980 META-INF
drwxr-xr-x 3 cnb  cnb  4096 Jan  1  1980 org

容器信息

$ cat /etc/*-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=18.04
DISTRIB_CODENAME=bionic
DISTRIB_DESCRIPTION="Ubuntu 18.04.6 LTS"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
NAME="Ubuntu"
ID=ubuntu
PRETTY_NAME="Paketo Buildpacks Base Bionic"
VERSION_ID="18.04"
HOME_URL="https://github.com/paketo-buildpacks/bionic-base-stack"
UBUNTU_CODENAME=bionic
VERSION="18.04.6 LTS (Bionic Beaver)"
ID_LIKE=debian
SUPPORT_URL="https://github.com/paketo-buildpacks/bionic-base-stack/blob/main/README.md"
BUG_REPORT_URL="https://github.com/paketo-buildpacks/bionic-base-stack/issues/new"
VERSION_CODENAME=bionic

总结

    Ubuntu のシンプルな構成の Java 開発環境で Spring Boot WEBサービスのカスタムコンテナイメージを AKS (Azure Kubernetes Service) 環境で起動させることが出来ました。

请提供需要重新表达的具体文本内容以便我为您提供中文的同义句。

Azure Kubernetes 服务 (AKS) 命令参考资料

广告
将在 10 秒后关闭
bannerAds