티스토리 뷰

<참조> https://azuredevopslabs.com/labs/vstsextend/kubernetes/

 

 

 

 

 

개요

Azure Kubernetes Service (AKS)는 Azure 상에서 쿠버네티스를 이용할 수 있는 가장 빠른 방법이다. AKS는 호스팅 된 Kubernetes 환경을 관리하므로 컨테이너 오케스트레이션 전문 지식 없이도 컨테이너화 된 애플리케이션을 빠르고 쉽게 배포하고 관리 할 수 ​​있다. 또한 애플리케이션을 오프라인으로 전환하지 않고도 필요에 따라 리소스를 프로비저닝, 업그레이드 및 확장하여 지속적인 운영 및 유지 관리의 부담을 제거한다. Azure DevOps는 연속 빌드 옵션을 사용하여 더 빠른 배포와 안정성을 위해 Docker 이미지를 만드는 데 도움이된다.

AKS를 사용하는 가장 큰 장점 중 하나는 클라우드에서 리소스를 만드는 대신 배포 및 서비스 매니페스트 파일을 통해 Azure Kubernetes 클러스터 내에 리소스와 인프라를 만들 수 있다는 것이다.

 

 

 

랩 시나리오

이 랩은 도커라이징한 ASP.NET Core 웹 애플리케이션인 MyHealthClinic (MHC)을 사용하며 Azure DevOps를 사용하여 AKS (Azure Kubernetes Service)에서 실행되는 Kubernetes 클러스터에 배포된다.

프론트의 로드 밸런서 그리고 백엔드에 Redis Cache와 같은 디플로이먼트와 서비스를 구동하기 위한 정의로 구성된 mhc-aks.yaml 매니페스트 파일이 있다. 이 MHC 애플리케이션은 로드 밸런서와 함께 mhc-front 파드에서 실행될 것이다.

다음 이미지는이 랩에서 설명하는 모든 단계를 안내한다.

 

Kubernetes를 처음 사용하는 경우 여기를 클릭하여이 실습에서 사용된 용어에 대한 설명을 확인한다.

 

 

 

이 실습에서 다루는 내용

다음의 작업들이 수행될 것이다.

  • Azure Container Registry (ACR), AKS 및 Azure SQL 서버 생성

  • Azure DevOps Demo Generator 툴을 이용하여 .NET Core 애플리케이션과 함께 Azure DevOps Team Project  프로비전

  • Azure DevOps의 Continuous Deployment (CD)를 이용하여 애플리케이션과 데이터베이스 배포 구성

  • 애플리케이션을 자동으로 배포하기 위한 빌드 초기화

추가 학습을 원한다면, Microsoft Learn에서 다중 컨테이너 Kubernetes 배포 자동화 모듈을 확인한다.

 

 

 

시작하기 전에 

1. 이 랩의 전제 조건을 알아 보려면 시작하기 페이지를 참조하십시오.

2. Azure DevOps 데모 생성기 링크를 클릭하고 시작하기 페이지의 지침에 따라 프로젝트를 Azure DevOps에 프로 비전한다.

이 랩에서는 위의 링크를 클릭 할 때 이미 선택된 Azure Kubernetes Service 템플릿이 사용된다. 이 실습에 필요한 몇 가지 추가 확장이 있으며 프로세스 중에 자동으로 설치할 수 있다.

 

 

 

환경 설정하기

이 랩에 대해 다음 Azure 리소스를 구성해야한다.

1. Azure Portal에서 Azure Cloud Shell을 시작하고 Bash를 선택합니다.

2. CLI를 사용하여 Kubernetes를 Azure에 배포한다.

i. 선호하는 지역에서 사용 가능한 최신 Kubernetes 버전을 bash 변수로 가져온다. <region> 을 선택한 지역으로 바꾼다.


version=$(az aks get-versions -l <region> --query 'orchestrators[-1].orchestratorVersion' -o tsv)
kim@Azure:~$ version=$(az aks get-versions -l koreacentral --query 'orchestrators[-1].orchestratorVersion' -o tsv)

 

ii. 리소스 그룹을 생성한다.


az aks create --resource-group akshandsonlab --name <unique-aks-cluster-name> --enable-addons monitoring --kubernetes-version $version --generate-ssh-keys --location <region>

kim@Azure:~$ az aks create --resource-group akshandsonlab --name zeroaksdemo --enable-addons monitoring --kubernetes-ver
sion $version --generate-ssh-keys --location koreacentral
AAD role propagation done[############################################]  100.0000%{
  "aadProfile": null,
  "addonProfiles": {
    "omsagent": {
      "config": {
        "logAnalyticsWorkspaceResourceID": "/subscriptions/1199b626-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourcegroups/defaultresourcegroup-se/providers/microsoft.operationalinsights/workspaces/defaultworkspace-1199b626-xxxx-xxxx-xxxx-xxxxxxxxxxxx-se"
      },
      "enabled": true,
      "identity": {
        "clientId": "97f2aded-9e28-4749-bfd7-0bf9db364125",
        "objectId": "a23cfd47-4436-45a1-9d7a-20c2aaf7ab00",
        "resourceId": "/subscriptions/1199b626-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourcegroups/MC_akshandsonlab_zeroaksdemo_koreacentral/providers/Microsoft.ManagedIdentity/userAssignedIdentities/omsagent-zeroaksdemo"
      }
    }
  },
  "agentPoolProfiles": [
    {
      "availabilityZones": null,
      "count": 3,
      "enableAutoScaling": null,
      "enableNodePublicIp": false,
      "maxCount": null,
      "maxPods": 110,
      "minCount": null,
      "mode": "System",
      "name": "nodepool1",
      "nodeImageVersion": "AKSUbuntu-1804containerd-2020.12.15",
      "nodeLabels": {},
      "nodeTaints": null,
      "orchestratorVersion": "1.19.3",
      "osDiskSizeGb": 128,
      "osDiskType": "Managed",
      "osType": "Linux",
      "powerState": {
        "code": "Running"
      },
      "provisioningState": "Succeeded",
      "proximityPlacementGroupId": null,
      "scaleSetEvictionPolicy": null,
      "scaleSetPriority": null,
      "spotMaxPrice": null,
      "tags": null,
      "type": "VirtualMachineScaleSets",
      "upgradeSettings": null,
      "vmSize": "Standard_DS2_v2",
      "vnetSubnetId": null
    }
  ],
  "apiServerAccessProfile": null,
  "autoScalerProfile": null,
  "diskEncryptionSetId": null,
  "dnsPrefix": "zeroaksdem-akshandsonlab-1199b6",
  "enablePodSecurityPolicy": null,
  "enableRbac": true,
  "fqdn": "zeroaksdem-akshandsonlab-1199b6-862e40e3.hcp.koreacentral.azmk8s.io",
  "id": "/subscriptions/1199b626-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourcegroups/akshandsonlab/providers/Microsoft.ContainerService/managedClusters/zeroaksdemo",
  "identity": {
    "principalId": "752cdd42-69fe-4ff8-984c-1072b221a038",
    "tenantId": "917bfe84-0ca6-488d-ad3a-236e41ceafe9",
    "type": "SystemAssigned",
    "userAssignedIdentities": null
  },
  "identityProfile": {
    "kubeletidentity": {
      "clientId": "74d4ac9e-0b76-4ee1-94a9-8c02fa75a79b",
      "objectId": "26f57a49-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
      "resourceId": "/subscriptions/1199b626-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourcegroups/MC_akshandsonlab_zeroaksdemo_koreacentral/providers/Microsoft.ManagedIdentity/userAssignedIdentities/zeroaksdemo-agentpool"
    }
  },
  "kubernetesVersion": "1.19.3",
  "linuxProfile": {
    "adminUsername": "azureuser",
    "ssh": {
      "publicKeys": [
        {
          "keyData": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC/8pbOnit5nUh6ZmFkQXhqvZONt+1qYx9pMh/m94ExupXEjuqdiHyyPPYkKd43yaJkmN/hnEHewDRIKL+Uy6UmZEGJ3dOytGb+Zz7m1xbwQay0i1xPjDajafVQtXLs/znqxBj2sClX+AFLbA8uaHVvrCLhhGYTgWhJgoo97yT8yE6jyfthrRz+RWbRpEoIOK6189IGVOealw5a+q6Iyd9bFNW4hyhdYpMjJtL6d7J1893UZzCn43oKgqGHtxJX5ajK0CjNHZfwju6bsm4ppN2498lgA/dsLvucItgJB1L+se5xFiWtGt3B4YlDykvh0FRrI3IqSZuoGXHF4GymJVJv kim@cc-d00cc3e-8494c9747-q65mb\n"
        }
      ]
    }
  },
  "location": "koreacentral",
  "maxAgentPools": 10,
  "name": "zeroaksdemo",
  "networkProfile": {
    "dnsServiceIp": "10.0.0.10",
    "dockerBridgeCidr": "172.17.0.1/16",
    "loadBalancerProfile": {
      "allocatedOutboundPorts": null,
      "effectiveOutboundIps": [
        {
          "id": "/subscriptions/1199b626-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/MC_akshandsonlab_zeroaksdemo_koreacentral/providers/Microsoft.Network/publicIPAddresses/e42c986e-6a79-4c51-bb5d-0f035654edff",
          "resourceGroup": "MC_akshandsonlab_zeroaksdemo_koreacentral"
        }
      ],
      "idleTimeoutInMinutes": null,
      "managedOutboundIps": {
        "count": 1
      },
      "outboundIpPrefixes": null,
      "outboundIps": null
    },
    "loadBalancerSku": "Standard",
    "networkMode": null,
    "networkPlugin": "kubenet",
    "networkPolicy": null,
    "outboundType": "loadBalancer",
    "podCidr": "10.244.0.0/16",
    "serviceCidr": "10.0.0.0/16"
  },
  "nodeResourceGroup": "MC_akshandsonlab_zeroaksdemo_koreacentral",
  "powerState": {
    "code": "Running"
  },
  "privateFqdn": null,
  "provisioningState": "Succeeded",
  "resourceGroup": "akshandsonlab",
  "servicePrincipalProfile": {
    "clientId": "msi",
    "secret": null
  },
  "sku": {
    "name": "Basic",
    "tier": "Free"
  },
  "tags": null,
  "type": "Microsoft.ContainerService/ManagedClusters",
  "windowsProfile": null
}

 

중요: 고유한 AKS 클러스터 이름을 입력한다. AKS 이름은 3자에서 31자 사이여야 한다. 이름에는 문자, 숫자 및 하이픈만 포함될 수 있다. 이름은 문자로 시작해야 하며 문자 또는 숫자로 끝나야 한다. AKS를 배포하는 데 10-15분이 걸릴 수 있다.

 

3. Azure Container Registry (ACR) 배포 : 아래 명령을 실행하여 ACR (Azure Container Registry)을 사용하여 고유한 개인 컨테이너 레지스트리를 만든다.


az acr create --resource-group akshandsonlab --name <unique-acr-name> --sku Standard --location <region>
kim@Azure:~$ az acr create --resource-group akshandsonlab --name zeroacrdemo --sku Standard --location koreacentral
{- Finished ..
  "adminUserEnabled": false,
  "creationDate": "2021-01-01T01:10:09.805419+00:00",
  "dataEndpointEnabled": false,
  "dataEndpointHostNames": [],
  "encryption": {
    "keyVaultProperties": null,
    "status": "disabled"
  },
  "id": "/subscriptions/1199b626-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/akshandsonlab/providers/Microsoft.ContainerRegistry/registries/zeroacrdemo",
  "identity": null,
  "location": "koreacentral",
  "loginServer": "zeroacrdemo.azurecr.io",
  "name": "zeroacrdemo",
  "networkRuleSet": null,
  "policies": {
    "quarantinePolicy": {
      "status": "disabled"
    },
    "retentionPolicy": {
      "days": 7,
      "lastUpdatedTime": "2021-01-01T01:10:13.239941+00:00",
      "status": "disabled"
    },
    "trustPolicy": {
      "status": "disabled",
      "type": "Notary"
    }
  },
  "privateEndpointConnections": [],
  "provisioningState": "Succeeded",
  "publicNetworkAccess": "Enabled",
  "resourceGroup": "akshandsonlab",
  "sku": {
    "name": "Standard",
    "tier": "Standard"
  },
  "status": null,
  "storageAccount": null,
  "systemData": {
    "createdAt": "2021-01-01T01:10:09.8054195+00:00",
    "createdBy": "zerobig.kim@gmail.com",
    "createdByType": "User",
    "lastModifiedAt": "2021-01-01T01:10:09.8054195+00:00",
    "lastModifiedBy": "zerobig.kim@gmail.com",
    "lastModifiedByType": "User"
  },
  "tags": {},
  "type": "Microsoft.ContainerRegistry/registries"
}

 

중요 : 고유한 ACR 이름을 입력한다. ACR 이름은 영숫자만 포함 할 수 있으며 5자에서 50자 사이여야 한다.

 

4. AKS 생성 관리 ID 액세스 권한 부여: AKS 클러스터가 AKS 생성 관리 ID를 사용하여 AKS 컨테이너 레지스트리에 연결할 수 있도록 허가한다. 변수 $AKS_RESOURCE_GROUP, $AKS_CLUSTER_NAME, $ACR_RESOURCE_GROUP를 각자 상황에 맞는 적절한 값으로 바꾸고 명령을 실행한다.


# Get the id of the Managed Identity configured for AKS CLIENT_ID=$(az aks show --resource-group $AKS_RESOURCE_GROUP --name $AKS_CLUSTER_NAME --query "identityProfile.kubeletidentity.clientId" --output tsv) # Get the ACR registry resource id ACR_ID=$(az acr show --name $ACR_NAME --resource-group $ACR_RESOURCE_GROUP --query "id" --output tsv) # Create role assignment az role assignment create --assignee $CLIENT_ID --role acrpull --scope $ACR_ID
kim@Azure:~$ CLIENT_ID=$(az aks show --resource-group akshandsonlab --name zeroaksdemo --query "identityProfile.kubeletidentity.clientId" --output tsv)
kim@Azure:~$ ACR_ID=$(az acr show --name zeroacrdemo --resource-group akshandsonlab --query "id" --output tsv)
kim@Azure:~$ az role assignment create --assignee $CLIENT_ID --role acrpull --scope $ACR_ID
{
  "canDelegate": null,
  "condition": null,
  "conditionVersion": null,
  "description": null,
  "id": "/subscriptions/1199b626-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/akshandsonlab/providers/Microsoft.ContainerRegistry/registries/zeroacrdemo/providers/Microsoft.Authorization/roleAssignments/f6f1081b-590d-4d0f-ae09-51310c501711",
  "name": "f6f1081b-590d-4d0f-ae09-51310c501711",
  "principalId": "26f57a49-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "principalType": "ServicePrincipal",
  "resourceGroup": "akshandsonlab",
  "roleDefinitionId": "/subscriptions/1199b626-xxxx-xxxx-xxxx-xxxxxxxxxxxx/providers/Microsoft.Authorization/roleDefinitions/7f951dda-4ed3-4680-a7ca-43fe172d538d",
  "scope": "/subscriptions/1199b626-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/akshandsonlab/providers/Microsoft.ContainerRegistry/registries/zeroacrdemo",
  "type": "Microsoft.Authorization/roleAssignments"
}

 

자세한 내용은 Azure Kubernetes Service에서 Azure Container Registry를 사용하여 인증하는 방법에 대한 문서를 참조한다.

 

 

5. Azure SQL 서버 및 데이터베이스 만들기 : Azure SQL 서버를 만든다.


# Create an Azure SQL Server
az sql server create -l <region> -g akshandsonlab -n <unique-sqlserver-name> -u sqladmin -p P2ssw0rd1234
# Create a database
az sql db create -g akshandsonlab -s <unique-sqlserver-name> -n mhcdb --service-objective S0
kim@Azure:~$ az sql server create -l koreacentral -g akshandsonlab -n zerosqldemo -u sqladmin -p P2ssw0rd1234
{- Finished ..
  "administratorLogin": "sqladmin",
  "administratorLoginPassword": null,
  "fullyQualifiedDomainName": "zerosqldemo.database.windows.net",
  "id": "/subscriptions/1199b626-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/akshandsonlab/providers/Microsoft.Sql/servers/zerosqldemo",
  "identity": null,
  "kind": "v12.0",
  "location": "koreacentral",
  "minimalTlsVersion": null,
  "name": "zerosqldemo",
  "privateEndpointConnections": [],
  "publicNetworkAccess": "Enabled",
  "resourceGroup": "akshandsonlab",
  "state": "Ready",
  "tags": null,
  "type": "Microsoft.Sql/servers",
  "version": "12.0"
}
kim@Azure:~$ az sql db create -g akshandsonlab -s zerosqldemo -n mhcdb --service-objective S0
{- Finished ..
  "autoPauseDelay": null,
  "backupStorageRedundancy": "Geo",
  "catalogCollation": "SQL_Latin1_General_CP1_CI_AS",
  "collation": "SQL_Latin1_General_CP1_CI_AS",
  "createMode": null,
  "creationDate": "2021-01-01T01:20:20.100000+00:00",
  "currentServiceObjectiveName": "S0",
  "currentSku": {
    "capacity": 10,
    "family": null,
    "name": "Standard",
    "size": null,
    "tier": "Standard"
  },
  "databaseId": "4da20696-aa20-4d6b-947e-630700d468a5",
  "defaultSecondaryLocation": "koreasouth",
  "earliestRestoreDate": "2021-01-01T01:50:20.100000+00:00",
  "edition": "Standard",
  "elasticPoolId": null,
  "elasticPoolName": null,
  "failoverGroupId": null,
  "id": "/subscriptions/1199b626-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/akshandsonlab/providers/Microsoft.Sql/servers/zerosqldemo/databases/mhcdb",
  "kind": "v12.0,user",
  "licenseType": null,
  "location": "koreacentral",
  "longTermRetentionBackupResourceId": null,
  "managedBy": null,
  "maxLogSizeBytes": null,
  "maxSizeBytes": 268435456000,
  "minCapacity": null,
  "name": "mhcdb",
  "pausedDate": null,
  "readReplicaCount": 0,
  "readScale": "Disabled",
  "recoverableDatabaseId": null,
  "recoveryServicesRecoveryPointId": null,
  "requestedServiceObjectiveName": "S0",
  "resourceGroup": "akshandsonlab",
  "restorableDroppedDatabaseId": null,
  "restorePointInTime": null,
  "resumedDate": null,
  "sampleName": null,
  "sku": {
    "capacity": 10,
    "family": null,
    "name": "Standard",
    "size": null,
    "tier": "Standard"
  },
  "sourceDatabaseDeletionDate": null,
  "sourceDatabaseId": null,
  "status": "Online",
  "tags": null,
  "type": "Microsoft.Sql/servers/databases",
  "zoneRedundant": false
}

 

중요 : 고유 한 SQL 서버 이름을 입력한다. Azure SQL Server 이름은 UPPER / Camel 대소문자 명명 규칙을 지원하지 않으므로 SQL Server 이름 필드 값에 소문자를 사용한다.

 

6. 다음 구성 요소-Container Registry, Kubernetes Service, SQL Server와 SQL Database가 배포된다. 이러한 각 구성 요소에 개별적으로 액세스하고 실습 1에서 사용할 세부 정보를 기록해둔다.

 

 

 

7. mhcdb SQL 데이터베이스를 선택하고 Server name을 기록해둔다.

 

 

8. Set server Firewall을 클릭하고 Allow Azure services …옵션을 활성화 한다.

 

 

9. 리소스 그룹으로 이동하여 생성된 컨테이너 레지스트리를 선택하고 Login server 이름을 기록해 둔다.

 

 

이제 이 실습을 수행하는 데 필요한 모든 azure 구성 요소가 준비되었다.

 

 

실습 1 : 빌드 및 릴리스 파이프 라인 구성

 

Azure DevOps 데모 생성기를 통해 Azure DevOps 조직에서 AKS 프로젝트를 만들 었는지 확인한다 (사전 요구 사항에서 언급). AKS 및 Azure Container Registry와 같은 Azure 리소스를 빌드 및 릴리스 정의에 수동으로 매핑한다.

1. Pipelines –> Pipelines으로 이돟한다.

 

 

2. MyHealth.AKS.Build 파이프 라인을 선택하고 Edit을 클릭한다.

 

 

3. Run services 섹션에서, Azure subscription을 선택하고 Authorize를 클릭한다.

 

Azure 자격 증명으로 이 연결을 승인하라는 메시지가 표시된다. 확인 버튼을 클릭 한 후 빈 화면이 나타나면 브라우저에서 팝업 차단기를 비활성화하고 단계를 다시 시도한다.

이렇게하면 SPA(Service Principal Authentication)를 사용하여 Microsoft Azure 구독에 대한 연결을 정의하고 보호하는 Azure Resource Manager Service Endpoint이 생성된다. 이 엔드포인트는 Azure DevOps와 Azure를 연결하는 데 사용된다.

 

팁 : 구독이 나열되지 않거나 기존 서비스 주체를 지정하려면 서비스 주체 생성 지침을 따른다.

 

 

4. 성공적인 인증 후 드롭 다운 (그림과 같이 Azure subscriptionAzure Container Registry)에서 적절한 값을 선택한다.

Build services, Push services 및 Lock services 태스크에 대해 이 작업을 반복한다.

 

 

applicationsettings.json 파일에는이 실습의 시작 부분에서 만든 Azure 데이터베이스에 연결하는 데 사용되는 데이터베이스 연결 문자열의 세부 정보가 포함되어 있다.

mhc-aks.yaml 매니페스트 파일에는 Azure Kubernetes Service에 배포 될 deployments, services 및 pods의 구성 세부 정보가 포함되어 있다. 매니페스트 파일은 다음과 같다.

 

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mhc-back
  labels:
    app: mhc-back
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mhc-back
  template:
    metadata:
      labels:
        app: mhc-back
    spec:
      containers:
      - name: mhc-back
        image: redis
        ports:
        - containerPort: 6379
          name: redis
---
apiVersion: v1
kind: Service
metadata:
  name: mhc-back
spec:
  type: ClusterIP
  ports:
  - port: 6379
  selector:
    app: mhc-back
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mhc-front
spec:
  replicas: 1
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 1
  minReadySeconds: 5 
  selector:
    matchLabels:
      app: mhc-front
  template:
    metadata:
      labels:
        app: mhc-front
    spec:
      containers:
      - name: mhc-front
        image: __ACR__/myhealth.web:latest
        imagePullPolicy: Always
        ports:
        - containerPort: 80
        resources:
          requests:
            cpu: 250m
          limits:
            cpu: 500m
        env:
        - name: REDIS
          value: "mhc-back"
---
apiVersion: v1
kind: Service
metadata:
  name: mhc-front
spec:
  type: LoadBalancer
  ports:
  - port: 80
  selector:
    app: mhc-front

 

배포 매니페스트에 대한 자세한 내용은 AKS 배포 및 YAML 매니페스트를 참조한다.

 

 

5. Variables 탭을 클릭하여 환경을 구성하는 동안 앞서 언급 한 세부 정보로 Pipeline Variables에 대한 ACRSQLserver 값을 업데이트한다.

 

 

6. 변경사항을 Save 한다.

 

(혹시 이 시점에서 Save가 활성화 되지 않는 경우 다음과 같이 Agent job을 실행할 Agent를 선택한다.)

 

 

 

7. Pipelines | Releases 이동한다. MyHealth.AKS.Release 파이프 라인을 선택하고 Edit을 클릭한다.

 

 

8. Dev 스테이지를 선택하고 View stage tasks를 클릭하여 파이프 라인 작업을 확인한다.

 

 

9. Dev  환경의 DB deployment 단계에서 Azure Service Connection Type의 드롭 다운에서 Azure Resource Manager를 선택하고 Execute Azure SQL: DacpacTask 태스크의 드롭 다운에서 Azure Subscription 값을 업데이트 한다.

 

 

10. AKS deployment 단계에서 Create Deployments & Services in AKS 태스크를 선택한다.

드롭 다운에서 Azure Subscription, Resource GroupKubernetes cluster를 업데이트한다. Secrets 섹션을 확장하고 드롭 다운에서 Azure SubscriptionAzure container registry에 대한 매개 변수를 업데이트하다. 

AKS 태스크에서 이미지 업데이트에 대해 유사한 단계를 반복한다.

 

  • Create Deployments & Services in AKSmhc-aks.yaml 파일에 지정된 구성에 따라 AKS에서 배포 및 서비스를 만듭니다. Pod는 처음으로 최신 도커 이미지를 가져온다.
  • Update image in AKS는 지정된 리포지토리에서 BuildID에 해당하는 적절한 이미지를 가져 와서 AKS에서 실행되는 mhc-front pod에 docker 이미지를 배포한다.
  • mysecretkey라는 secret은 백그라운드에서 kubectl create secret 명령을 사용하여 Azure DevOps를 통해 AKS 클러스터에 생성된다. 이 비밀은 Azure Container Registry에서 myhealth.web 이미지를 가져 오는 동안 권한 부여에 사용된다.

 

 

11. 릴리스 정의에서 Variables 섹션을 선택하고 환경을 구성하는 동안 앞서 언급 한 세부 정보로 파이프 라인 변수에 대한 ACRSQLserver 값을 업데이트한다. Save 버튼을 선택한다.

 

참고: Database Namemhcdb로 설정되고 Server Admin Loginsqladmin이고 PasswordP2ssw0rd1234이다. Azure SQL 서버를 만드는 동안 다른 세부 정보를 입력 한 경우 그에 따라 값을 업데이트한다.

 

 

 

실습 2 : 애플리케이션 빌드 및 배포 트리거

 

이 예제에서는 수동으로 빌드가 이루어지게 하여 완료되면 애플리케이션의 자동 배포가 트리거 될 것이다. 애플리케이션은 프런트 엔드에 로드 밸런서를, 백엔드에 Redis 캐시를 pod에 배포하도록 설계되었다.

 

1. MyHealth.AKS.build 파이프 라인을 선택합니다. Run pipeline을 클릭한다.

 

 

2. 빌드 프로세스가 시작되면 빌드 작업을 선택하여 진행중인 빌드를 확인한다.

 

 

 

3. 빌드는 도커 이미지를 생성하고 ACR에 푸시합니다. 빌드가 완료되면 빌드 요약이 표시된다. 생성 된 이미지를 보려면 Azure Portal로 이동하고 Azure Container Registry를 선택하고 Repositories로 이동한다.

 

 

4. Azure DevOps 포털로 다시 전환한다. Pipeline 섹션에서 Release 탭을 선택하고 최신 Release를 두 번 클릭한다. 실시간 로그 및 릴리스 요약을 보려면  In progress 링크를 선택한다.

 

 

 

5. 릴리스가 완료되면 Azure Cloud Shell을 시작하고 아래 명령을 실행하여 AKS에서 실행중인 pod를 확인한다.

a. 명령 프롬프트에 az aks get-credentials --resource-group yourResourceGroup --name yourAKSname을 입력하여 Kubernetes 클러스터에 대한 액세스 자격 증명을 가져온다. yourResourceGroup 및 yourAKSname 변수를 실제 값으로 바꾼다.


az aks get-credentials --resource-group yourResourceGroup --name yourAKSname
kim@Azure:~$ az aks get-credentials --resource-group akshandsonlab --name zeroaksdemo
Merged "zeroaksdemo" as current context in /home/kim/.kube/config

 

b. kubectl get pods


kubectl get pods
kim@Azure:~$ kubectl get pods
NAME                         READY   STATUS    RESTARTS   AGE
mhc-back-6fb48fb97b-snqq8    1/1     Running   0          2m13s
mhc-front-686d89c778-w4kgt   1/1     Running   0          2m10s

 

배포된 웹 애플리케이션이 표시된 pod에서 실행 중이다.

 

 

6. 애플리케이션에 액세스하려면 아래 명령을 실행한다. External-IP가 pending이라고 표시되면 IP가 할당 될 때까지 잠시 기다린다.


kubectl get service mhc-front --watch
kim@Azure:~$ kubectl get service mhc-front --watch
NAME        TYPE           CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
mhc-front   LoadBalancer   10.0.241.121   20.194.8.95   80:30984/TCP   2m34s

 

 

7. External-IP를 복사하여 브라우저에 붙여넣고 Enter 버튼을 눌러 애플리케이션을 시작한다.

 

 

Azure Portal의 Kubernetes 리소스보기

Azure 포털에는 AKS(Azure Kubernetes Service) 클러스터의 Kubernetes 리소스에 쉽게 액세스할 수 있는 Kubernetes 리소스 뷰어(미리보기)가 포함되어 있다. Azure 포털에서 Kubernetes 리소스를 볼 수 있어 Azure 포털과 kubectl 명령줄 도구 간의 컨텍스트 전환을 줄여 Kubernetes 리소스를 보고 편집할 수 있다. 현재 리소스 뷰어에는 deployment, pod 및 replica sets와 같은 여러 리소스 유형이 포함되어 있다.

Azure Portal의 Kubernetes 리소스보기는 더 이상 사용되지 않도록 설정된 AKS 대시 보드 추가 기능을 대체한다.

 

자세한 내용은 https://docs.microsoft.com/en-us/azure/aks/kubernetes-portal에서 찾을 수 있다.

 

 

 

요약

AKS(Azure Kubernetes Service)는 책임의 대부분을 Azure에 오프로드하여 Kubernetes 클러스터 관리의 복잡성과 운영 오버헤드를 줄여준다. AKS(Azure DevOps 및 Azure Container Services)를 사용하면 Azure DevOps Hosted Agent에서 사용하도록 설정된 도커 기능을 활용하여 도커화된 애플리케이션을 위한 DevOps를 구축할 수 있다.

 

 

 

참고

이 랩에서 설명하는 모든 단계를 안내하는 비디오는 여기에서 시청할 수 있다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함