다음을 통해 공유


Helm 옵션 매개 변수를 사용하여 설치 실패시 삭제 방지

기본 NF(네트워크 함수) 배포가 제대로 설치되지 않아 SNS(사이트 네트워크 서비스) 배포가 실패할 수 있습니다. AOSM(Azure Operator Service Manager)은 기본적으로 대상 Kubernetes 클러스터에서 실패한 배포를 제거하여 리소스를 유지합니다. Helm install 오류는 종종 오류를 디버깅할 수 있도록 리소스가 클러스터에 유지되어야 합니다. 이 How-To 문서에서는 NF ARM 템플릿을 편집하여 매개 변수를 false로 설정하여 이 동작을 재정의 helm install --atomic 하는 방법을 설명합니다.

필수 조건

  • Az CLI AOSM 확장을 사용하여 NF를 AOSM에 온보딩해야 합니다. 이 문서에서는 CLI의 폴더 구조 및 파일 출력을 참조하고 CLI 기반 예제를 제공합니다.
  • Helm 설치 실패는 복잡할 수 있습니다. 디버깅에는 NF에 대한 도메인 지식 외에도 여러 기술에 대한 기술 지식이 필요합니다.
  • AOSM 관리 아티팩트 저장소를 포함하는 리소스 그룹에 대한 역할 할당이 필요합니다 Contributor .
  • Visual Studio Code와 같은 적합한 IDE
  • ORAS CLI

중요합니다

AOSM을 사용하여 배포를 시도하기에 앞서 대상 Arc 연결 Kubernetes 환경에서 helm install Helm 패키지가 성공적으로 테스트되었는지 강력히 권장합니다.

단일 Helm 차트 NF에 대한 재정의 --atomic

이 섹션에서는 단일 Helm 차트로 구성된 NF에 대해 --atomic를 재정의하는 방법을 설명합니다.

NF Bicep 파일 찾기 및 편집

  1. 디렉터리로 이동하여 nsd-cli-output 디렉터리를 열고 artifacts 파일을 엽니다 <nf-arm-template>.bicep . <nf-arm-template> 는 Az AOSM CLI 확장 NSD 입력 파일에서 구성됩니다. 가상의 Contoso CNF(컨테이너화된 네트워크 함수)에 대한 다음 예제 템플릿과 비교하여 올바른 파일이 있는지 확인할 수 있습니다.

    @secure()
    param configObject object
    
    var resourceGroupId = resourceGroup().id
    
    var identityObject = (configObject.managedIdentityId == '')  ? {
      type: 'SystemAssigned'
    } : {
      type: 'UserAssigned'
      userAssignedIdentities: {
        '${configObject.managedIdentityId}': {}
      }
    }
    
    var nfdvSymbolicName = '${configObject.publisherName}/${configObject.nfdgName}/${configObject.nfdv}'
    
    resource nfdv 'Microsoft.Hybridnetwork/publishers/networkfunctiondefinitiongroups/networkfunctiondefinitionversions@2023-09-01' existing = {
      name: nfdvSymbolicName
      scope: resourceGroup(configObject.publisherResourceGroup)
    }
    
    resource nfResource 'Microsoft.HybridNetwork/networkFunctions@2023-09-01' = [for (values, i) in configObject.deployParameters: {
      name: '${configObject.nfdgName}${i}'
      location: configObject.location
      identity: identityObject
      properties: {
        networkFunctionDefinitionVersionResourceReference: {
          id: nfdv.id
          idType: 'Open'
        }
        nfviType: 'AzureArcKubernetes'
        nfviId: (configObject.customLocationId == '') ? resourceGroupId : configObject.customLocationId
        allowSoftwareUpdate: true
        configurationType: 'Open'
        deploymentValues: string(values)
      }
    }]
    
  2. 디렉터리 cnf-cli-output로 이동하여 nfDefinition 디렉터리를 연 후, nfdv 리소스의 networkFunctionApplications 배열에 있는 유일한 항목에서 값을 복사하여 네트워크 함수 애플리케이션 이름을 찾습니다. 다음 가상의 Contoso 예제 Bicep 코드 조각과 비교하여 올바른 값이 있는지 확인합니다. 이 경우 네트워크 함수 애플리케이션 이름은 .입니다 Contoso.

    resource nfdv 'Microsoft.Hybridnetwork/publishers/networkfunctiondefinitiongroups/networkfunctiondefinitionversions@2023-09-01' = {
      parent: nfdg
      name: nfDefinitionVersion
      location: location
      properties: {
        deployParameters: string(loadJsonContent('deployParameters.json'))
        networkFunctionType: 'ContainerizedNetworkFunction'
        networkFunctionTemplate: {
          nfviType: 'AzureArcKubernetes'
          networkFunctionApplications: [
            {
              artifactType: 'HelmPackage'
              name: 'Contoso'
    
  3. NF ARM 템플릿의 속성에 다음 구성을 추가하여 기본 helm 설치 --atomic 옵션을 재정의 nfResource 하도록 템플릿을 편집합니다.

    roleOverrideValues: ['{"name": "Contoso-one", "deployParametersMappingRuleProfile": {"applicationEnablement": "Enabled", "helmMappingRuleProfile": {"options": {"installOptions": {"atomic": "false"}},{"upgradeOptions": {"atomic": "false"}}}}}']
    
  4. Contoso 예제 NF의 다음 코드 조각과 비교하여 이 편집을 올바르게 수행했는지 확인합니다.

resource nfResource 'Microsoft.HybridNetwork/networkFunctions@2023-09-01' = [for (values, i) in configObject.deployParameters: {
  name: '${configObject.nfdgName}${i}'
  location: configObject.location
  identity: identityObject
  properties: {
    networkFunctionDefinitionVersionResourceReference: {
      id: nfdv.id
      idType: 'Open'
    }
    nfviType: 'AzureArcKubernetes'
    nfviId: (configObject.customLocationId == '') ? resourceGroupId : configObject.customLocationId
    allowSoftwareUpdate: true
    configurationType: 'Open'
    deploymentValues: string(values)
    roleOverrideValues: [
      '{"name":"Contoso-one","deployParametersMappingRuleProfile":{"helmMappingRuleProfile":{"options":{"installOptions":{"injectArtifactStoreDetails":"true", "atomic": "false"},"upgradeOptions":{"injectArtifactStoreDetails":"true","atomic": "false"}}}}}'
    ]}}]

편집된 ARM 템플릿을 빌드하고 아티팩트 저장소에 업로드합니다.

  1. 명령으로 nsd-cli-output/artifacts 만든 az aosm nsd build 디렉터리로 이동하고 CLI에서 생성된 Bicep 파일에서 네트워크 함수 ARM 템플릿을 빌드합니다.

    bicep build <nf-name>.bicep
    
  2. az aosm nsd publish 명령에서 만든 아티팩트 매니페스트에서 범위 맵 토큰 자격 증명을 생성합니다.

    중요합니다

    az aosm nsd publish 명령에서 만든 아티팩트 매니페스트를 사용해야 합니다. NF ARM 템플릿은 해당 매니페스트에서만 선언되므로 이 매니페스트에서 생성된 범위 맵 토큰만 NF ARM 템플릿을 아티팩트 저장소에 푸시 또는 풀(pull)할 수 있습니다.

    az rest --method POST --url 'https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<resource-group>/providers/Microsoft.HybridNetwork/publishers/<publisher>/artifactStores/<artifact-store>/artifactManifests/<artifactManifest>/listCredential?api-version=2023-09-01'
    
  3. AOSM 관리 ACR에 로그인합니다. AOSM 관리 ACR 이름은 Azure Portal 아티팩트 저장소 리소스 개요에서 찾을 수 있습니다. 사용자 이름과 암호는 이전 단계의 출력에서 찾을 수 있습니다.

    oras login <aosm-managed-acr-name>.azurecr.io --username <username> --password <scope map token>
    
  4. ORAS를 사용하여 AOSM 관리형 ACR(Azure Container Registry)에 네트워크 함수 ARM 템플릿을 업로드합니다. <arm-template-version> 아티팩트 태그는 1.0.0 형식이어야 합니다. <arm-template-name> 명령에서 만든 <arm-template-version> 아티팩트 매니페스트의 값과 az aosm nsd publish 일치해야 합니다.

다중 헬름 차트 NF에 대해 --atomic을(를) 오버라이드하세요.

많은 복잡한 NF는 여러 Helm 차트에서 빌드됩니다. 이러한 NF는 여러 네트워크 함수 애플리케이션이 있는 NFDV(네트워크 함수 정의 버전)로 표현되며 Helm 차트당 하나씩 여러 helm install 명령으로 설치됩니다.

다중 투구 NF에 대한 재정 --atomic 의 프로세스는 ARM 템플릿에 대한 편집을 제외하고 단일 helm NF의 경우와 동일합니다.

가상의 멀티 헬름 NF인 Contoso-multi-helm은 세 개의 헬름 차트로 구성됩니다. NFDV에는 세 개의 네트워크 함수 애플리케이션이 있습니다. 하나의 네트워크 함수 애플리케이션은 하나의 Helm 차트에 매핑됩니다. 이러한 네트워크 기능 애플리케이션에는 각각 이름 속성이 Contoso-one, Contoso-two, Contoso-three로 설정되어 있습니다. 다음은 이 네트워크 함수를 정의하는 NFDV의 예제 코드 조각입니다.

resource nfdv 'Microsoft.Hybridnetwork/publishers/networkfunctiondefinitiongroups/networkfunctiondefinitionversions@2023-09-01' = {
  parent: nfdg
  name: nfDefinitionVersion
  location: location
  properties: {
    deployParameters: string(loadJsonContent('deployParameters.json'))
    networkFunctionType: 'ContainerizedNetworkFunction'
    networkFunctionTemplate: {
      nfviType: 'AzureArcKubernetes'
      networkFunctionApplications: [
        {
          artifactType: 'HelmPackage'
          name: 'Contoso-one'
          ...
        },
        {
          artifactType: 'HelmPackage'
          name: 'Contoso-two'
          ...
        },
        {
          artifactType: 'HelmPackage'
          name: 'Contoso-three'
          ...
        }]
      }
    }
  }

--atomic 이러한 각 네트워크 함수 애플리케이션에 대해 매개 변수를 독립적으로 재정의할 수 있습니다. 다음은 --atomicfalse에 대해 Contoso-oneContoso-two로 재정의하고, atomic에 대해 Contoso-three을/를 true로 설정하는 NF Bicep 파일의 예제입니다.

resource nfResource 'Microsoft.HybridNetwork/networkFunctions@2023-09-01' = [for (values, i) in configObject.deployParameters: {
  name: '${configObject.nfdgName}${i}'
  location: configObject.location
  identity: identityObject
  properties: {
    networkFunctionDefinitionVersionResourceReference: {
      id: nfdv.id
      idType: 'Open'
    }
    nfviType: 'AzureArcKubernetes'
    nfviId: (configObject.customLocationId == '') ? resourceGroupId : configObject.customLocationId
    allowSoftwareUpdate: true
    configurationType: 'Open'
    deploymentValues: string(values)
    roleOverrideValues: [
      '{"name":"Contoso-one","deployParametersMappingRuleProfile":{"helmMappingRuleProfile":{"options":{"installOptions":{"injectArtifactStoreDetails":"true", "atomic": "false"},"upgradeOptions":{"injectArtifactStoreDetails":"true","atomic": "false"}}}}}'
      '{"name":"Contoso-two","deployParametersMappingRuleProfile":{"helmMappingRuleProfile":{"options":{"installOptions":{"injectArtifactStoreDetails":"true", "atomic": "false"},"upgradeOptions":{"injectArtifactStoreDetails":"true","atomic": "false"}}}}}'
      '{"name":"Contoso-three","deployParametersMappingRuleProfile":{"helmMappingRuleProfile":{"options":{"installOptions":{"injectArtifactStoreDetails":"true", "atomic": "false"},"upgradeOptions":{"injectArtifactStoreDetails":"true","atomic": "false"}}}}}'
    ]}}]

다음 단계

이제 SNS 배포를 다시 시도할 수 있습니다. ARM, Bicep 또는 AOSM REST API를 통해 배포를 다시 제출할 수 있습니다. Azure Portal SNS 개요를 통해 실패한 SNS를 삭제하고 운영자 빠른 시작 후 다시 배포하여 빠른 시작 NF 매개 변수를 네트워크 함수의 매개 변수로 바꿀 수도 있습니다. Kubernetes 클러스터에 배포된 Helm 릴리스는 실패할 때 제거되지 않습니다. SNS 배포 실패를 디버그하는 방법은 일반적인 Helm 설치 실패를 디버깅하기 위한 도구 키트를 설명합니다.