Helm을 사용하여 애플리케이션 배포
적용 대상: Azure Local 22H2의 AKS, Windows Server의 AKS
Helm은 Kubernetes 애플리케이션을 설치하고 수명 주기를 관리하는 오픈 소스 패키징 도구입니다. APT 및 Yum과 같은 Linux 패키지 관리자와 마찬가지로 Helm은 미리 구성된 Kubernetes 리소스의 패키지인 Kubernetes 차트를 관리합니다.
이 문서에서는 Azure Arc에서 사용하도록 설정된 Azure Kubernetes Service를 사용하는 경우 Helm을 사용하여 AKS에서 애플리케이션을 패키지하고 배포하는 방법을 설명합니다.
시작하기 전에
다음 요구 사항을 설정했는지 확인합니다.
- 실행 중인 하나 이상의 Windows 또는 Linux 작업자 노드가 있는 Kubernetes 클러스터입니다.
- 클러스터를 가리키도록 로컬
kubectl
환경을 구성했습니다. Get-AksHciCredential PowerShell 명령을 사용하여kubectl
클러스터에 액세스할 수 있습니다. - Helm v3 명령줄 및 필수 구성 요소가 설치되었습니다.
- DockerHub 또는 Azure Container Registry와 같은 사용 가능한 컨테이너 레지스트리입니다.
이 문서에서는 ASP.NET Core 애플리케이션을 예로 사용합니다. 이 GitHub 리포지토리에서 샘플 애플리케이션을 다운로드할 수 있습니다.
애플리케이션이 Kubernetes에 배포되므로 다음 예제는 프로젝트에 대한 간단한 Dockerfile입니다.
FROM mcr.microsoft.com/dotnet/aspnet:5.0-alpine AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443
FROM mcr.microsoft.com/dotnet/sdk:5.0-alpine AS build
WORKDIR /src
COPY ["MyMicroservice.csproj", "./"]
RUN dotnet restore "MyMicroservice.csproj"
COPY . .
WORKDIR "/src/."
RUN dotnet build "MyMicroservice.csproj" -c Release -o /app/build
FROM build AS publish
RUN dotnet publish "MyMicroservice.csproj" -c Release -o /app/publish
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "MyMicroservice.dll"]
샘플 애플리케이션을 빌드하고 컨테이너 레지스트리에 푸시
애플리케이션 폴더로 이동하고 Dockerfile을 사용하여 다음 명령을 사용하여 이미지를 빌드하고 푸시합니다.
docker build -f Dockerfile -t acr.azurecr.io/mymicroservice:0.1.0 .
참고 항목
명령 끝에 있는 마침표(.)는 Dockerfile의 위치(이 경우 현재 디렉터리)를 설정합니다.
이 명령은 로컬 컴퓨터에 이미지를 mymicroservice:0.1.0
만듭니다. 이미지가 성공적으로 생성되었는지 확인하려면 다음을 실행 docker images
하여 확인합니다.
REPOSITORY TAG IMAGE ID CREATED SIZE
acr.azurecr.io/mymicroservice 0.1.0 5be713db571b About a minute ago 107MB
....
다음으로, DockerHub 또는 Azure Container Registry와 같은 컨테이너 레지스트리에 이미지를 푸시합니다. 이 예제에서는 컨테이너 이미지가 Azure Container Registry로 푸시됩니다. 자세한 내용은 ACR에서 Kubernetes 클러스터로 이미지 끌어오기를 참조하세요.
docker push acr.azurecr.io/mymicroservice:0.1.0
Helm 차트 만들기
이제 샘플 애플리케이션이 준비되었으므로 다음 단계는 다음과 같이 명령을 사용하여 Helm 차트를 helm create
생성하는 것입니다.
helm create mymicroserviceapp
다음과 같이 mymicroserviceapp/values.yaml을 업데이트합니다.
-
image.repository
를acr.azurecr.io/mymicroservice
로 바꿉니다. -
service.type
를NodePort
로 바꿉니다.
예시:
# Default values for webfrontend.
# This is a YAML-formatted file.
# Declare variables to be passed into your templates.
replicaCount: 1
image:
repository: acr.azurecr.io/mymicroservice
pullPolicy: IfNotPresent
...
service:
type: NodePort
port: 80
...
mymicroserviceapp/templates/deployment.yaml 파일로 이동하여 상태 검사를 구성합니다. Kubernetes는 상태 검사를 사용하여 애플리케이션 배포를 관리합니다. 다음 예제와 liveness
같이 두 프로브readiness
의 path: /weatherforecast
경로를 모두 로 바꿉니다.
...
livenessProbe:
httpGet:
path: /weatherforecast
port: http
initialDelaySeconds: 0
periodSeconds: 10
timeoutSeconds: 1
failureThreshold: 3
readinessProbe:
httpGet:
path: /weatherforecast
port: http
successThreshold: 3
...
Kubernetes에 Helm 차트 배포
솔루션 디렉터리의 charts\mymicroserviceapp 디렉터리부터 다음 명령을 실행합니다.
helm upgrade --install mymicroserviceapp . --namespace=local --set mymicroserviceapp.image.tag="0.1.0"
이 명령은 Kubernetes 클러스터의 네임스페이스에 있는 이름을 mymicroserviceapp
local
사용하여 기존 릴리스를 만들거나 업그레이드하며 이 예제와 유사한 출력을 생성합니다.
Release "mymicroserviceapp" does not exist. Installing it now.
NAME: mymicroserviceapp
LAST DEPLOYED: Fri Apr 2 08:47:24 2021
NAMESPACE: local
STATUS: deployed
REVISION: 1
NOTES:
1. Get the application URL by running these commands:
export NODE_PORT=$(kubectl get --namespace local -o jsonpath="{.spec.ports[0].nodePort}" services mymicroserviceapp)
export NODE_IP=$(kubectl get nodes --namespace local -o jsonpath="{.items[0].status.addresses[0].address}")
echo http://$NODE_IP:$NODE_PORT
Helm 차트를 배포한 후 실행 kubectl get all -n local
하여 리소스가 올바르게 배포되었는지 확인할 수 있습니다.
명령 실행의 출력은 다음과 같습니다.
NAME READY STATUS RESTARTS AGE
pod/mymicroserviceapp-7849f949df-fwgbn 1/1 Running 0 101s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/mymicroserviceapp NodePort 10.100.149.1 <none> 80:30501/TCP 101s
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/mymicroserviceapp 1/1 1 1 101s
NAME DESIRED CURRENT READY AGE
replicaset.apps/mymicroserviceapp-7849f949df 1 1 1 101s
배포 테스트
애플리케이션은 서비스 및 노드 포트를 사용하여 배포되므로 클러스터 외부에서 API를 호출할 수 있습니다. 이 호출을 수행하려면 http://$NODE_IP:$NODE_PORT로 요청을 보냅니다.
curl http://10.193.2.103:30501/WeatherForeCast/
StatusCode : 200
StatusDescription : OK
Content : [{"date":"2021-04-03T15:51:04.795216+00:00","temperatureC":45,"temperatureF":112,"summary":"Balmy"},{"date":"2021-04-04T15:51:04.
7952176+00:00","temperatureC":23,"temperatureF":73,"summary":"Cool"},{"...
RawContent : HTTP/1.1 200 OK
Transfer-Encoding: chunked
Content-Type: application/json; charset=utf-8
Date: Fri, 02 Apr 2021 15:51:04 GMT
Server: Kestrel
[{"date":"2021-04-03T15:51:04.795216+00:00","tempera...
Forms : {}
Headers : {[Transfer-Encoding, chunked], [Content-Type, application/json; charset=utf-8], [Date, Fri, 02 Apr 2021 15:51:04 GMT], [Server,
Kestrel]}
Images : {}
InputFields : {}
Links : {}
ParsedHtml : mshtml.HTMLDocumentClass
RawContentLength : 494
클러스터 정리
마지막 단계는 클러스터를 정리하는 것입니다. Kubernetes 배포 리소스를 삭제하려면 다음 명령을 실행합니다.
helm uninstall mymicroserviceapp -n local
다음 예와 유사한 출력이 표시됩니다.
release "mymicroserviceapp" uninstalled