AKS(Azure Kubernetes Service) 클러스터에서 Open Liberty 또는 WebSphere Liberty와 함께 Java EE JCache 사용
이 문서에서는 AKS에 배포된 컨테이너화된 애플리케이션에서 Java EE JCache를 사용하는 방법을 설명합니다.
이 가이드에서는 다음을 수행합니다.
- Open Liberty 또는 WebSphere Liberty 런타임에서 Java, Java EE, Jakarta EE 또는 MicroProfile 애플리케이션을 실행하는 인프라를 만듭니다.
- Azure Cache for Redis에서 지원되는 Java EE JCache를 세션 캐시로 사용합니다.
- Open Liberty 또는 WebSphere Liberty 컨테이너 이미지를 사용하여 애플리케이션 Docker 이미지를 빌드합니다.
- Open Liberty Operator를 사용하여 AKS 클러스터에 컨테이너화된 애플리케이션을 배포합니다.
이 문서는 빠르게 배포할 수 있도록 지원하기 위한 것입니다. 프로덕션으로 이동하기 전에 Liberty 튜닝을 살펴보아야 합니다.
피드백을 제공하거나 Azure 솔루션에서 WebSphere를 개발하는 엔지니어링 팀과 함께 마이그레이션 시나리오를 긴밀히 작업하려는 경우 WebSphere 마이그레이션 대한 이 간단한 설문 조사를 작성하고 연락처 정보를 포함합니다. 긴밀한 공동 작업을 시작할 수 있도록 프로그램 관리자, 설계자 및 엔지니어 팀이 즉시 연락드립니다.
필수 구성 요소
- Azure 구독 Azure 구독이 아직 없는 경우 시작하기 전에 체험 계정을 만듭니다.
- Unix와 비슷한 운영 체제가 설치된 로컬 컴퓨터를 준비합니다(예: Ubuntu, macOS 또는 Linux용 Windows 하위 시스템).
- Azure CLI 를 설치하여 Azure CLI 명령을 실행합니다.
-
az login
명령을 사용하여 Azure CLI로 로그인합니다. 인증 프로세스를 완료하려면 터미널에 표시되는 단계를 수행합니다. 다른 로그인 옵션은 Azure CLI를 사용하여 Azure에 로그인을 참조하세요. - 메시지가 표시되면 처음 사용할 때 Azure CLI 확장을 설치합니다. 확장에 대한 자세한 내용은 Azure CLI로 확장 사용 및 관리를 참조하세요.
-
az version
실행하여 설치된 버전 및 종속 라이브러리를 찾습니다. 최신 버전으로 업그레이드하려면az upgrade
실행합니다.
-
- Java SE 구현 버전 17 이상(예: OpenJDK의 Microsoft 빌드)을 설치합니다.
- Maven 3.5.0 이상을 설치합니다.
- 해당 OS용 Docker를 설치합니다.
- Git이 설치되어 있는지 확인합니다.
- 구독에 대한 역할 또는
Contributor
User Access Administrator
역할이 할당Owner
되었는지 확인합니다. 사용자 또는 그룹에 대한 역할 할당 나열의 단계에 따라 할당을 확인할 수 있습니다.
인프라 만들기
이 섹션의 단계에서는 Azure에서 애플리케이션 인프라를 만드는 방법을 안내합니다. 이러한 단계를 완료한 후에는 샘플 애플리케이션을 실행하기 위한 Azure Container Registry, Azure Kubernetes Service 클러스터 및 Azure Cache for Redis 인스턴스가 있습니다.
리소스 그룹 만들기
Azure 리소스 그룹은 Azure 리소스가 배포되고 관리되는 논리 그룹입니다.
eastus
위치에서 az group create
명령을 사용하여 java-liberty-project
이라는 리소스 그룹을 만듭니다. 이 리소스 그룹은 나중에 ACR(Azure Container Registry) 인스턴스 및 AKS 클러스터를 만드는 데 사용됩니다.
export RESOURCE_GROUP_NAME=java-liberty-project
az group create --name $RESOURCE_GROUP_NAME --location eastus
ACR 인스턴스 만들기
az acr create
명령을 사용하여 ACR 인스턴스를 만듭니다. 다음 예제에서는 youruniqueacrname
ACR 인스턴스를 만듭니다.
youruniqueacrname
Azure 내에서 고유한지 확인합니다.
export REGISTRY_NAME=youruniqueacrname
az acr create \
--resource-group $RESOURCE_GROUP_NAME \
--name $REGISTRY_NAME \
--sku Basic
잠시 후 다음을 포함하는 JSON 출력이 표시됩니다.
"provisioningState": "Succeeded",
"publicNetworkAccess": "Enabled",
"resourceGroup": "java-liberty-project",
또는 빠른 시작의 단계에 따라 Azure 컨테이너 레지스트리 인스턴스를 만들 수 있습니다. Azure Portal을 사용하여 Azure 컨테이너 레지스트리를 만듭니다.
ACR 인스턴스에 연결
이미지를 푸시하려면 ACR 인스턴스에 로그인해야 합니다. 다음 명령을 실행하여 연결을 확인합니다.
export LOGIN_SERVER=$(az acr show \
--name $REGISTRY_NAME \
--resource-group $RESOURCE_GROUP_NAME \
--query 'loginServer' \
--output tsv)
az acr login \
--name $REGISTRY_NAME \
--resource-group $RESOURCE_GROUP_NAME
참고 항목
사용자 이름 및 암호 자격 증명을 사용하여 컨테이너 레지스트리에 대한 액세스 권한을 부여하는 것은 권장되지 않습니다. 특정 사용 요구 사항에서 자격 증명 기반 액세스가 가장 좋은 방법이라고 제안하는 경우 다음 값을 사용하여 az acr credential show
사용자 이름 및 암호를 가져와서 docker login
사용할 수 있습니다.
ACR 인스턴스에 성공적으로 로그인한 경우 명령 출력의 끝에 Login Succeeded
표시됩니다.
Azure Container Registry에 로그인하는 데 문제가 있는 경우 레지스트리 로그인 문제 해결을 참조하세요.
AKS 클러스터 만들기
az aks create
명령을 사용하여 AKS 클러스터를 만들고 ACR 인스턴스에서 이미지 끌어오기 권한을 부여합니다. 다음 예제에서는 하나의 노드를 사용하여 myAKSCluster
클러스터를 만듭니다. 이 명령을 완료하는 데 몇 분 정도 걸립니다.
export CLUSTER_NAME=myAKSCluster
az aks create \
--resource-group $RESOURCE_GROUP_NAME \
--name $CLUSTER_NAME \
--node-count 1 \
--generate-ssh-keys \
--enable-managed-identity \
--attach-acr $REGISTRY_NAME
몇 분 후 명령은 다음 줄을 포함하여 클러스터에 대한 JSON 형식 정보를 완료하고 반환합니다.
"nodeResourceGroup": "MC_java-liberty-project_myAKSCluster_eastus",
"privateFqdn": null,
"provisioningState": "Succeeded",
"resourceGroup": "java-liberty-project",
AKS 클러스터에 연결
Kubernetes 클러스터를 관리하려면 Kubernetes 명령줄 클라이언트인 kubectl을 사용합니다.
kubectl
로컬로 설치하려면 az aks install-cli
명령을 사용합니다.
az aks install-cli
Kubernetes 클러스터에 연결하도록 kubectl
구성하려면 az aks get-credentials
명령을 사용합니다. 이 명령은 자격 증명을 다운로드하고 Kubernetes CLI가 해당 자격 증명을 사용하도록 구성합니다.
az aks get-credentials \
--resource-group $RESOURCE_GROUP_NAME \
--name $CLUSTER_NAME \
--overwrite-existing
클러스터에 대한 연결을 확인하려면 kubectl get 명령을 사용하여 클러스터 노드 목록을 반환합니다.
kubectl get nodes
다음 예제 출력은 이전 단계에서 만든 단일 노드를 보여줍니다. 노드 상태가 Ready
있는지 확인합니다.
NAME STATUS ROLES AGE VERSION
aks-nodepool1-xxxxxxxx-yyyyyyyyyy Ready agent 76s v1.18.10
Open Liberty 연산자 설치
클러스터를 만들고 연결한 후 다음 명령을 실행하여 Open Liberty Operator를 설치합니다.
# Install cert-manager Operator
CERT_MANAGER_VERSION=v1.11.2
kubectl apply -f https://github.com/jetstack/cert-manager/releases/download/${CERT_MANAGER_VERSION}/cert-manager.yaml
# Install Open Liberty Operator
export OPERATOR_VERSION=1.3.3
mkdir -p overlays/watch-all-namespaces
wget https://raw.githubusercontent.com/OpenLiberty/open-liberty-operator/main/deploy/releases/${OPERATOR_VERSION}/kustomize/overlays/watch-all-namespaces/olo-all-namespaces.yaml -q -P ./overlays/watch-all-namespaces
wget https://raw.githubusercontent.com/OpenLiberty/open-liberty-operator/main/deploy/releases/${OPERATOR_VERSION}/kustomize/overlays/watch-all-namespaces/cluster-roles.yaml -q -P ./overlays/watch-all-namespaces
wget https://raw.githubusercontent.com/OpenLiberty/open-liberty-operator/main/deploy/releases/${OPERATOR_VERSION}/kustomize/overlays/watch-all-namespaces/kustomization.yaml -q -P ./overlays/watch-all-namespaces
mkdir base
wget https://raw.githubusercontent.com/OpenLiberty/open-liberty-operator/main/deploy/releases/${OPERATOR_VERSION}/kustomize/base/kustomization.yaml -q -P ./base
wget https://raw.githubusercontent.com/OpenLiberty/open-liberty-operator/main/deploy/releases/${OPERATOR_VERSION}/kustomize/base/open-liberty-crd.yaml -q -P ./base
wget https://raw.githubusercontent.com/OpenLiberty/open-liberty-operator/main/deploy/releases/${OPERATOR_VERSION}/kustomize/base/open-liberty-operator.yaml -q -P ./base
wget https://raw.githubusercontent.com/OpenLiberty/open-liberty-operator/main/deploy/releases/${OPERATOR_VERSION}/kustomize/base/open-liberty-roles.yaml -q -P ./base
kubectl create namespace open-liberty
kubectl apply --server-side -k overlays/watch-all-namespaces
Azure Cache for Redis 인스턴스 만들기
Azure Cache for Redis 는 Open Liberty 또는 WebSphere Liberty 서버 내에서 실행되는 Java 애플리케이션의 HttpSession
지속성을 지원합니다. 이 섹션의 단계에 따라 Azure Cache for Redis 인스턴스를 만들고 연결 정보를 적어둡니다. 이 정보는 나중에 사용합니다.
빠른 시작의 단계를 수행합니다. Java에서 Azure Cache for Redis를 사용하지만 Java 샘플 이해는 포함하지 않습니다.
참고 항목
Azure Cache for Redis만들기
섹션의 7단계에서 이 가이드의 고급 창에서인증 옵션에 대한액세스 키 인증 선택합니다. 최적의 보안을 위해 가능한 경우 관리 ID와 함께 Microsoft Entra ID를 사용하여 캐시에 대한 요청에 권한을 부여하는 것이 좋습니다. Microsoft Entra ID 및 관리 ID를 사용하여 권한 부여는 공유 액세스 키 권한 부여를 통해 뛰어난 보안 및 사용 편의성을 제공합니다. 캐시에서 관리 ID를 사용하는 방법에 대한 자세한 내용은 Microsoft Entra ID를 사용한 캐시 인증에 대해 설명합니다.Azure Cache for Redis 인스턴스의 호스트 이름 및 기본 액세스 키를 복사한 다음, 다음 명령을 실행하여 환경 변수를 추가합니다.
export REDISCACHEHOSTNAME=<YOUR_HOST_NAME> export REDISCACHEKEY=<YOUR_PRIMARY_ACCESS_KEY>
애플리케이션 빌드
이 섹션의 단계에 따라 샘플 애플리케이션을 빌드하고 컨테이너화합니다. 이러한 단계에서는 Maven, liberty-maven-plugin
및 az acr build
사용합니다. liberty-maven-plugin
에 대한 자세한 내용은 Maven으로 웹 애플리케이션 빌드를 참조하세요.
애플리케이션 체크 아웃
다음 명령을 사용하여 이 가이드의 샘플 코드를 복제합니다. 샘플은 GitHub의 open-liberty-on-aks 리포지토리에 있습니다. 리포지토리에 몇 가지 샘플이 있습니다. 이 문서에서는 java-app-jcache를 사용합니다.
git clone https://github.com/Azure-Samples/open-liberty-on-aks.git
cd open-liberty-on-aks
git checkout 20240909
cd java-app-jcache
detached HEAD
상태에 있는 것에 대한 메시지가 표시되면 이 메시지는 무시해도 안전합니다. 태그를 확인한 것일 뿐입니다.
애플리케이션의 파일 구조는 다음과 같습니다.
java-app-jcache/
├── pom.xml
└── src
└── main
├── aks
│ └── openlibertyapplication.yaml
├── docker
│ ├── Dockerfile
│ └── Dockerfile-wlp
├── java
├── liberty
│ └── config
│ └── server.xml
├── redisson
│ └── redisson-config.yaml
├── resources
└── webapp
Java, 리소스 및 웹앱 디렉터리에는 샘플 애플리케이션의 소스 코드가 포함됩니다.
aks 디렉터리에서 배포 파일 openlibertyapplication.yaml은 애플리케이션 이미지를 배포하는 데 사용됩니다.
Docker 디렉터리에 두 개의 Dockerfile을 배치합니다. Dockerfile 은 Open Liberty를 사용하여 이미지를 빌드하는 데 사용되며 Dockerfile-wlp 는 WebSphere Liberty를 사용하여 이미지를 빌드하는 데 사용됩니다.
liberty/config 디렉터리에서 server.xml 파일은 Open Liberty 및 WebSphere Liberty 클러스터에 대한 세션 캐시를 구성하는 데 사용됩니다.
redisson 디렉터리에서 redisson-config.yaml 파일은 Azure Cache for Redis 인스턴스의 연결을 구성하는 데 사용됩니다.
애플리케이션 컨테이너화
AKS 클러스터에서 Liberty 애플리케이션을 배포하고 실행하려면 다음 단계를 사용하여 애플리케이션을 Docker 이미지로 컨테이너화합니다. Open Liberty 컨테이너 이미지 또는 WebSphere Liberty 컨테이너 이미지를 사용할 수 있습니다.
현재 작업 디렉터리가 로컬 클론의 java-app-jcache 인지 확인합니다.
mvn clean package
를 실행하여 애플리케이션을 패키징합니다.Redisson 구성 파일을 지정된 위치에 복사하려면 실행
mvn -Predisson validate
합니다. 이 단계에서는 환경 변수REDISCACHEHOSTNAME
의 값을 삽입하고REDISCACHEKEY
server.xml 파일에서 참조하는 redisson-config.yaml 파일에 삽입합니다.실행
mvn liberty:dev
하여 애플리케이션을 테스트합니다. 테스트에 성공하면 명령 출력에 표시됩니다The defaultServer server is ready to run a smarter planet.
. Redis 연결이 성공하면 다음과 유사한 출력이 표시됩니다.[INFO] [err] [Default Executor-thread-5] INFO org.redisson.Version - Redisson 3.23.4 [INFO] [err] [redisson-netty-2-7] INFO org.redisson.connection.pool.MasterPubSubConnectionPool - 1 connections initialized for redacted.redis.cache.windows.net/20.25.90.239:6380 [INFO] [err] [redisson-netty-2-20] INFO org.redisson.connection.pool.MasterConnectionPool - 24 connections initialized for redacted.redis.cache.windows.net/20.25.90.239:6380
애플리케이션이 실행 중인지 확인할 수
http://localhost:9080/
있지만 Redis 작동 증명은 이전 단계에 나열된 출력입니다.Ctrl+C 사용하여 애플리케이션을 중지합니다.
다음 명령을 사용하여 pom.xml 파일에 정의된 속성
artifactId
및version
값을 검색합니다.export artifactId=$(mvn -q -Dexec.executable=echo -Dexec.args='${project.artifactId}' --non-recursive exec:exec) export version=$(mvn -q -Dexec.executable=echo -Dexec.args='${project.version}' --non-recursive exec:exec)
cd target
을 실행하여 디렉터리를 샘플 빌드로 변경합니다.다음 명령 중 하나를 실행하여 애플리케이션 이미지를 빌드하고 ACR 인스턴스에 밀어넣습니다.
Open Liberty를 간단한 오픈 소스 Java™ 런타임으로 사용하려는 경우 다음 명령을 사용하여 Open Liberty 기본 이미지를 빌드합니다.
# Build and tag application image. This causes the ACR instance to pull the necessary Open Liberty base images. az acr build -t ${artifactId}:${version} -r $REGISTRY_NAME --resource-group $RESOURCE_GROUP_NAME .
상용 버전의 Open Liberty를 사용하려는 경우 다음 명령을 사용하여 WebSphere Liberty 기본 이미지를 빌드합니다.
# Build and tag application image. This causes the ACR instance to pull the necessary WebSphere Liberty base images. az acr build -t ${artifactId}:${version} -r $REGISTRY_NAME --resource-group $RESOURCE_GROUP_NAME --file=Dockerfile-wlp .
애플리케이션 배포
이 섹션의 단계에 따라 AKS 클러스터에 컨테이너화된 샘플 애플리케이션을 배포합니다.
현재 작업 디렉터리가 로컬 클론의 java-app-jcache/target 인지 확인합니다.
다음 명령을 사용하여 Redisson 구성 정보를 사용하여 비밀을 만듭니다. 이 비밀을 사용하면 애플리케이션이 생성된 Azure Cache for Redis 인스턴스에 연결할 수 있습니다.
export REDISSON_CONFIG_SECRET_NAME=redisson-config-secret kubectl create secret generic ${REDISSON_CONFIG_SECRET_NAME} --from-file=$(pwd)/liberty/wlp/usr/servers/defaultServer/redisson-config.yaml
다음 명령을 사용하여 AKS 클러스터에 세 개의 복제본이 있는 Liberty 애플리케이션을 배포합니다. 명령 출력도 인라인으로 표시됩니다.
# Set number of application replicas export REPLICAS=3 # Create OpenLibertyApplication "javaee-cafe-jcache-cluster" envsubst < openlibertyapplication.yaml | kubectl create -f - openlibertyapplication.openliberty.io/javaee-cafe-jcache-cluster created # Check if OpenLibertyApplication instance is created kubectl get openlibertyapplication ${artifactId}-cluster NAME IMAGE EXPOSED RECONCILED AGE javaee-cafe-jcache-cluster youruniqueacrname.azurecr.io/javaee-cafe-jcache:1.0.0 True 59s # Check if deployment created by Operator is ready kubectl get deployment ${artifactId}-cluster --watch NAME READY UP-TO-DATE AVAILABLE AGE javaee-cafe-jcache-cluster 0/3 3 0 20s
열 아래와
3
열 아래에READY
AVAILABLE
표시3/3
될 때까지 기다린 다음 Ctrl+C를 사용하여 조사식 프로세스를 중지kubectl
합니다.
애플리케이션 테스트
애플리케이션이 실행되면 Kubernetes 부하 분산 장치 서비스가 애플리케이션 프런트 엔드를 인터넷에 공개합니다. 이 프로세스를 완료하는 데 시간이 걸릴 수 있습니다.
진행률을 모니터링하려면 --watch
인수와 함께 kubectl get service
명령을 사용합니다.
kubectl get service ${artifactId}-cluster --watch
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
javaee-cafe-jcache-cluster LoadBalancer 10.0.50.29 20.84.16.169 80:31732/TCP 68s
EXTERNAL-IP
주소가 pending
에서 실제 공용 IP 주소로 변경되면 Ctrl+C를 사용하여 kubectl
감시 프로세스를 중지합니다.
웹 브라우저를 서비스의 외부 IP 주소(이전 예제의 경우20.84.16.169
)로 열어 애플리케이션 홈페이지를 확인합니다. 페이지가 올바르게 로드되지 않으면 앱이 시작되기 때문입니다. 잠시 기다렸다가 나중에 페이지를 새로 고칠 수 있습니다. 페이지 맨 위 왼쪽에서 애플리케이션 복제본의 Pod 이름을 볼 수 있습니다(이 경우javaee-cafe-jcache-cluster-77d54bccd4-5xnzx).
AK S에 성공적으로 배포된 Java liberty 애플리케이션의 스크린샷
세션의 새 커피 양식에서 이름 및 가격 필드에 대한 값을 설정한 다음 제출을 선택합니다. 몇 초 후에 페이지 왼쪽 아래에 제출 횟수 1 이 표시됩니다.
애플리케이션 세션에서 만들어지고 유지되는 새 커피를 보여 주는 샘플 애플리케이션의 스크린샷.
세션 캐시가 애플리케이션의 모든 복제본에서 유지됨을 보여 주려면 다음 명령을 실행하여 Pod 이름으로 javaee-cafe-jcache-cluster-<pod id from your running app>
현재 복제본을 삭제합니다.
kubectl delete pod javaee-cafe-jcache-cluster-77d54bccd4-5xnzx
pod "javaee-cafe-jcache-cluster-77d54bccd4-5xnzx" deleted
그런 다음 애플리케이션 홈 페이지를 새로 고칩니다. 세션의 새 커피와
마지막으로, 다음 단계를 사용하여 세션 데이터가 Azure Cache for Redis 인스턴스에 유지됨을 보여 줍니다. Redis 콘솔을 사용하여 Azure Cache for Redis 인스턴스에 명령을 실행할 수 있습니다.
Azure Portal에서 Azure Cache for Redis 인스턴스를 찾습니다.
콘솔을 선택하여 Redis 콘솔을 엽니다.
다음 명령을 실행하여 세션 데이터를 봅니다.
scan 0 count 1000 match '*' hgetall "com.ibm.ws.session.attr.default_host%2F"
Azure Cache for Redis 인스턴스에서 만들고 유지한 커피인 웹 페이지에서 café.model.entity.Coffee[id=1, name=Coffee 3, price=30.0]를 검색합니다.
리소스 정리
Azure 요금을 방지하려면 불필요한 리소스를 정리해야 합니다. 클러스터가 더 이상 필요하지 않은 경우 az group delete
명령을 사용하여 리소스 그룹, 컨테이너 서비스, 컨테이너 레지스트리 및 모든 관련 리소스를 제거합니다.
az group delete --name $RESOURCE_GROUP_NAME --yes --no-wait
Azure Cache for Redis 인스턴스를 삭제하려면 해당 리소스 그룹 이름을 찾고 다음 명령을 실행합니다.
az group delete --name <AZURE_CACHE_FOR_REDIS_RESOURCE_GROUP_NAME> --yes --no-wait
다음 단계
이 가이드에 사용된 참조에서 자세한 내용을 알아볼 수 있습니다.
Azure에서 WebSphere 제품을 실행하는 옵션을 살펴보려면 Azure 에서 WebSphere 제품군을 실행하는 솔루션은 무엇인가요?