다음을 통해 공유


AKS(Azure Kubernetes Service)에서 Helm을 사용하여 기존 애플리케이션 설치

Helm은 Kubernetes 애플리케이션을 설치하고 수명 주기를 관리하는 오픈 소스 패키징 도구입니다. APTYum과 같은 Linux 패키지 관리자와 유사하게 Helm을 사용하여 사전 구성된 Kubernetes 리소스 패키지인 Kubernetes 차트를 관리합니다.

이 문서에서는 AKS(Azure Kubernetes Service)의 Kubernetes 클러스터에서 Helm을 구성하고 사용하는 방법을 보여 줍니다.

시작하기 전에

  • 이 문서에서는 기존 AKS 클러스터가 있다고 가정합니다. AKS 클러스터가 필요한 경우 Azure CLI, Azure PowerShell 또는 Azure Portal을 사용하여 만듭니다.
  • AKS 클러스터에는 통합 ACR이 있어야 합니다. 통합 ACR을 포함하는 AKS 클러스터를 만드는 방법에 대한 자세한 내용은 Azure Kubernetes Service의 Azure Container Registry를 사용하여 인증을 참조하세요.
  • 또한 개발 시스템에서 실행되는 클라이언트인 Helm CLI가 설치되어 있어야 합니다. Helm을 사용하여 애플리케이션을 시작, 중지, 관리할 수 있습니다. Azure Cloud Shell을 사용하는 경우 Helm CLI가 이미 설치되어 있습니다. 로컬 플랫폼에서의 설치 지침은 Helm 설치를 참조하세요.

Important

Helm은 Linux 노드에서 실행하기 위해 사용됩니다. 클러스터에 Windows Server 노드가 있는 경우 Helm Pod 실행이 Linux 노드에서만 이루어지도록 예약되었는지 확인해야 합니다. 또한 설치하는 Helm 차트 실행이 올바른 노드에서 이루어지도록 예약되었는지 확인해야 합니다. 이 문서의 명령은 노트 선택기를 사용하여 Pod가 올바른 노드에 예약되었는지 확인하지만 일부 Helm 차트는 노드 선택기를 표시하지 않을 수 있습니다. 클러스터에서 Taints와 같은 다른 옵션의 사용을 고려할 수 있습니다.

Helm 버전 확인

  • helm version 명령을 사용하여 Helm 3이 설치되어 있는지 확인합니다.

    helm version
    

    다음 예제는 Helm 버전 3.0.0이 설치되어 있음을 보여 줍니다.

    version.BuildInfo{Version:"v3.0.0", GitCommit:"e29ce2a54e96cd02ccfce88bee4f58bb6e2a28b6", GitTreeState:"clean", GoVersion:"go1.13.4"}
    

Helm v3을 사용하여 애플리케이션 설치

Helm 리포지토리 추가

  • helm repo 명령을 사용하여 ingress-nginx 리포지토리를 추가합니다.

    helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
    

Helm 차트 찾기

  1. helm search 명령을 사용하여 미리 만들어진 Helm 차트를 검색합니다.

    helm search repo ingress-nginx
    

    다음 압축된 예제 출력에서는 사용할 Helm 차트의 일부를 보여줍니다.

    NAME                            CHART VERSION   APP VERSION     DESCRIPTION                                       
    ingress-nginx/ingress-nginx     4.7.0           1.8.0           Ingress controller for Kubernetes using NGINX a...
    
  2. helm repo update 명령을 사용하여 차트 목록을 업데이트합니다.

    helm repo update
    

    다음 예제는 성공적인 리포지토리 업데이트를 보여 줍니다.

    Hang tight while we grab the latest from your chart repositories...
    ...Successfully got an update from the "ingress-nginx" chart repository
    Update Complete. ⎈ Happy Helming!⎈
    

Helm 차트 이미지를 ACR로 가져오기

이 문서에서는 세 개의 컨테이너 이미지가 사용되는 NGINX 수신 컨트롤러 Helm 차트를 사용합니다.

  • az acr import를 사용하여 NGINX 수신 컨트롤러 이미지를 ACR로 가져옵니다.

    REGISTRY_NAME=<REGISTRY_NAME>
    CONTROLLER_REGISTRY=registry.k8s.io
    CONTROLLER_IMAGE=ingress-nginx/controller
    CONTROLLER_TAG=v1.8.0
    PATCH_REGISTRY=registry.k8s.io
    PATCH_IMAGE=ingress-nginx/kube-webhook-certgen
    PATCH_TAG=v20230407
    DEFAULTBACKEND_REGISTRY=registry.k8s.io
    DEFAULTBACKEND_IMAGE=defaultbackend-amd64
    DEFAULTBACKEND_TAG=1.5
    
    az acr import --name $REGISTRY_NAME --source $CONTROLLER_REGISTRY/$CONTROLLER_IMAGE:$CONTROLLER_TAG --image $CONTROLLER_IMAGE:$CONTROLLER_TAG
    az acr import --name $REGISTRY_NAME --source $PATCH_REGISTRY/$PATCH_IMAGE:$PATCH_TAG --image $PATCH_IMAGE:$PATCH_TAG
    az acr import --name $REGISTRY_NAME --source $DEFAULTBACKEND_REGISTRY/$DEFAULTBACKEND_IMAGE:$DEFAULTBACKEND_TAG --image $DEFAULTBACKEND_IMAGE:$DEFAULTBACKEND_TAG
    

    참고 항목

    컨테이너 이미지를 ACR로 가져오는 것 외에도 Helm 차트를 ACR로 가져올 수도 있습니다. 자세한 내용은 Azure 컨테이너 레지스트리에 Helm 차트 푸시 및 끌어오기를 참조하세요.

Helm 차트 실행

  1. helm install 명령을 사용하여 Helm 차트를 설치하고 설치할 차트의 릴리스 이름과 이름을 지정합니다.

    다음 예제는 ingress-basic이라는 수신 리소스에 대한 Kubernetes 네임스페이스를 만들고 해당 네임스페이스 내에서 작동하도록 작성되었습니다. 필요에 따라 사용자 환경에 대한 네임스페이스를 지정합니다.

    ACR_URL=<REGISTRY_URL>
    
    # Create a namespace for your ingress resources
    kubectl create namespace ingress-basic
    
    # Use Helm to deploy an NGINX ingress controller
    helm install ingress-nginx ingress-nginx/ingress-nginx \
        --version 4.0.13 \
        --namespace ingress-basic \
        --set controller.replicaCount=2 \
        --set controller.nodeSelector."kubernetes\.io/os"=linux \
        --set controller.image.registry=$ACR_URL \
        --set controller.image.image=$CONTROLLER_IMAGE \
        --set controller.image.tag=$CONTROLLER_TAG \
        --set controller.image.digest="" \
        --set controller.admissionWebhooks.patch.nodeSelector."kubernetes\.io/os"=linux \
        --set controller.service.annotations."service\.beta\.kubernetes\.io/azure-load-balancer-health-probe-request-path"=/healthz \
        --set controller.admissionWebhooks.patch.image.registry=$ACR_URL \
        --set controller.admissionWebhooks.patch.image.image=$PATCH_IMAGE \
        --set controller.admissionWebhooks.patch.image.tag=$PATCH_TAG \
        --set defaultBackend.nodeSelector."kubernetes\.io/os"=linux \
        --set defaultBackend.image.registry=$ACR_URL \
        --set defaultBackend.image.image=$DEFAULTBACKEND_IMAGE \
        --set defaultBackend.image.tag=$DEFAULTBACKEND_TAG \
        --set defaultBackend.image.digest=""
    

    다음 압축된 예제 출력에서는 Helm 차트에서 만든 Kubernetes 리소스의 배포 상태를 보여줍니다.

    NAME: nginx-ingress
    LAST DEPLOYED: Wed Jul 28 11:35:29 2021
    NAMESPACE: ingress-basic
    STATUS: deployed
    REVISION: 1
    TEST SUITE: None
    NOTES:
    The ingress-nginx controller has been installed.
    It may take a few minutes for the LoadBalancer IP to be available.
    You can watch the status by running 'kubectl --namespace ingress-basic get services -o wide -w nginx-ingress-ingress-nginx-controller'
    ...
    
  2. kubectl get services 명령을 사용하여 서비스의 EXTERNAL-IP를 가져옵니다.

    kubectl --namespace ingress-basic get services -o wide -w ingress-nginx-ingress-nginx-controller
    

    다음 예제 출력은 ingress-nginx-ingress-nginx-controller 서비스의 EXTERNAL-IP를 보여 줍니다.

    NAME                                     TYPE           CLUSTER-IP    EXTERNAL-IP     PORT(S)                      AGE   SELECTOR
    nginx-ingress-ingress-nginx-controller   LoadBalancer   10.0.254.93   <EXTERNAL_IP>   80:30004/TCP,443:30348/TCP   61s   app.kubernetes.io/component=controller,app.kubernetes.io/instance=nginx-ingress,app.kubernetes.io/name=ingress-nginx
    

릴리스 나열

  • helm list 명령을 사용하여 클러스터에 설치된 릴리스 목록을 가져옵니다.

    helm list --namespace ingress-basic
    

    다음 예제 출력은 이전 단계에서 배포한 ingress-nginx 릴리스를 보여 줍니다.

    NAME            NAMESPACE       REVISION        UPDATED                                 STATUS          CHART                   APP VERSION
    ingress-nginx   ingress-basic   1               2021-07-28 11:35:29.9623734 -0500 CDT   deployed        ingress-nginx-3.34.0    0.47.0
    

리소스 정리

Helm 차트를 배포하면 Pod, 배포, 서비스와 같은 Kubernetes 리소스가 만들어집니다.

  • helm uninstall 명령을 사용하여 리소스를 정리하고 릴리스 이름을 지정합니다.

    helm uninstall --namespace ingress-basic ingress-nginx
    

    다음 예제 출력은 my-nginx-ingress라는 릴리스가 제거되었음을 보여 줍니다.

    release "nginx-ingress" uninstalled
    
  • kubectl delete 명령을 사용하여 리소스와 함께 전체 샘플 네임스페이스를 삭제하고 네임스페이스 이름을 지정합니다.

    kubectl delete namespace ingress-basic
    

다음 단계

Helm을 사용하여 Kubernetes 애플리케이션 배포를 관리하는 방법에 대한 자세한 내용은 Helm 설명서를 참조하세요.