使用 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) 是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 –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) 命令参考资料