Azure Files를 사용하여 AKS(Azure Kubernetes Service)에 고가용성 GitHub Actions를 배포하기 위한 인프라 만들기

이 문서에서는 Azure Files 및 Helm을 사용하여 AKS에 고가용성 ARC(Actions Runner Controller) 인프라를 배포하는 데 필요한 인프라를 만듭니다.

시작하기 전 주의 사항:

환경 변수 설정

이 가이드 전체에서 사용할 다음 환경 변수를 설정합니다.

export AKS_AND_STORAGE_ACCOUNT_RG="aks-files-actions"
export AKS_CLUSTER_NAME="aks-actions"
export STORAGE_ACCOUNT_NAME=""
export AKS_STORAGE_ACCOUNT_LOCATION="westus3"
export GITHUB_CONFIG_URL="azure-files-samples/Workloads/azurefiles-actions-aks at master · Azure-Samples/azure-files-samples"

# Optional. Changes might require additional changes on ./install/*.yaml files.

export NAMESPACE_ARC_CONTROLLER="arc-systems"
export ARC_CONTROLLER_NAME="arc-controller"
export NAMESPACE_ARC_RUNNERS="arc-runners"
export ARC_RUNNER_SCALESET_NAME="arc-runner-set"
export ARC_RUNNER_GITHUB_SECRET_NAME=""

다음 필수 변수의 값을 바꿔야 합니다.

  • AKS_AND_STORAGE_ACCOUNT_RG 스토리지 계정 및 AKS 클러스터에서 사용하는 리소스 그룹의 이름으로
  • AKS_CLUSTER_NAME AKS 클러스터의 이름을 사용합니다.
  • STORAGE_ACCOUNT_NAME 스토리지 계정의 이름을 사용합니다.
  • AKS_STORAGE_ACCOUNT_LOCATION를 리소스를 생성할 지역의 이름으로 지정합니다. 이 예제에서는 성능 및 비용 관리를 용이하게 하기 위해 AKS 클러스터와 동일한 지역에 배포합니다.
  • GITHUB_CONFIG_URL GitHub 조직 또는 리포지토리에 대한 URL을 사용합니다.

가능한 경우 다음 선택적 변수를 기본값으로 유지하세요.

  • NAMESPACE_ARC_CONTROLLER: ARC 실행기 확장 집합 컨트롤러를 실행할 Kubernetes 네임스페이스의 이름입니다.
  • ARC_CONTROLLER_NAME: ARC 실행기 확장 집합 컨트롤러의 이름입니다.
  • NAMESPACE_ARC_RUNNERS: ARC 자체 호스팅 실행기를 실행할 Kubernetes 네임스페이스의 이름입니다.
  • ARC_RUNNER_SCALESET_NAME: ARC 실행기 확장 집합의 이름입니다.
  • ARC_RUNNER_GITHUB_SECRET_NAME: GitHub 비밀의 이름입니다.

필요한 확장 설치

aks-preview, k8s-extension 및 amg 확장은 Kubernetes 클러스터를 관리하고 Azure 리소스를 쿼리하는 데 더 많은 기능을 제공합니다. 다음 az extension add 명령을 사용하여 이러한 확장을 설치합니다.

az extension add --upgrade --name aks-preview --yes --allow-preview true 
az extension add --upgrade --name k8s-extension --yes --allow-preview false 
az extension add --upgrade --name amg --yes --allow-preview false

리소스 그룹 만들기

az group create 명령을 사용하여 리소스 그룹을 만듭니다. 이 리소스 그룹은 AKS 클러스터 및 Azure Files 스토리지 계정을 보유합니다.

az group create \ 
    --name $AKS_AND_STORAGE_ACCOUNT_RG \ 
    --location $AKS_STORAGE_ACCOUNT_LOCATION

AKS 클러스터 만들기

az aks create 명령을 사용하여 AKS 클러스터를 만듭니다.

az aks create --resource-group "${AKS_AND_STORAGE_ACCOUNT_RG}" --name "${AKS_CLUSTER_NAME}" \ 
    --os-sku AzureLinux \ 
    --node-count 1 \ 
    --enable-cluster-autoscaler \ 
    --min-count 1 \ 
    --max-count 3 \ 
    --node-vm-size standard_d4s_v5 \ 
    --max-pods=100 \ 
    --network-plugin azure \ 
    --network-plugin-mode overlay \ 
    --generate-ssh-keys

AKS 클러스터에 연결

Kubernetes 클러스터를 관리하려면 Kubernetes 명령줄 클라이언트인 kubectl을 사용합니다. Azure Cloud Shell을 사용하는 경우 Kubectl이 이미 설치되어 있습니다. kubectl을 로컬로 설치하려면 명령을 사용합니다 az aks install-cli .

  1. kubectl을 az aks get-credentials command를 사용하여 Kubernetes 클러스터에 연결하도록 구성합니다. 이 명령은 자격 증명을 다운로드하고 이를 사용하도록 Kubernetes CLI를 구성합니다.

    az aks get-credentials --resource-group "${AKS_AND_STORAGE_ACCOUNT_RG}" --name "${AKS_CLUSTER_NAME}"
    
  2. kubectl get nodes 명령을 사용하여 클러스터에 대한 연결을 확인합니다. 이 명령은 AKS 클러스터의 노드 목록을 반환합니다.

    kubectl get nodes
    

Azure 파일 공유 만들기

Azure Files 파일 공유를 Kubernetes 볼륨으로 사용하려면 Azure Storage 계정 및 파일 공유를 만들어야 합니다. 이 가이드에서는 메타데이터 캐싱을 지원하는 Azure 파일 공유 Premium SMB 를 사용합니다. 만드는 각 공유의 최소값은 100Gb 입니다.

  1. 명령을 사용하여 스토리지 계정을 만듭니다 az storage account create . 다음 명령은 Premium_LRS SKU를 사용하여 스토리지 계정을 만듭니다.

    az storage account create --name "${STORAGE_ACCOUNT_NAME}" --resource-group "${AKS_AND_STORAGE_ACCOUNT_RG}" \
        --location "${AKS_STORAGE_ACCOUNT_LOCATION}" \
        --sku Premium_LRS \
        --kind FileStorage
    
  2. 명령어 az storage account show-connection-string를 사용하여 파일 공유를 생성하는 데 사용할 환경 변수로 연결 문자열을 내보냅니다.

    export AZURE_STORAGE_CONNECTION_STRING=$(az storage account show-connection-string --name "${STORAGE_ACCOUNT_NAME}" --resource-group "${AKS_AND_STORAGE_ACCOUNT_RG}" --query connectionString -o tsv)
    
  3. 명령을 사용하여 100Gb Premium 파일 공유를 만듭니다 az storage share create . 이 예제에서는 메타데이터 캐싱을 공유 이름으로 사용합니다. 이 이름을 변경하는 경우 이 변경 내용이 arc-runners-set-pv.yaml 반영되도록 파일을 변경해야 합니다.

    az storage share create --name metadatacaching --quota 100 --connection-string "${AZURE_STORAGE_CONNECTION_STRING}"
    

ARC 런너 스케일 세트 컨트롤러 설치

다음 helm install 명령을 사용하여 ARC Runner 스케일 집합 컨트롤러를 설치합니다.

helm install "${ARC_CONTROLLER_NAME}" \ 
    --namespace "${NAMESPACE_ARC_CONTROLLER}" \ 
    --create-namespace \
    oci://ghcr.io/actions/actions-runner-controller-charts/gha-runner-scale-set-controller

Kubernetes 비밀 만들기

Azure 파일 공유 스토리지 키 비밀

Azure Files를 사용하려면 AKS Pod 컨테이너에서 Azure 파일 공유를 연결하는 데 사용되는 스토리지 키를 사용하여 AKS에 비밀을 만들어야 합니다.

  1. 명령을 사용하여 스토리지 계정 키를 환경 변수로 내보냅니다 az storage account keys list .

    STORAGE_KEY=$(az storage account keys list --resource-group ${AKS_AND_STORAGE_ACCOUNT_RG} --account-name ${STORAGE_ACCOUNT_NAME} --query "[0].value" -o tsv) 
    
  2. 명령 kubectl create namespace을 사용하여 ARC 자체 호스팅 실행기를 실행할 Kubernetes 네임스페이스를 만듭니다.

    kubectl create namespace "${NAMESPACE_ARC_RUNNERS}" 
    
  3. kubectl create secret generic 명령을 사용하여 Azure 파일 공유 스토리지 키를 저장하는 Kubernetes 비밀을 생성합니다.

    kubectl create secret generic azure-storage-secret \ 
       --namespace "${NAMESPACE_ARC_RUNNERS}" \ 
       --from-literal=azurestorageaccountname=${STORAGE_ACCOUNT_NAME} \ 
       --from-literal=azurestorageaccountkey=${STORAGE_KEY}
    

GitHub 앱 비밀

  1. "GitHub 앱 등록 가이드를 사용하여 자체 호스팅 실행기가 GitHub 조직 또는 리포지토리에 액세스할 수 있는 GitHub 앱을 만드세요." GitHub 만들기 프로세스는 다음 매개 변수를 제공합니다.

    • GITHUB_APP_ID: GitHub 앱의 ID입니다.
    • GITHUB_APP_INSTALLATION_ID: GitHub 앱의 설치 ID입니다.
    • github_app_private_key: GitHub 앱의 프라이빗 키입니다. -----BEGIN RSA PRIVATE KEY----- 섹션을 프라이빗 키로 바꿔야 합니다.
  2. 명령 kubectl create secret generic을(를) 사용하여 GitHub 앱 자격 증명을 저장하는 Kubernetes 시크릿을 만드세요. 자리 표시자를 GitHub 앱 만들기 프로세스에서 얻은 실제 값으로 바꿔야 합니다.

    GITHUB_APP_ID="app-id-placeholder"
    GITHUB_APP_INSTALLATION_ID="installation-id-placeholder"
    
    kubectl create secret generic ${ARC_RUNNER_GITHUB_SECRET_NAME} \ 
        --namespace=${NAMESPACE_ARC_RUNNERS} \
        --from-literal=github_app_id=${GITHUB_APP_ID} \
        --from-literal=github_app_installation_id=${GITHUB_APP_INSTALLATION_ID} \
        --from-literal=github_app_private_key=' <Private Key read here>'
    

Azure 파일 공유 구성

ARC Kubernetes 복제본 집합에서 만든 모든 Pod에 동일한 파일 공유를 탑재하는 데 사용하여 AccessMode: ReadWriteMany 동시에 여러 Pod에 Azure Files 파일 공유를 탑재할 수 있습니다. 다음과 같은 방법으로 Azure Files 파일 공유를 사용합니다.

  • .NET 샘플 애플리케이션에서 사용하는 NuGet 패키지를 캐시하기 위한 영구 SMB 파일 공유 입니다. arc-runners-set-pv-pvc.yaml 파일은 ARC 실행기 확장 집합 Pod에서 Azure Files 파일 공유를 탑재하는 데 필요한 PV 및 PVC를 만듭니다. 이 첫 번째 옵션에는 Azure File Premium을 사용하는 것이 좋습니다. 다음 예제와 같이 PV 및 PVC 매니페스트 모두에서 volumeAttributes와 네임스페이스 매개 변수를 맞춤 설정하세요.

    volumeAttributes: 
      resourceGroup: metadata-agroves  # Optional. Only set this when the storage account isn't in the same resource group as node. 
      shareName: metadatacaching
    nodeStageSecretRef:
      name: azure-storage-secret
      namespace: arc-runners
    
  • GitHub Runners 작업 폴더에 대한 임시 볼륨 입니다. 또한 Azure Files Standard() 및 Azure File Premium(github-azurefile)의 두 가지 스토리지 클래스를github-azurefile-premium 만듭니다. 이러한 클래스를 사용하면 요청 시 볼륨을 만들고 삭제할 수 있습니다. GitHub 작업이 실행되면 Kubernetes에 새로운 실행기 Pod가 만들어지고 새로운 Azure File 파일 공유가 만들어져 탑재됩니다. 볼륨은 작업이 실행되는 동안에만 존재합니다. 표준 클래스는 볼륨 크기를 허용하고 프리미엄은 최소 100Gb 볼륨을 허용합니다. 원하는 클래스를 선택할 수 있습니다. 프리미엄은 더 나은 성능을 제공한다는 것을 명심하세요. 파일을 사용자 지정할 수 있지만, 반드시 필요하지는 않습니다.

영구 볼륨과 영구 볼륨 클레임 생성하기

  1. kubectl apply 명령을 사용하여 영구 볼륨 및 영구 볼륨 클레임을 만듭니다.

    kubectl apply -f ./install/arc-runners-set-pv-pvc.yaml --namespace "${NAMESPACE_ARC_RUNNERS}" --wait 
    
  2. 명령을 사용하여 Azure Files에 대한 스토리지 클래스를 적용합니다 kubectl apply .

    kubectl apply -f ./install/arc-runners-storage-class-files.yaml --wait 
    

ARC 실행기 확장 집합 설치

다음 코드 조각은 실행기 집합 Helm 차트를 설치하기 전에 사용자 지정할 수 있는 설치 폴더의 arc-runners-set-values.yaml 파일에서 가져온 것입니다.

containerMode: 
  type: "kubernetes" # Type can be set to dind or kubernetes 
  ## The following is required when containerMode.type=kubernetes 
  kubernetesModeWorkVolumeClaim: 
    accessModes: ["ReadWriteMany"] 
    storageClassName: "github-azurefile-premium" # or "github-azurefile" for Standard_LRS 
    resources: 
      requests: 
        storage: 100Gi # 100Gi minimum to premium or any size when using Standard_LRS "github-azurefile" storage class 
template: 
  spec: 
  securityContext: 
    fsGroup: 123 # Group used by GitHub default agent image 
  containers: 
  - name: runner 
    image: ghcr.io/actions/actions-runner:latest 
    command: ["/home/runner/run.sh"] 
    env: 
      - name: ACTIONS_RUNNER_REQUIRE_JOB_CONTAINER 
        value: "false" 
      - name: ACTIONS_RUNNER_CONTAINER_HOOK_TEMPLATE 
        value: "/home/runner/container-config/container-podspec.yaml" 
    volumeMounts: 
      - name: "container-podspec-volume" 
        mountPath: "/home/runner/container-config" 
      - name: azurefile 
        mountPath: /home/runner/.nuget/              
  volumes: 
    - name: "container-podspec-volume" 
      configMap: 
        name: hook-extension 
    - name: azurefile 
      persistentVolumeClaim: 
        claimName: azurefile 

이 예제에서는 사용자 지정된 버전의 Kubernetes containerMode 를 사용하여 NuGet 패키지 및 임시 _work 폴더 볼륨에 Azure 파일 공유 볼륨 탑재를 포함합니다.

다음 매개 변수는 반드시 변경할 필요가 없습니다.

  • storageClassName: "github-azurefile-premium" 및 "github-azurefile" 중에서 선택합니다.
  • storage: 스토리지의 크기를 선택합니다. 프리미엄의 경우 최소 100Gb입니다.

다른 Helm 매개 변수는 helm install 명령에서 --set 옵션을 사용하여 설정됩니다.

파이프라인 내에서 컨테이너를 실행할 수 있는 GitHub 워크플로 컨테이너 기능과의 호환성을 위해 컨테이너 기능을 사용하여 워크플로를 실행할 때 ARC에서 만든 워크플로 Pod에 대한 Pod 사양을 탑재 container-podspec-volume 합니다. 이 Pod 사양은 설치 폴더의 arc-runners-set-container-pod-spec.yaml 파일에 만들어진 구성 맵에서 탑재됩니다. 변경할 필요가 없습니다.

kubectl apply -f ./install/arc-runners-set-container-pod-spec.yaml 

ARC 실행기 확장 집합 Helm 차트 매개 변수

ARC 실행기 확장 집합 Helm 차트는 몇 가지 매개 변수를 제공합니다. 다음 매개 변수는 AKS에 Azure 파일 공유 볼륨 탑재를 사용하여 확장 집합을 설치할 때 가장 중요한 매개 변수입니다.

  • githubConfigUrl: 사용자의 GitHub 조직 또는 리포지토리입니다.
  • githubConfigSecret: 자체 호스팅 러너에서 GitHub에 액세스하기 위한 GitHub 앱 비밀입니다.
  • minRunners: GitHub에서 새 작업을 기다리는 확장 집합의 최소 실행기 수입니다.
  • maxRunners: GitHub에서 작업을 실행하거나 새 작업을 기다리는 실행기의 최대 수입니다.
  • runnerGroup: ARC 실행기 집합에서 사용하는 GitHub 실행기 그룹입니다.

ARC 실행기 확장 집합 Helm 차트를 다운로드합니다.

AKS에 Helm 차트 설치

AKS에 ARC Runners 스케일 세트 Helm 차트를 설치하려면 helm install 명령을 사용하십시오.

helm install "${ARC_RUNNER_SCALESET_NAME}" \ 
    --namespace "${NAMESPACE_ARC_RUNNERS}" \ 
    --create-namespace \ 
    --values ./install/arc-runners-set-values.yaml \ 
    --set githubConfigUrl="${GITHUB_CONFIG_URL}" \ 
    --set githubConfigSecret="${ARC_RUNNER_GITHUB_SECRET_NAME}" \ 
    --set minRunners=1 \ 
    --set maxRunners=3 \ 
    --set runnerGroup=default \ 
    oci://ghcr.io/actions/actions-runner-controller-charts/gha-runner-scale-set

실행기 확장 집합 설치 업그레이드

ARC 실행기 확장 집합의 구성을 업그레이드하려면, 확장 집합을 설치할 때 사용했던 것과 동일한 매개 변수를 적용하여 helm upgrade --install 명령을 사용할 수 있습니다. 예를 들어 매개 변수를 minRunners에서 2로 변경 하려면 다음 명령을 실행할 수 있습니다.

helm upgrade --install "${ARC_RUNNER_SCALESET_NAME}" \
    --namespace "${NAMESPACE_ARC_RUNNERS}" \
    --create-namespace \
    --values ./install/arc-runners-set-values.yaml \
    --set githubConfigUrl="${GITHUB_CONFIG_URL}" \
    --set githubConfigSecret="${ARC_RUNNER_GITHUB_SECRET_NAME}" \
    --set minRunners=2 \
    --set maxRunners=3 \
    --set runnerGroup=default \
    oci://ghcr.io/actions/actions-runner-controller-charts/gha-runner-scale-set

다음 단계

기여자

Microsoft는 이 문서를 유지 관리합니다. 다음 기여자는 원래 그것을 썼다:

  • Jorge Arterio | 선임 클라우드 옹호자
  • Jeff Patterson | 주 제품 관리자
  • 레나 샤 | 선임 제품 관리자
  • 셰카르 싱 소로트 | Product Manager 2
  • Erin Schaffer | 콘텐츠 개발자 2