연습 - Azure Kubernetes Service 클러스터에 애플리케이션 배포
이 연습에서는 회사의 웹 사이트를 AKS(Azure Kubernetes Service)에 테스트 앱으로 배포합니다. 웹 사이트는 HTML, CSS 및 JavaScript의 기본 기술 스택을 사용하는 정적 웹 사이트입니다. 여기서는 다른 서비스에 비해 수신하는 요청의 수가 적으며 배포 옵션을 안전하게 테스트하는 방법을 제공합니다.
참고
소스 코드를 추가로 알아보려는 경우 이 GitHub 리포지토리에서 웹앱용 코드를 사용할 수 있습니다. 또한 이 샘플 앱은 Linux 노드 풀에만 배포됩니다.
중요
이 연습을 수행하려면 사용자의 Azure 구독이 필요하며 요금이 발생할 수 있습니다. Azure 구독이 아직 없는 경우 시작하기 전에 체험 계정을 만듭니다.
배포 매니페스트 만들기
애플리케이션을 배포하는 배포 매니페스트 파일을 만듭니다. 매니페스트 파일을 사용하면 배포하려는 리소스의 유형 및 워크로드와 관련된 모든 세부 정보를 정의할 수 있습니다.
Kubernetes는 인텔리전스가 없는 Pod라는 논리 구조로 컨테이너를 그룹화합니다. 배포는 누락된 인텔리전스를 추가하여 애플리케이션을 만듭니다. 배포 파일을 만들어 보겠습니다.
Azure Cloud Shell에 로그인합니다.
Cloud Shell에서 통합 편집기를 사용하여
deployment.yaml
이라는 Kubernetes 배포용 매니페스트 파일을 만듭니다.touch deployment.yaml
code .
을 입력하여 Cloud Shell에서 통합 편집기를 엽니다.deployment.yaml
파일을 열고 다음과 같은 YAML 코드 섹션을 추가합니다.# deployment.yaml apiVersion: apps/v1 # The API resource where this workload resides kind: Deployment # The kind of workload we're creating metadata: name: contoso-website # This will be the name of the deployment
해당 코드에서는 만들고 있는 매니페스트의
apiVersion
및kind
를 Kubernetes에 지시하는 처음 두 개의 키를 추가했습니다.name
은 배포 이름입니다.kubectl
을 사용할 때 배포 정보를 식별하고 쿼리하는 데 사용합니다.팁
apiVersion
에 관한 자세한 내용과 이 키에 포함할 값은 공식 Kubernetes 설명서를 참조하세요. 이 모듈의 끝에 있는 링크를 찾으세요.배포는 pod를 래핑합니다. 템플릿 정의를 활용하여 매니페스트 파일 내에서 pod 정보를 정의합니다. 템플릿은 매니페스트 파일에서 배포 사양 섹션 아래에 배치됩니다.
다음 YAML과 일치하도록
deployment.yaml
파일을 업데이트합니다.# deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: contoso-website spec: template: # This is the template of the pod inside the deployment metadata: # Metadata for the pod labels: app: contoso-website
Pod는 배포와 동일한 이름을 사용하지 않습니다. Pod 이름은 배포 이름과 끝에 추가된 임의의 ID를 혼합한 것입니다.
labels
키를 사용합니다. 배포에서 pod를 찾고 그룹화할 수 있도록labels
키를 추가합니다.pod는 하나 이상의 컨테이너를 래핑합니다. 모든 pod에는 해당 pod 내의 컨테이너를 정의할 수 있는 사양 섹션이 있습니다.
다음 YAML과 일치하도록
deployment.yaml
파일을 업데이트합니다.# deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: contoso-website spec: template: # This is the template of the pod inside the deployment metadata: labels: app: contoso-website spec: containers: # Here we define all containers - name: contoso-website
Pod에 하나 이상의 컨테이너가 있을 수 있으므로
containers
키는 컨테이너 사양의 배열입니다. 사양은image
,name
,resources
,ports
및 컨테이너에 대한 다른 중요한 정보를 정의합니다.실행 중인 모든 pod는
contoso-website-<UUID>
라는 이름을 따릅니다. 여기서 UUID는 모든 리소스를 고유하게 식별하는 생성된 ID입니다.앱이 클러스터에서 사용할 수 있는 리소스의 최소량과 최대량을 정의하는 것이 좋습니다.
resources
키를 사용하여 해당 정보를 지정합니다.다음 YAML과 일치하도록
deployment.yaml
파일을 업데이트합니다.# deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: contoso-website spec: template: # This is the template of the pod inside the deployment metadata: labels: app: contoso-website spec: containers: - image: mcr.microsoft.com/mslearn/samples/contoso-website name: contoso-website resources: requests: # Minimum amount of resources requested cpu: 100m memory: 128Mi limits: # Maximum amount of resources requested cpu: 250m memory: 256Mi
리소스 섹션을 사용하여 최소 리소스 양을 요청으로 지정하고 최대 리소스 양을 한도로 지정하는 방법을 확인하세요.
마지막 단계는 이 컨테이너가
ports
키를 통해 외부적으로 노출하는 포트를 정의하는 것입니다.ports
키는 개체의 배열입니다. 즉, pod의 컨테이너는 여러 이름이 있는 여러 포트를 노출할 수 있습니다.다음 YAML과 일치하도록
deployment.yaml
파일을 업데이트합니다.# deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: contoso-website spec: template: # This is the template of the pod inside the deployment metadata: labels: app: contoso-website spec: nodeSelector: kubernetes.io/os: linux containers: - image: mcr.microsoft.com/mslearn/samples/contoso-website name: contoso-website resources: requests: cpu: 100m memory: 128Mi limits: cpu: 250m memory: 256Mi ports: - containerPort: 80 # This container exposes port 80 name: http # We named that port "http" so we can refer to it later
name
키를 사용하여 포트의 이름을 지정하는 방법을 확인하세요. 포트 이름을 지정하면 해당 포트를 참조하는 파일을 변경하지 않고도 공개된 포트를 변경할 수 있습니다.마지막으로, 배포가 관리할 워크로드를 정의하는 선택기 섹션을 추가합니다.
selector
키는 매니페스트 파일의 배포 사양 섹션 내에 배치됩니다.matchLabels
키를 사용하여 배포에서 관리되는 모든 pod의 레이블을 나열합니다.다음 YAML과 일치하도록
deployment.yaml
파일을 업데이트합니다.# deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: contoso-website spec: selector: # Define the wrapping strategy matchLabels: # Match all pods with the defined labels app: contoso-website # Labels follow the `name: value` template template: # This is the template of the pod inside the deployment metadata: labels: app: contoso-website spec: nodeSelector: kubernetes.io/os: linux containers: - image: mcr.microsoft.com/mslearn/samples/contoso-website name: contoso-website resources: requests: cpu: 100m memory: 128Mi limits: cpu: 250m memory: 256Mi ports: - containerPort: 80 name: http
참고
여러 노드 풀(Linux 및 Windows)이 있는 AKS 클러스터에서 이전에 나열된 배포 매니페스트 파일은 Linux 컨테이너를 실행할 수 있는 노드에서 샘플 애플리케이션의 Pod를 실행하도록 AKS 클러스터에 지시하는
nodeSelector
도 정의합니다.Linux 노드는 Windows 컨테이너를 실행할 수 없으면 그 반대의 경우도 마찬가지입니다.
매니페스트 파일을 저장하고 편집기를 닫습니다.
매니페스트 적용
Cloud Shell에서
kubectl apply
명령을 실행하여 배포 매니페스트를 클러스터에 제출합니다.kubectl apply -f ./deployment.yaml
이 명령은 다음 예제와 유사한 결과를 출력합니다.
deployment.apps/contoso-website created
kubectl get deploy
명령을 실행하여 배포에 성공했는지 여부를 확인합니다.kubectl get deploy contoso-website
이 명령은 다음 예제와 유사한 테이블을 출력합니다.
NAME READY UP-TO-DATE AVAILABLE AGE contoso-website 0/1 1 0 16s
kubectl get pods
명령을 실행하여 pod가 실행 중인지 여부를 확인합니다.kubectl get pods
이 명령은 다음 예제와 유사한 테이블을 출력합니다.
NAME READY STATUS RESTARTS AGE contoso-website-7c58c5f699-r79mv 1/1 Running 0 63s