이 튜토리얼에서는 여러 Windows Server 버전을 대상으로 하는 이미지 빌드의 버전 관리 복잡성을 관리하는 방법을 보여줍니다. Windows Server 컨테이너에는 컨테이너가 Windows Server 호스트 버전 두 개 이상에서 실행되지 못하도록 하는 버전 호환성 요구사항이 있습니다. 하지만 Windows Server의 Docker는 여러 Windows Server 버전에서 실행될 수 있는 멀티 아키텍처(또는 멀티 플랫폼) 컨테이너 이미지를 지원합니다.
멀티 아키텍처 이미지를 사용하면 이미지를 다시 빌드하고 포드 사양을 변경하지 않고도 Google Kubernetes Engine(GKE) Windows Server 노드 풀을 원하는 Windows Server 버전으로 업그레이드할 수 있습니다. 예를 들면 다음과 같습니다.
- GKE 버전 1.15는 Windows Server 1809를 지원합니다.
- GKE 버전 1.16은 Windows Server 1909를 지원합니다.
특정 GKE 버전을 최신 버전으로 자동으로 업그레이드하려면 Windows 워크로드에 대한 멀티 아키텍처 이미지를 빌드해야 합니다. 멀티 아키텍처 이미지를 빌드하려면 각 Windows Server 버전 이미지를 빌드한 다음 각 Windows Server 버전의 해당 이미지를 참조하는 매니페스트를 빌드해야 합니다. 이미지 생성 및 빌드 프로세스를 완전히 제어하려면 이미지를 수동으로 빌드할 수 있습니다. 또는 Cloud Build를 사용하여 Windows Server 멀티 아키텍처 이미지를 자동으로 빌드할 수 있습니다.
목표
이 튜토리얼에서는 수동으로 또는 Cloud Build를 사용하여 Windows Server 멀티 아키텍처 이미지를 만드는 방법을 알아봅니다.이미지를 수동으로 빌드합니다.
- 다양한 버전 또는 유형의 Windows Server를 사용하여 Docker 이미지 2개(예: 장기 서비스 채널[LTSC] 및 반기 채널[SAC])를 만듭니다.
- Windows Server VM을 만듭니다.
- 매니페스트를 만들어 레지스트리에 푸시합니다.
Cloud Build를 사용하여 이미지를 빌드합니다.
- 프로젝트를 만들고, API를 사용 설정하고, 권한을 부여하여 환경을 준비합니다.
- 애플리케이션, Dockerfile, 빌드 파일을 만듭니다.
- 명령어를 실행하여 이미지를 빌드합니다.
비용
이 문서에서는 비용이 청구될 수 있는 다음과 같은 Google Cloud 구성요소를 사용합니다.
프로젝트 사용량을 기준으로 예상 비용을 산출하려면 가격 계산기를 사용하세요.
이 문서에 설명된 태스크를 완료했으면 만든 리소스를 삭제하여 청구가 계속되는 것을 방지할 수 있습니다. 자세한 내용은 삭제를 참조하세요.
시작하기 전에
시작하기 전에 다음 태스크를 수행했는지 확인합니다.- Google Cloud CLI를 설치하여
gcloud
명령어를 실행합니다. - Docker를 설치하여 컨테이너를 빌드합니다.
- Go를 설치하여 Windows Server 바이너리를 빌드합니다.
- 이 튜토리얼에서는 Artifact Registry를 저장소로 사용합니다. Docker 저장소를 만들었는지 확인합니다.
수동으로 멀티 아키텍처 이미지 빌드
멀티 아키텍처 이미지를 수동으로 빌드하면 필요한 모든 Windows Server 버전이 포함된 이미지를 유연하게 빌드할 수 있습니다. 멀티 아키텍처 이미지 매니페스트를 빌드하려면 다음 안내를 따르세요.
- LTSC 2019 Docker 단일 아키텍처 이미지를 만듭니다. Windows Server 애플리케이션 배포에서 Docker 이미지 만들기에 대한 세부정보를 참조하세요.
예를 들면
us-docker.pkg.dev/my-project/docker-repo/foo:1.0-2019
입니다. - LTSC 2022 Docker 단일 아키텍처 이미지를 만듭니다. 예를 들면
us-docker.pkg.dev/my-project/docker-repo/foo:1.0-2022
입니다. - SAC 20H2 Docker 단일 아키텍처 이미지를 만듭니다. 예를 들면
us-docker.pkg.dev/my-project/docker-repo/foo:1.0-20h2
입니다. - Windows Server VM을 만듭니다(예: 버전 20H2). 빠른 시작: Windows Server VM 사용을 참조하세요.
- RDP를 사용하여 VM에 연결합니다.
- PowerShell 창을 열어 다음 단계에서 명령어를 실행합니다.
docker manifest
실험용 기능을 사용 설정합니다. Docker 매니페스트는 레지스트리에 푸시할 이미지 목록입니다.PS C:\> $env:DOCKER_CLI_EXPERIMENTAL = 'enabled'
멀티 아키텍처 매니페스트를 만듭니다.
docker manifest create ` REGISTRY_REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/foo:1.0 ` REGISTRY_REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/foo:1.0-2019 ` REGISTRY_REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/foo:1.0-2022 ` REGISTRY_REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/foo:1.0-20h2
새로 만든 멀티 아키텍처 이미지 매니페스트를 Artifact Registry 저장소에 푸시합니다.
docker manifest push ` REGISTRY_REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/foo:1.0
멀티 아키텍처 이미지가 올바르게 빌드되고 푸시되도록 하려면
REGISTRY_REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/foo
로 이동하여 해당 이미지를 클릭합니다. 내부에 3개의 이미지가 표시됩니다.foo:1.0-2019
foo:1.0-2022
foo:1.0-20h2
foo:1.0
이제 포드 사양에서 멀티 아키텍처 이미지 REGISTRY_REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/foo:1.0
을 참조할 수 있습니다. 그러면 GKE Windows 노드 풀의 자동 업그레이드를 안전하게 사용할 수 있습니다.
Cloud Build gke-windows-builder를 사용하여 멀티 아키텍처 이미지 빌드
수동 빌드 단계를 용이하게 하려면 OSS gke-windows-builder를 기반으로 gke-windows-builder를 사용하면 됩니다. gke-windows-builder를 Cloud Build와 함께 사용하여 Windows Server 멀티 아키텍처 이미지를 자동으로 빌드할 수 있습니다. GKE는 지원되는 Windows SAC 및 LTSC 버전이 새로 출시되었을 때 이를 포함하도록 빌더를 업데이트합니다. 빌더를 사용하는 또 다른 이점은 이미지를 빌드하기 위해 Powershell로 자체 Windows VM을 만들 필요가 없다는 것입니다. Windows VM은 Cloud Build 내에서 명령어를 실행하는 Docker 컨테이너로 대체됩니다.
빌더의 작동 방식을 이해하기 위해 이 예시를 따라 'hello world' 멀티 아키텍처 이미지를 빌드합니다. 이 단계는 Linux 또는 Windows 서버에서 수행할 수 있습니다.
환경 준비
환경을 준비하려면 다음 단계를 완료하세요.
- 작업 머신에 작업공간 디렉터리(예:
~/gke-windows-builder/hello-world
)를 만듭니다. - 이 튜토리얼의 프로젝트를 만들거나 선택합니다.
- 프로젝트에 결제가 사용 설정되어 있는지 확인합니다.
프로젝트에 대해 Compute Engine, Cloud Build, Artifact Registry API를 사용 설정합니다. gke-windows-builder가 Cloud Build를 사용해서 호출되고, 결과 멀티 아키텍처 컨테이너 이미지는 Artifact Registry에 푸시됩니다. 빌더가 Windows Server VM을 만들고 관리할 수 있으려면 Compute Engine이 필요합니다.
gcloud services enable compute.googleapis.com cloudbuild.googleapis.com \ artifactregistry.googleapis.com cloudbuild.googleapis.com
Google Cloud CLI를 사용하여 Cloud Build 서비스 계정에 다음 Identity and Access Management(IAM) 역할을 부여합니다.
변수 설정:
export PROJECT=$(gcloud info --format='value(config.project)') export MEMBER=$(gcloud projects describe $PROJECT --format 'value(projectNumber)')@cloudbuild.gserviceaccount.com
역할을 지정합니다. 이러한 역할은 빌더가 Windows Server VM을 만들고, 작업공간을 Cloud Storage 버킷에 복사하고, Docker 이미지를 빌드하는 네트워크를 구성하고, 결과 이미지를 Artifact Registry에 푸시하는 데 필요합니다.
gcloud projects add-iam-policy-binding $PROJECT --member=serviceAccount:$MEMBER --role='roles/compute.instanceAdmin' gcloud projects add-iam-policy-binding $PROJECT --member=serviceAccount:$MEMBER --role='roles/iam.serviceAccountUser' gcloud projects add-iam-policy-binding $PROJECT --member=serviceAccount:$MEMBER --role='roles/compute.networkViewer' gcloud projects add-iam-policy-binding $PROJECT --member=serviceAccount:$MEMBER --role='roles/storage.admin' gcloud projects add-iam-policy-binding $PROJECT --member=serviceAccount:$MEMBER --role='roles/artifactregistry.writer'
WinRM이 Windows Server VM에 연결하여 Docker 빌드를 실행할 수 있도록
allow-winrm-ingress
라는 방화벽 규칙을 추가합니다.gcloud compute firewall-rules create allow-winrm-ingress --allow=tcp:5986 --direction=INGRESS
프로젝트의 Artifact Registry에서 Docker 저장소를 만듭니다. 이전에 Artifact Registry에서 Docker 저장소를 사용한 적이 없으면 먼저 Docker 빠른 시작을 완료하세요. 다음 명령어를 실행하여 저장소를 만듭니다.
gcloud artifacts repositories create REPOSITORY \ --repository-format=docker --location=REGISTRY_REGION \ --description="Docker repository"
다음을 바꿉니다.
REPOSITORY
:windows-multi-arch-images
와 같은 이름입니다.REGISTRY_REGION
: 유효한 Artifact Registry 위치
작업공간에서 hello.exe 바이너리 만들기
이 튜토리얼에서는 Go로 작성된 간단한 'hello world' 애플리케이션을 만듭니다. 샘플 앱의 코드는 GitHub에 있습니다.
다음 명령어를 사용하여 이 튜토리얼의 샘플 코드가 포함된 저장소를 로컬 머신에 클론합니다.
git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples cd kubernetes-engine-samples/windows/windows-multi-arch
hello.go
파일이 'Hello World'라는 단어를 출력합니다.hello.exe
바이너리를 생성합니다.GOOS=windows go build hello.go
작업공간에 hello.exe
바이너리가 표시됩니다.
작업공간에서 Dockerfile 및 빌드 파일 만들기
이 섹션에서는 Dockerfile
을 사용하여 각 단일 아키텍처 Windows Server 이미지를 빌드한 다음 빌드 파일을 사용하여 Cloud Build를 트리거합니다. 빌드는 단일 아키텍처 이미지를 멀티 아키텍처 이미지로 결합합니다.
Dockerfile
은 Docker로 이미지를 빌드하기 위한 안내가 포함된 텍스트 문서입니다. gke-windows-builder는WINDOWS_VERSION
을 이미지를 빌드할 특정 Windows Server 버전으로 바꿉니다. 예를 들어 빌더는 Windows Server 20H2에서docker build -t multi-arch-helloworld:latest_20h2 --build-arg WINDOWS_VERSION=20H2 .
를 실행합니다.Dockerfile
이 포함된 동일한 디렉터리에서cloudbuild.yaml
파일은 빌드 구성 파일입니다. <REPOSITORY> 및 <REGISTRY_REGION>을 이전 단계에서 만든 Artifact Registry 저장소의 이름 및 리전으로 바꿉니다. 빌드 시 Cloud Build는 자동으로$PROJECT_ID
를 프로젝트 ID로 바꿉니다.
이미지 빌드
이제 이미지를 빌드하고 로그를 보고 성공적인 빌드를 확인할 수 있습니다.
이미지를 빌드하려면 다음 명령어를 실행하세요.
gcloud builds submit --config=cloudbuild.yaml .
다음 예시와 같은 로그가 표시됩니다. 로그의 마지막 행은 빌드가 성공했음을 보여줍니다.
Creating temporary tarball archive of 2 file(s) totalling 492 bytes before compression. Uploading tarball of [.] to [gs://PROJECT_ID_cloudbuild/source/1600082502.509759-b949721a922d462c94a75da9be9f1181.tgz] Created [https://cloudbuild.googleapis.com/v1/projects/PROJECT_ID/builds/ec333452-1301-47e8-90e2-716aeb2f5650]. Logs are available at [https://console.cloud.google.com/cloud-build/builds/ec333452-1301-47e8-90e2-716aeb2f5650?project=840737568665]. ------------------------ REMOTE BUILD OUTPUT--------------------------------------- ... ... Created manifest list REGISTRY_REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/multiarch-helloworld:latest sha256:3ecbbc9f5144f358f81f7c7f1a7e28f069c98423d59c40eaff72bf184af0be02 2020/09/14 11:34:25 Instance: 35.184.178.49 shut down successfully PUSH DONE ----------------------------------------------------------------------------------- ID CREATE_TIME DURATION SOURCE IMAGES STATUS ec333452-1301-47e8-90e2-716aeb2f5650 2020-09-14T11:21:43+00:00 12M43S gs://PROJECT_ID_cloudbuild/source/1600082502.509759-b949721a922d462c94a75da9be9f1181.tgz - SUCCESS
빌드 구성 파일을 사용하여 이미지를 빌드하고 이미지를 REGISTRY_REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/multiarch-helloworld:latest
의 Artifact Registry에 푸시했습니다.
이미지 배포
멀티 아키텍처 Windows 이미지를 클러스터에 배포하려면 Windows Server 애플리케이션 배포를 참조하여 이미지를 배포하는 방법을 알아보세요.
고급 gke-windows-builder 사용
cloudbuild.yaml
빌드 구성 파일의 args
섹션에 플래그를 추가하여 gke-windows-builder 동작을 맞춤설정할 수 있습니다. 이 섹션에서는 일부 일반적인 동작의 플래그에 대해 설명하지만, 이것이 전체 목록이 아닙니다. gke-windows-builder에서 지원되는 전체 플래그 목록을 보려면 Linux 서버 또는 Cloud Shell에서 다음 명령어를 실행하세요.
docker run -it us-docker.pkg.dev/gke-windows-tools/docker-repo/gke-windows-builder:latest --help
Windows 인스턴스용으로 더 큰 머신 유형을 사용하면 빌드 속도를 높일 수 있습니다.
- --machineType
- 'n1-standard-8'
GKE가 지원하는 모든 Windows 버전의 이미지를 빌드하는 대신 --versions
플래그를 사용하여 빌드할 특정 Windows Server 버전을 선택할 수 있습니다.
- --versions
- '20H2,ltsc2019'
작업공간에 파일이 여러 개 있는 경우 WinRM이 아닌 Cloud Storage를 통해 작업공간을 복사하도록 빌더를 구성하면 이미지 빌드가 더 안정적입니다.
프로젝트에 gs://{your project}_builder
과 같은 버킷을 만들고 --workspace-bucket
플래그를 설정합니다.
- --workspace-bucket
- '{your project}_builder'
공유 VPC 서비스 프로젝트에서 Windows 빌더 인스턴스를 실행하려면 인스턴스의 네트워크 설정을 제어하는 다음 플래그를 사용합니다.
- --subnetwork-project
- 'shared-vpc-host-project'
- --subnetwork
- 'host-project-subnet-shared-with-service-project'
삭제
튜토리얼을 완료한 후에는 만든 리소스를 삭제하여 할당량 사용을 중지하고 요금이 청구되지 않도록 할 수 있습니다. 다음 섹션은 이러한 리소스를 삭제하거나 사용 중지하는 방법을 설명합니다.
이미지 삭제
Artifact Registry에서 multiarch-helloworld
이미지를 삭제하려면 이미지 삭제를 참조하세요.
프로젝트 삭제
비용이 청구되지 않도록 하는 가장 쉬운 방법은 튜토리얼에서 만든 프로젝트를 삭제하는 것입니다.
프로젝트를 삭제하는 방법은 다음과 같습니다.
- Google Cloud 콘솔에서 리소스 관리 페이지로 이동합니다.
- 프로젝트 목록에서 삭제할 프로젝트를 선택하고 삭제를 클릭합니다.
- 대화상자에서 프로젝트 ID를 입력한 후 종료를 클릭하여 프로젝트를 삭제합니다.
다음 단계
다른 Kubernetes Engine 튜토리얼 살펴보기
Google Cloud에 대한 참조 아키텍처, 다이어그램, 권장사항 살펴보기 Cloud 아키텍처 센터 살펴보기