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 클러스터에 컨테이너화된 애플리케이션을 배포합니다.

이 문서는 배포를 신속하게 수행할 수 있도록 하기 위한 것입니다. 프로덕션으로 가기 전에 튜닝 리버티를 탐색해야 합니다.

Azure 구독이 아직 없는 경우 시작하기 전에 체험 계정을 만듭니다.

사전 요구 사항

  • 이 문서에는 최신 버전의 Azure CLI가 필요합니다. Azure Cloud Shell을 사용하는 경우 최신 버전이 이미 설치되어 있습니다.
  • 이 가이드의 명령을 로컬로 실행하는 경우(Azure Cloud Shell 대신):
    • Unix와 유사한 운영 체제가 설치된 로컬 머신을 준비합니다(예: Ubuntu, macOS, Linux용 Windows 하위 시스템).
    • Java SE 구현 버전 17 이상을 설치합니다(예: Eclipse Open J9).
    • Maven 3.5.0 이상을 설치합니다.
    • 해당 OS용 Docker를 설치합니다.
  • 구독에 대한 역할 또는 ContributorUser 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 \
    --admin-enabled

잠시 후 다음을 포함하는 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)
export USER_NAME=$(az acr credential show \
    --name $REGISTRY_NAME \
    --resource-group $RESOURCE_GROUP_NAME \
    --query 'username' \
    --output tsv)
export PASSWORD=$(az acr credential show \
    --name $REGISTRY_NAME \
    --resource-group $RESOURCE_GROUP_NAME \
    --query 'passwords[0].value' \
    --output tsv)

docker login $LOGIN_SERVER -u $USER_NAME -p $PASSWORD

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을 사용합니다. Azure Cloud Shell을 사용하는 경우 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

다음 예제 출력은 이전 단계에서 만든 단일 노드를 보여줍니다. 노드의 상태 준비되었는지 확인합니다.

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.2.2
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 인스턴스를 만들고 연결 정보를 적어둡니다. 이 정보는 나중에 사용합니다.

  1. 빠른 시작의 단계를 수행합니다. Java에서 Azure Cache for Redis를 사용하지만 Java 샘플 이해는 포함하지 않습니다.

  2. Azure Cache for Redis 인스턴스의 호스트 이름기본 액세스 키를 복사한 다음, 다음 명령을 실행하여 환경 변수를 추가합니다.

    export REDISCACHEHOSTNAME=<YOUR_HOST_NAME>
    export REDISCACHEKEY=<YOUR_PRIMARY_ACCESS_KEY>
    

애플리케이션 빌드

이 섹션의 단계에 따라 샘플 애플리케이션을 빌드하고 컨테이너화합니다. 이러한 단계에서는 Maven 및 liberty-maven-pluginaz 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 20230906

"분리된 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 컨테이너 이미지를 사용할 수 있습니다.

  1. 디렉터리를 로컬 클론의 java-app-jcache 로 변경합니다.

  2. mvn clean package를 실행하여 애플리케이션을 패키징합니다.

  3. Redisson 구성 파일을 지정된 위치에 복사하려면 실행 mvn -Predisson validate 합니다. 이 단계에서는 환경 변수 REDISCACHEHOSTNAMEREDISCACHEKEY 의 값을 server.xml 파일에서 참조하는 redisson-config.yaml 파일에 삽입합니다.

  4. 실행 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.16.7
    [INFO] [err] [redisson-netty-2-2] 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
    
  5. 애플리케이션이 실행 중인지 확인할 수 http://localhost:9080/ 있지만 Redis 작동 증명은 이전 단계에 나열된 출력입니다.

  6. Ctrl+C를 사용하여 애플리케이션을 중지합니다.

  7. 다음 명령을 사용하여 속성 artifactId 에 대한 값을 검색하고 version pom.xml 파일에 정의합니다.

    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)
    
  8. cd target을 실행하여 디렉터리를 샘플 빌드로 변경합니다.

  9. 다음 명령 중 하나를 실행하여 애플리케이션 이미지를 빌드하고 ACR 인스턴스에 밀어넣습니다.

    • Open Liberty를 간단한 오픈 소스 Java™ 런타임으로 사용하려는 경우 다음 명령을 사용하여 Open Liberty 기본 이미지를 빌드합니다.

      # Build and tag application image. This will cause 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 will cause 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 클러스터에 컨테이너화된 샘플 애플리케이션을 배포합니다.

  1. 현재 작업 디렉터리가 로컬 클론의 java-app-jcache/target 인지 확인합니다.

  2. 다음 명령을 사용하여 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
    
  3. 다음 명령을 사용하여 AKS 클러스터에 세 개의 복제본(replica) 있는 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
    
  4. 열 아래와 3 열 아래에 READYAVAILABLE 표시 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 주소가 보류 중인 실제 공용 IP 주소로 변경되면 Ctrl+C를 사용하여 조사식 프로세스를 중지 kubectl 합니다.

서비스의 외부 IP 주소(위의 예에서 20.84.16.169)로 웹 브라우저를 열어 애플리케이션 홈페이지를 확인합니다. 페이지가 올바르게 로드되지 않으면 앱이 시작되기 때문입니다. 잠시 기다렸다가 나중에 페이지를 새로 고칠 수 있습니다. 이 경우 페이지의javaee-cafe-jcache-cluster-77d54bccd4-5xnzx 왼쪽 위에 애플리케이션 복제본(replica) Pod 이름이 표시됩니다.

Screenshot of Java liberty application successfully deployed on A K S.

세션의 새 커피 양식에서 이름가격 필드에 대한 값을 설정한 다음 제출을 선택합니다. 몇 초 후에 페이지 왼쪽 아래에 제출 횟수 1 이 표시됩니다.

Screenshot of sample application showing new coffee created and persisted in the session of the application.

세션 캐시가 애플리케이션의 모든 복제본(replica) 걸쳐 유지됨을 보여 주려면 다음 명령을 실행하여 Pod 이름으로 javaee-cafe-jcache-cluster-<pod id from your running app>현재 복제본(replica) 삭제합니다.

kubectl delete pod javaee-cafe-jcache-cluster-77d54bccd4-5xnzx

pod "javaee-cafe-jcache-cluster-77d54bccd4-5xnzx" deleted

그런 다음 애플리케이션 홈 페이지를 새로 고칩니다. 세션의 새 커피 섹션에 동일한 데이터가 표시되지만 페이지의 왼쪽 위에 다른 Pod 이름이 표시됩니다.

마지막으로, 다음 단계를 사용하여 세션 데이터가 Azure Cache for Redis 인스턴스에 유지됨을 보여 줍니다. Redis 콘솔을 사용하여 Azure Cache for Redis 인스턴스에 명령을 실행할 수 있습니다.

  1. Azure Portal에서 Azure Cache for Redis 인스턴스를 찾습니다.

  2. 콘솔을 선택하여 Redis 콘솔을 엽니다.

  3. 다음 명령을 실행하여 세션 데이터를 봅니다.

    scan 0 count 1000 match '*'
    
    hgetall "com.ibm.ws.session.attr.default_host%2F"
    
  4. 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

다음 단계

이 가이드에 사용된 참조에서 자세한 내용을 알아볼 수 있습니다.