Windows in Kubernetes
지원 버전: Kubernetes 1.32, 1.33, 1.34 마지막 업데이트: 2026년 2월 11일
Kubernetes는 원래 Linux 컨테이너를 위해 설계되었지만, 버전 1.14부터 Windows 컨테이너에 대한 프로덕션 지원이 추가되었습니다. 이 장에서는 Kubernetes에서 Windows 워크로드를 실행하는 방법, 아키텍처, 제한 사항, 그리고 Amazon EKS에서의 Windows 지원에 대해 알아보겠습니다.
목차
- Windows 컨테이너 개요
- Kubernetes의 Windows 지원 아키텍처
- Windows 노드 제한 사항
- Windows 노드 설정
- Windows 컨테이너 배포
- 네트워킹
- 스토리지
- 모니터링 및 로깅
- 보안
- Amazon EKS에서의 Windows 지원
- 모범 사례
- 결론
Windows 컨테이너 개요
Windows 컨테이너는 Windows 운영 체제에서 실행되는 컨테이너로, Windows 애플리케이션을 컨테이너화하여 배포할 수 있게 해줍니다.
Windows 컨테이너 유형
Windows 컨테이너에는 두 가지 유형이 있습니다:
Windows Server 컨테이너: Linux 컨테이너와 유사하게 호스트 OS 커널을 공유합니다. 가볍고 빠르게 시작되지만, 호스트와 동일한 Windows 버전이 필요합니다.
Hyper-V 격리 컨테이너: 각 컨테이너가 경량 VM에서 실행되어 더 높은 수준의 격리를 제공합니다. 호스트와 다른 Windows 버전을 실행할 수 있지만, 더 많은 리소스를 사용합니다.
다음 다이어그램은 두 가지 Windows 컨테이너 유형의 아키텍처 차이를 보여줍니다:
Windows 컨테이너 이미지
Windows 컨테이너 이미지는 Microsoft에서 제공하는 기본 이미지를 기반으로 합니다:
- Windows Server Core: 최소한의 Windows Server 환경을 제공하는 경량 이미지
- Nano Server: 더 작은 공간을 차지하는 초경량 이미지
- Windows: 전체 Windows Server 환경을 제공하는 이미지
예시 Dockerfile:
FROM mcr.microsoft.com/windows/servercore:ltsc2019
WORKDIR /app
COPY . .
RUN powershell -Command "Install-WindowsFeature Web-Server"
EXPOSE 80
CMD ["powershell", "-Command", "Start-Service W3SVC; Get-Content -Path 'C:\\inetpub\\logs\\LogFiles\\W3SVC1\\u_ex*' -Wait"]Kubernetes의 Windows 지원 아키텍처
Kubernetes에서 Windows 지원은 혼합 환경을 기반으로 합니다. 컨트롤 플레인 구성 요소는 항상 Linux에서 실행되며, 워커 노드는 Linux 또는 Windows일 수 있습니다.
아키텍처 개요
Kubernetes의 Windows 지원 아키텍처는 다음과 같습니다:
- Linux 컨트롤 플레인: kube-apiserver, kube-controller-manager, kube-scheduler, etcd는 항상 Linux에서 실행됩니다.
- Linux 워커 노드: 시스템 구성 요소(CoreDNS, metrics-server 등)를 실행합니다.
- Windows 워커 노드: Windows 애플리케이션 워크로드를 실행합니다.
Windows 노드 구성 요소
Windows 노드에서 실행되는 Kubernetes 구성 요소:
- kubelet: 노드에서 포드 및 컨테이너 관리
- kube-proxy: 네트워크 규칙 관리
- CNI 플러그인: 네트워킹 구성
- CSI 플러그인: 스토리지 관리
Windows 노드 제한 사항
Kubernetes에서 Windows 노드를 사용할 때 알아야 할 몇 가지 제한 사항이 있습니다.
기능 제한 사항
- 특권 컨테이너: Windows는 특권 컨테이너를 지원하지 않습니다.
- 호스트 네트워크 모드: Windows 포드는 호스트 네트워크 모드를 사용할 수 없습니다.
- 포드 보안 컨텍스트: 일부 보안 컨텍스트 기능(runAsUser, fsGroup 등)은 지원되지 않습니다.
- DaemonSet: Windows 노드에서 실행되는 DaemonSet은 특별한 고려 사항이 필요합니다.
- emptyDir 볼륨: Windows에서는 메모리 기반 emptyDir 볼륨이 지원되지 않습니다.
- 리소스 제한: Windows에서는 CPU 제한이 다르게 적용됩니다.
네트워킹 제한 사항
- 네트워크 모드: Windows는 L3 네트워킹만 지원합니다.
- 서비스 유형: Windows 노드는 일부 서비스 유형에 제한이 있습니다.
- 로드 밸런싱: 일부 로드 밸런싱 기능이 제한될 수 있습니다.
운영 체제 버전 호환성
Windows 컨테이너는 호스트 OS 버전과의 호환성이 중요합니다:
| 컨테이너 기본 이미지 | 호환되는 호스트 OS 버전 |
|---|---|
| Windows Server 2019 | Windows Server 2019 |
| Windows Server 2022 | Windows Server 2022 |
Hyper-V 격리를 사용하면 이러한 제한을 완화할 수 있지만, 추가 리소스가 필요합니다.
Windows 노드 설정
Kubernetes 클러스터에 Windows 노드를 추가하는 과정을 알아보겠습니다.
사전 요구 사항
Windows 노드를 설정하기 전에 다음 사항을 확인해야 합니다:
- Kubernetes 버전: 1.14 이상
- Windows 버전: Windows Server 2019 이상
- 네트워크 플러그인: Windows를 지원하는 CNI 플러그인(Calico, Flannel 등)
- 컨테이너 런타임: Docker, containerd 등
Windows 노드 준비
Windows 노드를 준비하는 단계:
- Windows Server 설치: Windows Server 2019 이상 설치
- 컨테이너 기능 활성화:
Install-WindowsFeature -Name Containers
Restart-Computer -Force- Docker 설치:
Install-Module -Name DockerMsftProvider -Repository PSGallery -Force
Install-Package -Name Docker -ProviderName DockerMsftProvider -Force
Restart-Computer -Force- Kubernetes 구성 요소 설치:
# 디렉토리 생성
mkdir -p c:\k
# kubelet, kubeadm, kubectl 다운로드
curl.exe -LO https://dl.k8s.io/v1.22.0/bin/windows/amd64/kubelet.exe
curl.exe -LO https://dl.k8s.io/v1.22.0/bin/windows/amd64/kubectl.exe
curl.exe -LO https://dl.k8s.io/v1.22.0/bin/windows/amd64/kube-proxy.exe
curl.exe -LO https://github.com/kubernetes-sigs/sig-windows-tools/releases/latest/download/wins.exe
# 파일을 C:\k로 이동
mv kubelet.exe C:\k
mv kubectl.exe C:\k
mv kube-proxy.exe C:\k
mv wins.exe C:\k- 네트워크 구성:
# 방화벽 규칙 설정
New-NetFirewallRule -Name kubelet -DisplayName 'kubelet' -Enabled True -Direction Inbound -Protocol TCP -Action Allow -LocalPort 10250
New-NetFirewallRule -Name https -DisplayName 'https' -Enabled True -Direction Inbound -Protocol TCP -Action Allow -LocalPort 443
New-NetFirewallRule -Name http -DisplayName 'http' -Enabled True -Direction Inbound -Protocol TCP -Action Allow -LocalPort 80kubeadm을 사용한 Windows 노드 조인
Linux 컨트롤 플레인에서 조인 토큰 생성:
kubeadm token create --print-join-commandWindows 노드에서 조인 명령 실행:
# kubeadm 조인 명령 실행
kubeadm join <control-plane-host>:<control-plane-port> --token <token> --discovery-token-ca-cert-hash sha256:<hash>
# kubelet 서비스 등록 및 시작
sc.exe create kubelet binPath= "C:\k\kubelet.exe --windows-service --kubeconfig=C:\k\config"
Start-Service kubeletWindows 노드 레이블 설정
Windows 노드에 적절한 레이블을 설정하여 워크로드 스케줄링을 제어합니다:
kubectl label node <windows-node-name> kubernetes.io/os=windows
kubectl label node <windows-node-name> kubernetes.io/arch=amd64Windows 컨테이너 배포
Windows 컨테이너를 Kubernetes에 배포하는 방법을 알아보겠습니다.
노드 셀렉터 사용
Windows 워크로드를 배포할 때는 노드 셀렉터를 사용하여 Windows 노드에 스케줄링되도록 해야 합니다:
apiVersion: apps/v1
kind: Deployment
metadata:
name: iis-deployment
spec:
replicas: 2
selector:
matchLabels:
app: iis
template:
metadata:
labels:
app: iis
spec:
nodeSelector:
kubernetes.io/os: windows
containers:
- name: iis
image: mcr.microsoft.com/windows/servercore/iis:windowsservercore-ltsc2019
resources:
limits:
cpu: 1
memory: 800Mi
requests:
cpu: .1
memory: 300Mi
ports:
- containerPort: 80리소스 요청 및 제한
Windows 컨테이너의 리소스 요청 및 제한은 Linux 컨테이너와 다르게 처리됩니다:
- CPU 제한: Windows에서는 CPU 제한이 다르게 적용됩니다. 예를 들어, CPU 제한이 1이면 단일 CPU 코어의 100%를 사용할 수 있습니다.
- 메모리 제한: Windows 컨테이너는 메모리 제한을 준수하지만, 일부 시스템 프로세스로 인해 추가 오버헤드가 발생할 수 있습니다.
컨테이너 사용자 지정
Windows 컨테이너에서 사용자 지정 스크립트 실행:
apiVersion: v1
kind: Pod
metadata:
name: windows-custom-script
spec:
nodeSelector:
kubernetes.io/os: windows
containers:
- name: windows-container
image: mcr.microsoft.com/windows/servercore:ltsc2019
command:
- powershell.exe
- -Command
- |
while ($true) {
Write-Host "Hello from Windows container"
Start-Sleep -Seconds 10
}다중 컨테이너 포드
Windows에서도 다중 컨테이너 포드를 지원하지만, 일부 제한 사항이 있습니다:
apiVersion: v1
kind: Pod
metadata:
name: windows-multi-container
spec:
nodeSelector:
kubernetes.io/os: windows
containers:
- name: web
image: mcr.microsoft.com/windows/servercore/iis:windowsservercore-ltsc2019
ports:
- containerPort: 80
- name: logger
image: mcr.microsoft.com/windows/servercore:ltsc2019
command:
- powershell.exe
- -Command
- |
while ($true) {
Get-Content -Path 'C:\inetpub\logs\LogFiles\W3SVC1\u_ex*' -Wait
}네트워킹
Windows 노드의 네트워킹은 Linux 노드와 다른 특성을 가집니다.
다음 다이어그램은 Windows 노드와 Linux 노드가 혼합된 Kubernetes 클러스터의 네트워킹 아키텍처를 보여줍니다:
지원되는 네트워크 플러그인
Windows 노드에서 지원되는 네트워크 플러그인:
- Flannel: VXLAN 또는 host-gw 모드
- Calico: VXLAN 모드
- Antrea: OVS 기반 네트워킹
- Azure CNI: Azure 환경에서 사용
- AWS VPC CNI: AWS 환경에서 사용
Flannel 설정 예시
Flannel을 사용한 Windows 네트워킹 설정:
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: kube-flannel-ds-windows
namespace: kube-system
labels:
tier: node
app: flannel
spec:
selector:
matchLabels:
app: flannel
template:
metadata:
labels:
tier: node
app: flannel
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/os
operator: In
values:
- windows
hostNetwork: true
containers:
- name: kube-flannel
image: sigwindowstools/flannel:v0.13.0
command:
- powershell
args:
- -file
- /opt/bin/flannel-host.ps1
env:
- name: POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
- name: POD_NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
volumeMounts:
- name: host-run
mountPath: /run
- name: cni
mountPath: /etc/cni/net.d
- name: flannel-cfg
mountPath: /etc/kube-flannel/
volumes:
- name: host-run
hostPath:
path: /run
- name: cni
hostPath:
path: /etc/cni/net.d
- name: flannel-cfg
configMap:
name: kube-flannel-cfg서비스 노출
Windows 노드에서 서비스를 노출하는 방법:
apiVersion: v1
kind: Service
metadata:
name: iis-service
spec:
selector:
app: iis
ports:
- port: 80
targetPort: 80
type: LoadBalancer네트워크 정책
Windows 노드에서 네트워크 정책을 사용하려면 네트워크 정책을 지원하는 CNI 플러그인(예: Calico)이 필요합니다:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-frontend-to-backend
namespace: default
spec:
podSelector:
matchLabels:
app: backend
os: windows
ingress:
- from:
- podSelector:
matchLabels:
app: frontend
ports:
- protocol: TCP
port: 80스토리지
Windows 노드에서 사용할 수 있는 스토리지 옵션을 알아보겠습니다.
다음 다이어그램은 Windows 노드에서 사용 가능한 다양한 스토리지 옵션을 보여줍니다:
지원되는 볼륨 유형
Windows 노드에서 지원되는 볼륨 유형:
- emptyDir: 임시 스토리지 (메모리 기반 emptyDir은 지원되지 않음)
- hostPath: 호스트 노드의 파일 시스템
- configMap: 구성 데이터
- secret: 민감한 데이터
- azureFile: Azure File 스토리지
- awsElasticBlockStore: AWS EBS 볼륨
- azureDisk: Azure Disk 스토리지
- CSI: Container Storage Interface 드라이버
emptyDir 볼륨 예시
apiVersion: v1
kind: Pod
metadata:
name: windows-emptydir
spec:
nodeSelector:
kubernetes.io/os: windows
containers:
- name: windows-container
image: mcr.microsoft.com/windows/servercore:ltsc2019
volumeMounts:
- name: temp-volume
mountPath: C:\temp
command:
- powershell.exe
- -Command
- |
Set-Content -Path C:\temp\test.txt -Value "Hello from Windows"
while ($true) {
Get-Content -Path C:\temp\test.txt
Start-Sleep -Seconds 10
}
volumes:
- name: temp-volume
emptyDir: {}hostPath 볼륨 예시
apiVersion: v1
kind: Pod
metadata:
name: windows-hostpath
spec:
nodeSelector:
kubernetes.io/os: windows
containers:
- name: windows-container
image: mcr.microsoft.com/windows/servercore:ltsc2019
volumeMounts:
- name: logs-volume
mountPath: C:\logs
command:
- powershell.exe
- -Command
- |
Set-Content -Path C:\logs\app.log -Value "Application log"
while ($true) {
Add-Content -Path C:\logs\app.log -Value "Log entry at $(Get-Date)"
Start-Sleep -Seconds 10
}
volumes:
- name: logs-volume
hostPath:
path: C:\k\logs
type: DirectoryOrCreateConfigMap 및 Secret 볼륨 예시
apiVersion: v1
kind: ConfigMap
metadata:
name: windows-config
data:
config.json: |
{
"setting1": "value1",
"setting2": "value2"
}
---
apiVersion: v1
kind: Secret
metadata:
name: windows-secret
type: Opaque
data:
username: YWRtaW4= # admin
password: cGFzc3dvcmQ= # password
---
apiVersion: v1
kind: Pod
metadata:
name: windows-config-secret
spec:
nodeSelector:
kubernetes.io/os: windows
containers:
- name: windows-container
image: mcr.microsoft.com/windows/servercore:ltsc2019
volumeMounts:
- name: config-volume
mountPath: C:\config
- name: secret-volume
mountPath: C:\secret
command:
- powershell.exe
- -Command
- |
Get-Content -Path C:\config\config.json
Get-Content -Path C:\secret\username
Get-Content -Path C:\secret\password
while ($true) { Start-Sleep -Seconds 10 }
volumes:
- name: config-volume
configMap:
name: windows-config
- name: secret-volume
secret:
secretName: windows-secretCSI 드라이버 사용
Windows에서 CSI 드라이버를 사용하는 예시:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: windows-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
storageClassName: windows-csi
---
apiVersion: v1
kind: Pod
metadata:
name: windows-csi-pod
spec:
nodeSelector:
kubernetes.io/os: windows
containers:
- name: windows-container
image: mcr.microsoft.com/windows/servercore:ltsc2019
volumeMounts:
- name: data-volume
mountPath: C:\data
command:
- powershell.exe
- -Command
- |
Set-Content -Path C:\data\file.txt -Value "Persistent data"
while ($true) { Start-Sleep -Seconds 10 }
volumes:
- name: data-volume
persistentVolumeClaim:
claimName: windows-pvc모니터링 및 로깅
Windows 노드 및 컨테이너의 모니터링 및 로깅 방법을 알아보겠습니다.
모니터링
Windows 노드 모니터링을 위한 도구:
- Prometheus Windows Exporter: Windows 노드 메트릭 수집
- metrics-server: 기본 리소스 사용량 메트릭 제공
- Datadog, Dynatrace, New Relic: 상용 모니터링 솔루션
Windows 노드에 Prometheus Windows Exporter 설치:
# Windows Exporter 다운로드
Invoke-WebRequest -Uri https://github.com/prometheus-community/windows_exporter/releases/download/v0.16.0/windows_exporter-0.16.0-amd64.msi -OutFile windows_exporter.msi
# Windows Exporter 설치
Start-Process msiexec.exe -ArgumentList '/i', 'windows_exporter.msi', 'ENABLED_COLLECTORS=cpu,memory,disk,net,service,os,system', '/quiet' -WaitPrometheus 구성:
scrape_configs:
- job_name: 'windows-nodes'
static_configs:
- targets: ['windows-node-1:9182', 'windows-node-2:9182']로깅
Windows 컨테이너 로그 수집을 위한 도구:
- Fluent Bit: 경량 로그 수집기
- Fluentd: 로그 수집 및 전달
- Elasticsearch: 로그 저장 및 검색
- Azure Monitor: Azure 환경에서 사용
- CloudWatch Logs: AWS 환경에서 사용
Windows 노드에 Fluent Bit 설치:
# Fluent Bit 다운로드
Invoke-WebRequest -Uri https://fluentbit.io/releases/1.8/fluent-bit-1.8.11-win64.zip -OutFile fluent-bit.zip
# 압축 해제
Expand-Archive -Path fluent-bit.zip -DestinationPath C:\fluent-bit
# 구성 파일 생성
@"
[SERVICE]
Flush 5
Daemon Off
Log_Level info
[INPUT]
Name winlog
Channels Application,System,Security
[OUTPUT]
Name es
Match *
Host elasticsearch-host
Port 9200
Index windows_logs
"@ | Out-File -FilePath C:\fluent-bit\conf\fluent-bit.conf -Encoding ascii
# 서비스 등록
sc.exe create fluent-bit binPath= "C:\fluent-bit\bin\fluent-bit.exe -c C:\fluent-bit\conf\fluent-bit.conf"
Start-Service fluent-bit애플리케이션 로그 수집
Windows 컨테이너 애플리케이션 로그 수집:
apiVersion: v1
kind: Pod
metadata:
name: windows-logging
spec:
nodeSelector:
kubernetes.io/os: windows
containers:
- name: iis
image: mcr.microsoft.com/windows/servercore/iis:windowsservercore-ltsc2019
volumeMounts:
- name: logs
mountPath: C:\inetpub\logs\LogFiles
- name: log-collector
image: mcr.microsoft.com/windows/servercore:ltsc2019
command:
- powershell.exe
- -Command
- |
while ($true) {
Get-Content -Path 'C:\inetpub\logs\LogFiles\W3SVC1\u_ex*' -Wait
}
volumeMounts:
- name: logs
mountPath: C:\inetpub\logs\LogFiles
volumes:
- name: logs
emptyDir: {}보안
Windows 노드 및 컨테이너의 보안 고려 사항을 알아보겠습니다.
Windows 노드 보안
Windows 노드 보안을 위한 권장 사항:
- 최신 업데이트 적용: Windows 보안 업데이트 정기적 적용
- 방화벽 구성: Windows Defender 방화벽 적절히 구성
- 최소 권한 원칙: 필요한 최소한의 권한만 부여
- 안티바이러스 소프트웨어: 적절한 안티바이러스 소프트웨어 설치
- 그룹 정책: 보안 강화를 위한 그룹 정책 적용
Windows 컨테이너 보안
Windows 컨테이너 보안을 위한 권장 사항:
- 최소 기본 이미지: 가능한 작은 기본 이미지 사용(Nano Server 등)
- 이미지 스캐닝: 컨테이너 이미지 취약점 스캐닝
- ReadOnlyRootFilesystem: 가능한 경우 읽기 전용 루트 파일 시스템 사용
- 비특권 사용자: 비특권 사용자로 애플리케이션 실행
- 네트워크 정책: 적절한 네트워크 정책 적용
RunAsUsername
Windows 컨테이너에서는 runAsUser 대신 runAsUsername을 사용하여 컨테이너 내에서 실행할 사용자를 지정할 수 있습니다:
apiVersion: v1
kind: Pod
metadata:
name: windows-runasusername
spec:
nodeSelector:
kubernetes.io/os: windows
securityContext:
windowsOptions:
runAsUserName: "ContainerUser"
containers:
- name: windows-container
image: mcr.microsoft.com/windows/servercore:ltsc2019
command:
- powershell.exe
- -Command
- |
whoami
while ($true) { Start-Sleep -Seconds 10 }그룹 관리 서비스 계정(gMSA)
Windows 컨테이너에서 Active Directory 인증을 위한 gMSA 구성:
- Active Directory에 gMSA 생성:
# gMSA 생성
New-ADServiceAccount -Name WebApp1 -DNSHostName WebApp1.contoso.com -ServicePrincipalNames http/WebApp1.contoso.com -PrincipalsAllowedToRetrieveManagedPassword "Domain Controllers", "Domain Computers"- Kubernetes에 gMSA 자격 증명 저장:
apiVersion: v1
kind: Secret
metadata:
name: gmsa-cred-spec
type: microsoft.com/gmsa-credential-spec
data:
credspec.json: <base64-encoded-credential-spec>- 포드에 gMSA 구성 적용:
apiVersion: v1
kind: Pod
metadata:
name: windows-gmsa
spec:
nodeSelector:
kubernetes.io/os: windows
securityContext:
windowsOptions:
gmsaCredentialSpecName: gmsa-cred-spec
containers:
- name: windows-container
image: mcr.microsoft.com/windows/servercore:ltsc2019
command:
- powershell.exe
- -Command
- |
whoami
while ($true) { Start-Sleep -Seconds 10 }Amazon EKS에서의 Windows 지원
Amazon EKS에서 Windows 워크로드를 실행하는 방법을 알아보겠습니다.
다음 다이어그램은 Amazon EKS에서의 Windows 지원 아키텍처를 보여줍니다:
EKS에서 Windows 지원 활성화
Amazon EKS에서 Windows 지원을 활성화하는 단계:
- VPC CNI 플러그인 업데이트:
kubectl apply -f https://raw.githubusercontent.com/aws/amazon-vpc-cni-k8s/release-1.11/config/master/vpc-resource-controller.yaml- Windows VPC 어드미션 웹훅 설치:
kubectl apply -f https://raw.githubusercontent.com/aws/amazon-vpc-cni-k8s/release-1.11/config/master/vpc-admission-webhook.yamlWindows 노드 그룹 생성
eksctl을 사용하여 Windows 노드 그룹 생성:
eksctl create nodegroup \
--cluster my-cluster \
--region us-west-2 \
--name windows-ng \
--node-type t3.large \
--nodes 2 \
--nodes-min 1 \
--nodes-max 4 \
--managed \
--node-ami-family WindowsServer2019FullContainerAWS Management Console을 사용하여 Windows 노드 그룹 생성:
- EKS 콘솔에서 클러스터 선택
- "컴퓨팅" 탭 선택
- "노드 그룹 추가" 클릭
- 노드 그룹 세부 정보 입력
- AMI 유형으로 "Windows" 선택
- 나머지 설정 구성 및 생성
EKS에서 Windows 애플리케이션 배포
EKS에서 Windows 애플리케이션 배포 예시:
apiVersion: apps/v1
kind: Deployment
metadata:
name: windows-server-iis
spec:
selector:
matchLabels:
app: windows-server-iis
tier: backend
track: stable
replicas: 2
template:
metadata:
labels:
app: windows-server-iis
tier: backend
track: stable
spec:
nodeSelector:
kubernetes.io/os: windows
containers:
- name: windows-server-iis
image: mcr.microsoft.com/windows/servercore/iis:windowsservercore-ltsc2019
ports:
- name: http
containerPort: 80
resources:
limits:
cpu: 1
memory: 800Mi
requests:
cpu: .1
memory: 300Mi
---
apiVersion: v1
kind: Service
metadata:
name: windows-server-iis-service
labels:
app: windows-server-iis
spec:
ports:
- port: 80
protocol: TCP
selector:
app: windows-server-iis
type: LoadBalancerEKS에서 Windows 컨테이너 로깅
CloudWatch Logs를 사용하여 Windows 컨테이너 로그 수집:
apiVersion: v1
kind: ConfigMap
metadata:
name: fluent-bit-config
namespace: amazon-cloudwatch
data:
fluent-bit.conf: |
[SERVICE]
Flush 5
Log_Level info
Daemon off
[INPUT]
Name tail
Tag kube.*
Path /var/log/containers/*.log
Parser docker
DB /var/fluent-bit/state/flb_container.db
Mem_Buf_Limit 50MB
[FILTER]
Name kubernetes
Match kube.*
Kube_URL https://kubernetes.default.svc:443
Merge_Log On
[OUTPUT]
Name cloudwatch_logs
Match kube.*
region us-west-2
log_group_name /aws/eks/my-cluster/windows-logs
log_stream_prefix windows-
auto_create_group true모범 사례
Kubernetes에서 Windows 워크로드를 실행하기 위한 모범 사례를 알아보겠습니다.
클러스터 설계 모범 사례
- 혼합 노드 풀: Linux 노드와 Windows 노드를 적절히 혼합하여 사용
- 노드 레이블 및 테인트: 적절한 노드 레이블 및 테인트를 사용하여 워크로드 분리
- 버전 호환성: Kubernetes 버전과 Windows 버전 간의 호환성 확인
- 네트워크 플러그인 선택: Windows를 지원하는 적절한 네트워크 플러그인 선택
- 고가용성: 중요한 워크로드에 대한 고가용성 구성
애플리케이션 설계 모범 사례
- 컨테이너 이미지 최적화: 작고 효율적인 컨테이너 이미지 사용
- 리소스 요청 및 제한: 적절한 리소스 요청 및 제한 설정
- 상태 비저장 설계: 가능한 상태 비저장 애플리케이션 설계
- 로깅 및 모니터링: 효과적인 로깅 및 모니터링 구성
- 보안 강화: 적절한 보안 컨텍스트 및 네트워크 정책 적용
운영 모범 사례
- 정기적인 업데이트: Windows 노드 및 컨테이너 이미지 정기적 업데이트
- 자동화: 배포 및 관리 작업 자동화
- 백업 및 복구: 중요한 데이터 정기적 백업
- 문제 해결 도구: 적절한 문제 해결 도구 및 프로세스 구축
- 문서화: 구성 및 절차 문서화
EKS 특화 모범 사례
- 관리형 노드 그룹: 가능한 경우 관리형 노드 그룹 사용
- IAM 역할 서비스 계정(IRSA): 포드별 IAM 권한 관리
- VPC CNI 구성: 네트워킹 요구 사항에 맞게 VPC CNI 구성
- 보안 그룹: 적절한 보안 그룹 구성
- 비용 최적화: 적절한 인스턴스 유형 및 크기 선택
결론
Kubernetes에서 Windows 지원은 계속 발전하고 있으며, 이제 프로덕션 환경에서 Windows 워크로드를 실행할 수 있습니다. Windows 노드는 Linux 노드와 함께 동일한 클러스터에서 실행될 수 있으며, 이를 통해 다양한 워크로드를 단일 Kubernetes 클러스터에서 관리할 수 있습니다.
Windows 컨테이너는 .NET Framework 애플리케이션, Windows 서비스, 기타 Windows 전용 워크로드를 컨테이너화하여 Kubernetes의 오케스트레이션 기능을 활용할 수 있게 해줍니다. 그러나 Linux 컨테이너와 비교하여 일부 제한 사항이 있으므로, 이러한 제한 사항을 이해하고 적절히 대응하는 것이 중요합니다.
Amazon EKS는 Windows 노드에 대한 관리형 서비스를 제공하여 Windows 워크로드를 쉽게 배포하고 관리할 수 있게 해줍니다. EKS의 Windows 지원을 활용하면 Windows 애플리케이션을 현대적인 컨테이너 환경으로 마이그레이션하는 과정을 간소화할 수 있습니다.
Windows in Kubernetes를 성공적으로 구현하려면 적절한 계획, 설계, 운영 모범 사례를 따르는 것이 중요합니다. 이를 통해 Windows 및 Linux 워크로드를 효율적으로 관리하고 Kubernetes의 모든 이점을 활용할 수 있습니다.
퀴즈
이 장에서 배운 내용을 테스트하려면 Windows in Kubernetes 퀴즈를 풀어보세요.