Windows Server 애플리케이션 배포

이 페이지에서는 스테이트리스(Stateless) Windows Server 애플리케이션을 배포하는 방법을 설명합니다. 스테이트풀(Stateful) Windows 애플리케이션을 배포하는 방법도 설명합니다.

Windows Server 애플리케이션을 표준 클러스터에 배포

Windows Server 애플리케이션을 배포하는 절차는 다음과 같습니다.

  1. 클러스터를 만듭니다.
  2. 배포 매니페스트 파일을 만듭니다.
  3. 배포를 만들고 노출합니다.
  4. Pod가 실행 중인지 확인합니다.

클러스터 만들기

자세한 내용은 Windows Server 노드 풀을 사용하여 클러스터 만들기를 참조하세요.

배포 매니페스트 파일 만들기

Windows Server 노드는 node.kubernetes.io/os=windows:NoSchedule 키-값 쌍으로 taint됩니다.

이 taint는 GKE 스케줄러가 Windows Server 노드에서 Linux 컨테이너를 실행하지 않도록 합니다. Windows Server 노드에서 Windows Server 컨테이너를 예약하려면 매니페스트 파일에 다음 노드 선택기가 포함되어야 합니다.

nodeSelector:
 kubernetes.io/os: windows

클러스터에서 실행되는 허용 웹훅은 새 워크로드에 이 Windows 노드 선택기가 있는지 확인하고 발견하면 다음 내결함성을 워크로드에 적용하여 taint된 Windows Server 노드에서 실행되도록 합니다.

tolerations:
- effect: NoSchedule
  key: node.kubernetes.io/os
  operator: Equal
  value: windows

경우에 따라 이 내결함성을 매니페스트 파일에 명시적으로 포함해야 할 수도 있습니다. 예를 들어 클러스터의 모든 Linux 및 Windows Server 노드에서 실행되도록 멀티 아키텍처 컨테이너 이미지가 있는 DaemonSet을 배포할 경우 매니페스트 파일에 Windows 노드 선택기가 포함되지 않습니다. Windows taint에 대한 내결함성을 명시적으로 포함해야 합니다.

매니페스트 파일 예시

다음 예시 배포 파일(iis.yaml)은 Microsoft의 IIS 이미지를 단일 pod에 배포합니다.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: iis
  labels:
    app: iis
spec:
  replicas: 1
  selector:
    matchLabels:
      app: iis
  template:
    metadata:
      labels:
        app: iis
    spec:
      nodeSelector:
        kubernetes.io/os: windows
      containers:
      - name: iis-server
        image: mcr.microsoft.com/windows/servercore/iis
        ports:
        - containerPort: 80

이 파일은 모든 워크로드가 동일한 Windows Server 노드 이미지 유형과 버전을 사용하는 클러스터용입니다. 혼합 노드 이미지 작업 방법에 대한 자세한 내용은 혼합 노드 이미지 사용 섹션을 참조하세요.

배포 만들기 및 노출

이전 단계에서 만든 배포 파일을 외부 부하 분산기 배포가 있는 Kubernetes 서비스로 만들고 노출합니다.

  1. 배포를 만들려면 다음 명령어를 실행합니다.

    kubectl apply -f iis.yaml
    
  2. 배포를 노출하려면 다음 명령어를 실행합니다.

    kubectl expose deployment iis \
    --type=LoadBalancer \
    --name=iis
    

Pod가 실행 중인지 확인

Pod의 유효성을 검사하여 Pod가 작동하는지 확인합니다.

  1. kubectl을 사용하여 Pod 상태를 확인합니다.

    kubectl get pods
    
  2. 반환된 출력에 Pod 상태가 Running으로 표시될 때까지 기다립니다.

    NAME                   READY     STATUS    RESTARTS   AGE
    iis-5c997657fb-w95dl   1/1       Running   0          28s
    
  3. 서비스 상태를 가져오고 외부 IP 필드가 채워질 때까지 기다립니다.

    kubectl get service iis
    

    다음과 같은 출력이 표시됩니다.

    NAME   TYPE           CLUSTER-IP    EXTERNAL-IP      PORT(S)        AGE
    iis    LoadBalancer   10.44.2.112   external-ip    80:32233/TCP   17s
    

    이제 IIS 웹페이지를 보기 위해 브라우저를 사용하여 http://external-ip를 열 수 있습니다.

비공개 클러스터에 Windows Server 애플리케이션 배포

이 섹션에서는 Windows Server 컨테이너 애플리케이션을 비공개 클러스터에 배포하는 방법을 설명합니다.

Windows Server 컨테이너 이미지에는 여러 레이어가 있고 기본 레이어는 Microsoft에서 제공됩니다. 기본 레이어는 Linux Docker 이미지 레이어와 마찬가지로 이미지와 함께 삽입되는 것이 아닌 외부 레이어로 저장됩니다. Windows Server 컨테이너 이미지를 처음으로 가져올 경우 일반적으로 Microsoft 서버에서 기본 레이어를 다운로드해야 합니다. 비공개 클러스터 노드는 인터넷에 연결되어 있지 않으므로 Windows Server 기본 컨테이너 레이어를 Microsoft 서버에서 직접 가져올 수 없습니다.

비공개 클러스터를 사용하려면 비분산 레이어를 비공개 레지스트리로 푸시하도록 Docker 데몬을 구성하면 됩니다. 자세한 내용은 Docker의 GitHub 페이지에서 Considerations for air-gapped registries(인터넷과 물리적으로 차단된 레지스트리의 고려사항)를 참조하세요.

Windows Server 애플리케이션을 비공개 클러스터에 배포하려면 다음 안내를 따르세요.

  1. Windows Server 노드를 사용하여 비공개 클러스터를 만듭니다.
  2. Windows Server 애플리케이션 Docker 이미지를 빌드합니다.
  3. 애플리케이션을 비공개 클러스터에 배포합니다.
  4. Pod가 실행 중인지 확인합니다.

비공개 클러스터 만들기

Windows 서버 노드로 클러스터 만들기비공개 클러스터 만들기의 안내를 따라 Windows 노드 풀을 만들고 비공개 클러스터에 추가합니다.

비공개 클러스터에 사용할 Windows Server 애플리케이션 이미지를 만듭니다.

  1. Docker 이미지를 빌드하려면 애플리케이션 컨테이너를 실행할 Windows Server 버전(예: Windows Server 2019 또는 Windows Server 버전 1909)으로 Compute Engine 인스턴스를 시작합니다. 또한 인터넷에 연결되어 있는지 확인합니다.

  2. Compute 인스턴스에서 Docker 데몬 구성으로 이동합니다.

    PS C:\> cat C:\ProgramData\docker\config\daemon.json
    
  3. 다음 줄을 추가하여 외부 레이어를 비공개 레지스트리로 푸시할 수 있도록 Docker daemon.json 파일을 구성합니다.

    {
      "allow-nondistributable-artifacts": ["gcr.io"]
    }
    

    gcr.io는 이미지를 호스팅할 Container Registry를 참조합니다.

  4. Docker 데몬을 다시 시작합니다.

    PS C:\> Restart-Service docker
    
  5. 애플리케이션의 Docker 이미지를 빌드하고 태그를 지정합니다.

    PS C:\> cd C:\my-app
    
    PS C:\my-app> docker build -t gcr.io/my-project/my-app:v2 .
    

    이 명령어는 현재 디렉터리에서 Dockerfile을 사용하여 이미지를 빌드하고 gcr.io/my-project/my-app:v2와 같은 이름으로 태그를 지정하도록 Docker에 지시합니다.

  6. 애플리케이션의 Docker 이미지를 my-projectgcr.io 레지스트리로 푸시합니다. allow-nondistributable-artifacts 구성 집합은 Windows 기본 레이어가 비공개 레지스트리로 푸시되도록 합니다.

    PS C:\my-app> docker push gcr.io/my-project/my-app:v2
    

배포 매니페스트 파일 만들기

다음은 my-app.yaml이라는 샘플 배포 매니페스트 파일입니다. 이 예시의 이미지는 앞의 단계(gcr.io/my- project/my-app:v2)에서 푸시한 이미지입니다.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
  labels:
    app: my-app
spec:
  replicas: 1
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      nodeSelector:
        kubernetes.io/os: windows
      containers:
      - name: my-server
        image: gcr.io/my-project/my-app:v2

이 애플리케이션을 비공개 클러스터에 배포하려면 다음을 실행합니다.

gcloud container clusters get-credentials var>private-cluster-name
kubectl apply -f my-app.yaml

여기서 private-cluster-name은 생성한 클러스터의 이름입니다.

Pod가 실행 중인지 확인

모든 Pod를 나열하여 올바르게 실행되고 있는지 확인합니다.

kubectl get pods

예상 결과에 Running 상태의 Pod가 표시됩니다.

NAME                     READY   STATUS    RESTARTS   AGE
my-app-c95fc5596-c9zcb   1/1     Running   0          5m

혼합 노드 이미지 사용

클러스터에는 여러 가지 Windows Server 유형과 Windows Server 버전의 노드 풀이 포함될 수 있습니다. 또한 Windows Server와 Linux 워크로드를 결합할 수 있습니다. 다음 섹션에서는 이러한 유형의 클러스터를 사용하도록 워크로드를 구성하는 방법을 자세히 설명합니다.

다양한 Windows Server 노드 이미지 유형에서 워크로드 사용

서로 다른 Windows Server 이미지 유형(LTSC 또는 SAC)을 사용하는 노드 풀을 클러스터에 추가할 수 있습니다. Windows Server 유형이 혼합된 클러스터에서는 Windows Server 컨테이너가 호환되지 않는 Windows Server 노드에 예약되지 않는지 확인해야 합니다.

Windows Server LTSC 노드 풀 한 개와 Windows Server SAC 노드 풀 한 개가 있으면 두 워크로드에 gke-os-distribution 노드 라벨을 추가합니다.

Windows Server LTSC 워크로드의 매니페스트 파일에 다음 nodeSelector를 포함합니다.

nodeSelector:
   kubernetes.io/os: windows
   cloud.google.com/gke-os-distribution: windows_ltsc

Windows Server SAC 워크로드의 매니페스트 파일에 다음 nodeSelector를 포함합니다.

nodeSelector:
   kubernetes.io/os: windows
   cloud.google.com/gke-os-distribution: windows_sac

이 라벨을 추가하면 LTSC 컨테이너 이미지가 호환되지 않는 SAC 노드에 예약되지 않으며 반대의 경우도 마찬가지입니다.

다양한 Windows Server 버전에서 작업 워크로드 사용

다양한 LTSC 또는 SAC 버전의 Windows Server 노드 풀을 실행해야 하는 경우에는 컨테이너 이미지를 클러스터에서 사용 중인 모든 Windows Server 버전에서 실행할 수 있는 멀티 아키텍처 이미지로 빌드하는 것이 좋습니다. gke-os-distribution 노드 라벨만으로는 워크로드가 호환되지 않는 노드에 예약되는 것을 막지 못할 수 있습니다.

클러스터 한 개에서 Linux 및 Windows Server 워크로드 사용

다음 노드 선택기를 Linux 워크로드에 추가하여 항상 Linux 노드에 예약되도록 합니다.

nodeSelector:
   kubernetes.io/os: linux

이렇게 하면 NoSchedule taint가 실수로 Windows Server 노드에서 삭제될 경우 Linux 워크로드가 Windows Server 노드에 예약되지 않도록 추가 보호 기능이 제공됩니다.