次の方法で共有


Azure Files を使用して Azure Kubernetes Service (AKS) に高可用性 GitHub Actions をデプロイするためのインフラストラクチャを作成する

この記事では、Azure Files と Helm を使用して AKS に高可用性 Actions Runner Controller (ARC) インフラストラクチャをデプロイするために必要なインフラストラクチャを作成します。

開始する前に

環境変数の設定

このガイド全体で使用する次の環境変数を設定します。

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-previewk8s-extensionamg 拡張機能は、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. az aks get-credentials commandを使用して Kubernetes クラスターに接続するように kubectl を構成します。 このコマンドは、資格情報をダウンロードし、それを使用するように 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 ストレージ アカウントとファイル共有を作成する必要があります。 このガイドでは、メタデータ キャッシュをサポートする Azure ファイル共有 Premium SMB を使用します。 作成する各共有の最小値は 100 Gb です

  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. az storage share create コマンドを使用して、100 Gb Premium ファイル共有を作成します。 この例では、共有名として metadatacaching を 使用します。 この名前を変更する場合は、この変更を反映するように arc-runners-set-pv.yaml ファイルも変更する必要があります。

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

ARC ランナー スケール セット コントローラーをインストールする

次の helm install コマンドを使用して、ARC ランナー スケール セット コントローラーをインストールします。

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 ポッド コンテナーから 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 秘密キー-----セクションを秘密キーに置き換える必要があります。
  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 ファイル共有の構成

AccessMode: ReadWriteManyを使用して複数のポッドに Azure Files ファイル共有を同時にマウントし、ARC Kubernetes レプリカ セットによって作成されたすべてのポッドに同じファイル共有をマウントできます。 Azure Files ファイル共有は、次の方法で使用します。

  • .NET サンプル アプリケーションで使用される NuGet パッケージをキャッシュする 永続的な SMB ファイル共有 として。 arc-runners-set-pv-pvc.yaml ファイルは、ARC ランナー スケール セット ポッドに 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 (github-azurefile) と Azure File Premium (github-azurefile-premium) の 2 つのストレージ クラスも作成します。 これらのクラスを使用すると、必要に応じてボリュームを作成および削除できます。 GitHub ジョブが実行されると、Kubernetes に新しいランナー ポッドが作成され、新しい Azure ファイルファイル共有が作成されてマウントされます。 ボリュームはジョブの実行中だけ存在します。 Standard クラスでは任意のボリューム サイズが許可され、Premium では 100 Gb 以上 のボリュームが許可されます。 任意のクラスを選択できます。 Premium ではパフォーマンスが向上します。 arc-runners-storage-class-files.yaml ファイルはカスタマイズできますが、必須ではありません。

永続ボリュームと永続ボリューム要求を作成する

  1. kubectl apply コマンドを使用して、永続ボリュームと永続ボリュームの要求を作成します。

    kubectl apply -f ./install/arc-runners-set-pv-pvc.yaml --namespace "${NAMESPACE_ARC_RUNNERS}" --wait 
    
  2. kubectl apply コマンドを使用して、Azure Files のストレージ クラスを適用します。

    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 を使用して、Azure File ファイル共有ボリュームのマウントを NuGet パッケージとエフェメラル _work フォルダー ボリュームに含めます。

次のパラメーターを変更する必要はありません。

  • storageClassName: "github-azurefile-premium" と "github-azurefile" のどちらかを選択します。
  • storage: ストレージのサイズを選択します。 Premium の場合は 100 Gb 以上。

その他の Helm パラメーターは、helm install オプションを使用して --set コマンドで設定されます。

パイプライン内でコンテナーを実行できる GitHub ワークフロー コンテナー機能との互換性を確保するため、コンテナー機能を使用してワークフローを実行するときに ARC によって作成されたワークフロー ポッドのポッド 仕様で container-podspec-volume をマウントします。 このポッド スペックは、インストール フォルダー内のファイル 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 グラフをインストールする

helm install コマンドを使用して、AKS に ARC ランナー スケール セット Helm チャートをインストールします。

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 パラメーターを 1 から 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 では、この記事を保持しています。 当初の寄稿者は次のとおりです。

  • ホルヘ・アルテオ |シニア クラウド アドボケイト
  • ジェフ・パターソン |プリンシパル プロダクト マネージャー
  • レナ・シャー |シニア プロダクト マネージャー
  • シェカール・シン・ソロット |プロダクト マネージャー 2
  • Erin Schaffer |コンテンツ開発者 2