Information in this document may be out of date

This document has an older update date than the original, so the information it contains may be out of date. If you're able to read English, see the English version for the most up-to-date information: Guide for Running Windows Containers in Kubernetes

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์—์„œ ์œˆ๋„์šฐ ์ปจํ…Œ์ด๋„ˆ ์Šค์ผ€์ค„๋ง์„ ์œ„ํ•œ ๊ฐ€์ด๋“œ

๋งŽ์€ ์กฐ์ง์—์„œ ์‹คํ–‰ํ•˜๋Š” ์„œ๋น„์Šค์™€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ƒ๋‹น ๋ถ€๋ถ„์ด ์œˆ๋„์šฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์œผ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค. ์ด ๊ฐ€์ด๋“œ๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์—์„œ ์œˆ๋„์šฐ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๊ตฌ์„ฑํ•˜๊ณ  ๋ฐฐํฌํ•˜๋Š” ๋‹จ๊ณ„๋ฅผ ์•ˆ๋‚ดํ•œ๋‹ค.

๋ชฉํ‘œ

  • ์œˆ๋„์šฐ ๋…ธ๋“œ์—์„œ ์œˆ๋„์šฐ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ์˜ˆ์‹œ ๋””ํ”Œ๋กœ์ด๋จผํŠธ๋ฅผ ๊ตฌ์„ฑํ•œ๋‹ค.
  • ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์˜ ์œˆ๋„์šฐ ๊ด€๋ จ ๊ธฐ๋Šฅ์„ ๊ฐ•์กฐํ•œ๋‹ค.

์‹œ์ž‘ํ•˜๊ธฐ ์ „์—

  • ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ๊ณผ ์œˆ๋„์šฐ ์„œ๋ฒ„๋กœ ์šด์˜๋˜๋Š” ์›Œ์ปค ๋…ธ๋“œ๋ฅผ ํฌํ•จํ•˜๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
  • ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์—์„œ ์„œ๋น„์Šค์™€ ์›Œํฌ๋กœ๋“œ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๋ฐฐํฌํ•˜๋Š” ๊ฒƒ์€ ๋ฆฌ๋ˆ…์Šค๋‚˜ ์œˆ๋„์šฐ ์ปจํ…Œ์ด๋„ˆ ๋ชจ๋‘ ๋น„์Šทํ•œ ๋ฐฉ์‹์ด๋ผ๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค. kubectl ์ปค๋งจ๋“œ๋กœ ํด๋Ÿฌ์Šคํ„ฐ์— ์ ‘์†ํ•˜๋Š” ๊ฒƒ์€ ๋™์ผํ•˜๋‹ค. ์•„๋ž˜ ๋‹จ์›์˜ ์˜ˆ์‹œ๋ฅผ ํ†ตํ•ด ์œˆ๋„์šฐ ์ปจํ…Œ์ด๋„ˆ์™€ ์ข€ ๋” ๋นจ๋ฆฌ ์นœ์ˆ™ํ•ด์งˆ ์ˆ˜ ์žˆ๋‹ค.

์‹œ์ž‘ํ•˜๊ธฐ: ์œˆ๋„์šฐ ์ปจํ…Œ์ด๋„ˆ ๋ฐฐํฌํ•˜๊ธฐ

์•„๋ž˜ ์˜ˆ์‹œ YAML ํŒŒ์ผ์€ ์œˆ๋„์šฐ ์ปจํ…Œ์ด๋„ˆ ์•ˆ์—์„œ ์‹คํ–‰๋˜๋Š” ๊ฐ„๋‹จํ•œ ์›น์„œ๋ฒ„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฐฐํฌํ•œ๋‹ค.

์•„๋ž˜ ๋‚ด์šฉ์œผ๋กœ ์ฑ„์šด ์„œ๋น„์Šค ์ŠคํŽ™์„ win-webserver.yaml์ด๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ์ƒ์„ฑํ•œ๋‹ค.

apiVersion: v1
kind: Service
metadata:
  name: win-webserver
  labels:
    app: win-webserver
spec:
  ports:
    # ์ด ์„œ๋น„์Šค๊ฐ€ ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•  ํฌํŠธ
    - port: 80
      targetPort: 80
  selector:
    app: win-webserver
  type: NodePort
---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: win-webserver
  name: win-webserver
spec:
  replicas: 2
  selector:
    matchLabels:
      app: win-webserver
  template:
    metadata:
      labels:
        app: win-webserver
      name: win-webserver
    spec:
     containers:
      - name: windowswebserver
        image: mcr.microsoft.com/windows/servercore:ltsc2019
        command:
        - powershell.exe
        - -command
        - "<#code used from https://gist.github.com/19WAS85/5424431#> ; $$listener = New-Object System.Net.HttpListener ; $$listener.Prefixes.Add('http://*:80/') ; $$listener.Start() ; $$callerCounts = @{} ; Write-Host('Listening at http://*:80/') ; while ($$listener.IsListening) { ;$$context = $$listener.GetContext() ;$$requestUrl = $$context.Request.Url ;$$clientIP = $$context.Request.RemoteEndPoint.Address ;$$response = $$context.Response ;Write-Host '' ;Write-Host('> {0}' -f $$requestUrl) ;  ;$$count = 1 ;$$k=$$callerCounts.Get_Item($$clientIP) ;if ($$k -ne $$null) { $$count += $$k } ;$$callerCounts.Set_Item($$clientIP, $$count) ;$$ip=(Get-NetAdapter | Get-NetIpAddress); $$header='<html><body><H1>Windows Container Web Server</H1>' ;$$callerCountsString='' ;$$callerCounts.Keys | % { $$callerCountsString+='<p>IP {0} callerCount {1} ' -f $$ip[1].IPAddress,$$callerCounts.Item($$_) } ;$$footer='</body></html>' ;$$content='{0}{1}{2}' -f $$header,$$callerCountsString,$$footer ;Write-Output $$content ;$$buffer = [System.Text.Encoding]::UTF8.GetBytes($$content) ;$$response.ContentLength64 = $$buffer.Length ;$$response.OutputStream.Write($$buffer, 0, $$buffer.Length) ;$$response.Close() ;$$responseStatus = $$response.StatusCode ;Write-Host('< {0}' -f $$responseStatus)  } ; "
     nodeSelector:
      kubernetes.io/os: windows
  1. ๋ชจ๋“  ๋…ธ๋“œ๊ฐ€ ๊ฑด๊ฐ•ํ•œ์ง€ ํ™•์ธํ•œ๋‹ค.

    kubectl get nodes
    
  2. ์„œ๋น„์Šค๋ฅผ ๋ฐฐํฌํ•˜๊ณ  ํŒŒ๋“œ ๊ฐฑ์‹ ์„ ์ง€์ผœ๋ณด์ž.

    kubectl apply -f win-webserver.yaml
    kubectl get pods -o wide -w
    

    ์ด ์„œ๋น„์Šค๊ฐ€ ์ •ํ™•ํžˆ ๋ฐฐํฌ๋˜๋ฉด ๋ชจ๋“  ํŒŒ๋“œ๋Š” Ready๋กœ ํ‘œ๊ธฐ๋œ๋‹ค. ์ง€์ผœ๋ณด๊ธฐ๋ฅผ ์ค‘๋‹จํ•˜๋ ค๋ฉด, Ctrl+C ๋ฅผ ๋ˆ„๋ฅด์ž.

  3. ์ด ๋””ํ”Œ๋กœ์ด๋จผํŠธ๊ฐ€ ์„ฑ๊ณต์ ์ธ์ง€ ํ™•์ธํ•œ๋‹ค. ๋‹ค์Œ์„ ๊ฒ€ํ† ํ•˜์ž.

    • ๋ฆฌ๋ˆ…์Šค ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ ๋…ธ๋“œ์—์„œ ๋‚˜์—ด๋œ ๋‘ ํŒŒ๋“œ๊ฐ€ ์กด์žฌํ•˜๋Š”์ง€ ํ™•์ธํ•˜๋ ค๋ฉด, kubectl get pods๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
    • ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•œ ๋…ธ๋“œ์—์„œ ํŒŒ๋“œ๋กœ์˜ ํ†ต์‹ ์ด ๋˜๋Š”์ง€ ํ™•์ธํ•˜๋ ค๋ฉด, ๋ฆฌ๋ˆ…์Šค ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ ๋…ธ๋“œ์—์„œ curl์„ ํŒŒ๋“œ IP ์ฃผ์†Œ์˜ 80 ํฌํŠธ๋กœ ์‹คํ–‰ํ•˜์—ฌ ์›น ์„œ๋ฒ„ ์‘๋‹ต์„ ํ™•์ธํ•œ๋‹ค.
    • ํŒŒ๋“œ ๊ฐ„ ํ†ต์‹ ์ด ๋˜๋Š”์ง€ ํ™•์ธํ•˜๋ ค๋ฉด, docker exec ๋‚˜ kubectl exec๋ฅผ ์ด์šฉํ•ด ํŒŒ๋“œ ๊ฐ„์— ํ•‘(ping)ํ•œ๋‹ค(์œˆ๋„์šฐ ๋…ธ๋“œ๊ฐ€ 2๋Œ€ ์ด์ƒ์ด๋ผ๋ฉด, ์„œ๋กœ ๋‹ค๋ฅธ ๋…ธ๋“œ์— ์žˆ๋Š” ํŒŒ๋“œ ๊ฐ„ ํ†ต์‹ ๋„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค).
    • ์„œ๋น„์Šค์—์„œ ํŒŒ๋“œ๋กœ์˜ ํ†ต์‹ ์ด ๋˜๋Š”์ง€ ํ™•์ธํ•˜๋ ค๋ฉด, ๋ฆฌ๋ˆ…์Šค ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ ๋…ธ๋“œ์™€ ๋…๋ฆฝ ํŒŒ๋“œ์—์„œ curl์„ ๊ฐ€์ƒ ์„œ๋น„์Šค IP ์ฃผ์†Œ(kubectl get services๋กœ ๋ณผ ์ˆ˜ ์žˆ๋Š”)๋กœ ์‹คํ–‰ํ•œ๋‹ค.
    • ์„œ๋น„์Šค ๊ฒ€์ƒ‰(discovery)์ด ๋˜๋Š”์ง€ ํ™•์ธํ•˜๋ ค๋ฉด, ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๊ธฐ๋ณธ DNS ์ ‘๋ฏธ์‚ฌ์™€ ์„œ๋น„์Šค ์ด๋ฆ„์œผ๋กœ curl์„ ์‹คํ–‰ํ•œ๋‹ค.
    • ์ธ๋ฐ”์šด๋“œ ์—ฐ๊ฒฐ์ด ๋˜๋Š”์ง€ ํ™•์ธํ•˜๋ ค๋ฉด, ํด๋Ÿฌ์Šคํ„ฐ ์™ธ๋ถ€ ์žฅ๋น„๋‚˜ ๋ฆฌ๋ˆ…์Šค ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ ๋…ธ๋“œ์—์„œ NodePort๋กœ curl์„ ์‹คํ–‰ํ•œ๋‹ค.
    • ์•„์›ƒ๋ฐ”์šด๋“œ ์—ฐ๊ฒฐ์ด ๋˜๋Š”์ง€ ํ™•์ธํ•˜๋ ค๋ฉด, kubectl exec๋ฅผ ์ด์šฉํ•ด์„œ ํŒŒ๋“œ์—์„œ ์™ธ๋ถ€ IP ์ฃผ์†Œ๋กœ curl์„ ์‹คํ–‰ํ•œ๋‹ค.

๊ฐ€์‹œ์„ฑ

์›Œํฌ๋กœ๋“œ์—์„œ ๋กœ๊ทธ ์บก์ณํ•˜๊ธฐ

๋กœ๊ทธ๋Š” ๊ฐ€์‹œ์„ฑ์˜ ์ค‘์š”ํ•œ ์š”์†Œ์ด๋‹ค. ๋กœ๊ทธ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์›Œํฌ๋กœ๋“œ์˜ ์šด์˜์ธก๋ฉด์„ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋ฉฐ ๋ฌธ์ œ ํ•ด๊ฒฐ์˜ ํ•ต์‹ฌ ์š”์†Œ์ด๋‹ค. ์œˆ๋„์šฐ ์ปจํ…Œ์ด๋„ˆ, ๊ทธ๋ฆฌ๊ณ  ์œˆ๋„์šฐ ์ปจํ…Œ์ด๋„ˆ ๋‚ด์˜ ์›Œํฌ๋กœ๋“œ๋Š” ๋ฆฌ๋ˆ…์Šค ์ปจํ…Œ์ด๋„ˆ์™€๋Š” ๋‹ค๋ฅด๊ฒŒ ๋™์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ๋ฅผ ์ˆ˜์ง‘ํ•˜๊ธฐ ์–ด๋ ค์› ๊ณ  ์ด๋กœ ์ธํ•ด ์šด์˜ ๊ฐ€์‹œ์„ฑ์ด ์ œํ•œ๋˜์–ด ์™”๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์œˆ๋„์šฐ ์›Œํฌ๋กœ๋“œ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ETW(Event Tracing for Windows)์— ๋กœ๊ทธ์ธํ•˜๊ฑฐ๋‚˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ด๋ฒคํŠธ ๋กœ๊ทธ์— ํ•ญ๋ชฉ์„ ํ‘ธ์‹œํ•˜๋„๋ก ๊ตฌ์„ฑํ•œ๋‹ค. Microsoft์˜ ์˜คํ”ˆ ์†Œ์Šค ๋„๊ตฌ์ธ LogMonitor๋Š” ์œˆ๋„์šฐ ์ปจํ…Œ์ด๋„ˆ ์•ˆ์— ๊ตฌ์„ฑ๋œ ๋กœ๊ทธ ์†Œ์Šค๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๋Š” ๊ถŒ์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. LogMonitor๋Š” ์ด๋ฒคํŠธ ๋กœ๊ทธ, ETW ๊ณต๊ธ‰์ž ๊ทธ๋ฆฌ๊ณ  ์‚ฌ์šฉ์ž ์ •์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋กœ๊ทธ ๋ชจ๋‹ˆํ„ฐ๋ง์„ ์ง€์›ํ•˜๊ณ  kubectl logs <pod> ์— ์˜ํ•œ ์‚ฌ์šฉ์„ ์œ„ํ•ด STDOUT์œผ๋กœ ํŒŒ์ดํ”„ํ•œ๋‹ค.

LogMonitor GitHub ํŽ˜์ด์ง€์˜ ์ง€์นจ์— ๋”ฐ๋ผ ๋ชจ๋“  ์ปจํ…Œ์ด๋„ˆ ๋ฐ”์ด๋„ˆ๋ฆฌ์™€ ์„ค์ • ํŒŒ์ผ์„ ๋ณต์‚ฌํ•˜๊ณ , LogMonitor๊ฐ€ ๋กœ๊ทธ๋ฅผ STDOUT์œผ๋กœ ํ‘ธ์‹œํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•„์š”ํ•œ ์—”ํŠธ๋ฆฌํฌ์ธํŠธ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.

์ปจํ…Œ์ด๋„ˆ ์‚ฌ์šฉ์ž ๊ตฌ์„ฑํ•˜๊ธฐ

์„ค์ • ๊ฐ€๋Šฅํ•œ ์ปจํ…Œ์ด๋„ˆ username ์‚ฌ์šฉํ•˜๊ธฐ

์œˆ๋„์šฐ ์ปจํ…Œ์ด๋„ˆ๋Š” ์ด๋ฏธ์ง€ ๊ธฐ๋ณธ๊ฐ’๊ณผ๋Š” ๋‹ค๋ฅธ username์œผ๋กœ ์—”ํŠธ๋ฆฌํฌ์ธํŠธ์™€ ํ”„๋กœ์„ธ์Šค๋ฅผ ์‹คํ–‰ํ•˜๋„๋ก ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ ์ด์— ๋Œ€ํ•ด ์ถ”๊ฐ€์ ์œผ๋กœ ๋ฐฐ์šธ ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋ฃน ๋งค๋‹ˆ์ง€๋“œ ์„œ๋น„์Šค ์–ด์นด์šดํŠธ๋ฅผ ์ด์šฉํ•˜์—ฌ ์›Œํฌ๋กœ๋“œ ์‹ ์› ๊ด€๋ฆฌํ•˜๊ธฐ

์œˆ๋„์šฐ ์ปจํ…Œ์ด๋„ˆ ์›Œํฌ๋กœ๋“œ๋Š” ๊ทธ๋ฃน ๋งค๋‹ˆ์ง€๋“œ ์„œ๋น„์Šค ์–ด์นด์šดํŠธ(GMSA, Group Managed Service Account)๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ฃน ๋งค๋‹ˆ์ง€๋“œ ์„œ๋น„์Šค ์–ด์นด์šดํŠธ๋Š” ์•กํ‹ฐ๋ธŒ ๋””๋ ‰ํ„ฐ๋ฆฌ ์–ด์นด์šดํŠธ์˜ ํŠน์ •ํ•œ ์ข…๋ฅ˜๋กœ ์ž๋™ ์•”ํ˜ธ ๊ด€๋ฆฌ ๊ธฐ๋Šฅ, ๋‹จ์ˆœํ™”๋œ ์„œ๋น„์Šค ์ฃผ์ฒด ์ด๋ฆ„(SPN, simplified service principal name), ์—ฌ๋Ÿฌ ์„œ๋ฒ„์˜ ๋‹ค๋ฅธ ๊ด€๋ฆฌ์ž์—๊ฒŒ ๊ด€๋ฆฌ๋ฅผ ์œ„์ž„ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค. GMSA๋กœ ๊ตฌ์„ฑํ•œ ์ปจํ…Œ์ด๋„ˆ๋Š” GMSA๋กœ ๊ตฌ์„ฑ๋œ ์‹ ์›์„ ๋“ค๊ณ  ์žˆ๋Š” ๋™์•ˆ ์™ธ๋ถ€ ์•กํ‹ฐ๋ธŒ ๋””๋ ‰ํ„ฐ๋ฆฌ ๋„๋ฉ”์ธ ๋ฆฌ์†Œ์Šค๋ฅผ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค. ์œˆ๋„์šฐ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์œ„ํ•œ GMSA๋ฅผ ์ด์šฉํ•˜๊ณ  ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์—ฌ๊ธฐ์—์„œ ์•Œ์•„๋ณด์ž.

ํ…Œ์ธํŠธ(Taint)์™€ ํ†จ๋Ÿฌ๋ ˆ์ด์…˜(Toleration)

์‚ฌ์šฉ์ž๋Š” ๋ฆฌ๋ˆ…์Šค์™€ ์œˆ๋„์šฐ ์›Œํฌ๋กœ๋“œ๋ฅผ (๋™์ผํ•œ OS๋ฅผ ์‹คํ–‰ํ•˜๋Š”) ์ ์ ˆํ•œ ๋…ธ๋“œ์— ์Šค์ผ€์ค„๋ง๋˜๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด ํ…Œ์ธํŠธ์™€ ๋…ธ๋“œ์…€๋ ‰ํ„ฐ(nodeSelector)์˜ ์กฐํ•ฉ์„ ์ด์šฉํ•ด์•ผ ํ•œ๋‹ค. ์•„๋ž˜๋Š” ๊ถŒ์žฅ๋˜๋Š” ๋ฐฉ์‹์˜ ๊ฐœ์š”์ธ๋ฐ, ์ด๊ฒƒ์˜ ์ฃผ์š” ๋ชฉํ‘œ ์ค‘์— ํ•˜๋‚˜๋Š” ์ด ๋ฐฉ์‹์ด ๊ธฐ์กด ๋ฆฌ๋ˆ…์Šค ์›Œํฌ๋กœ๋“œ์™€ ํ˜ธํ™˜๋˜์–ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

1.25๋ถ€ํ„ฐ, ํŒŒ๋“œ์˜ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์–ด๋–ค ์šด์˜์ฒด์ œ ์šฉ์ธ์ง€๋ฅผ ํŒŒ๋“œ์˜ .spec.os.name์— ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค(๊ทธ๋ฆฌ๊ณ  ์„ค์ •ํ•ด์•ผ ํ•œ๋‹ค). ๋ฆฌ๋ˆ…์Šค ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ํŒŒ๋“œ์—๋Š” .spec.os.name์„ linux๋กœ ์„ค์ •ํ•œ๋‹ค. ์œˆ๋„์šฐ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ํŒŒ๋“œ์—๋Š” .spec.os.name์„ windows๋กœ ์„ค์ •ํ•œ๋‹ค.

์Šค์ผ€์ค„๋Ÿฌ๋Š” ํŒŒ๋“œ๋ฅผ ๋…ธ๋“œ์— ํ• ๋‹นํ•  ๋•Œ .spec.os.name ํ•„๋“œ์˜ ๊ฐ’์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ์ด ํŒŒ๋“œ๋ฅผ ์ ์ ˆํ•œ ์šด์˜ ์ฒด์ œ๊ฐ€ ์‹คํ–‰๋˜๊ณ  ์žˆ๋Š” ๋…ธ๋“œ์— ๋ฐฐ์น˜ํ•˜๋„๋ก ํ•˜๋ ค๋ฉด, ํŒŒ๋“œ๋ฅผ ๋…ธ๋“œ์— ํ• ๋‹นํ•˜๋Š” ์ผ๋ฐ˜์ ์ธ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋ฉ”์นด๋‹ˆ์ฆ˜์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

.spec.os.name ํ•„๋“œ๋Š” ์œˆ๋„์šฐ ํŒŒ๋“œ์˜ ์Šค์ผ€์ค„๋ง์—๋Š” ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—, ์œˆ๋„์šฐ ํŒŒ๋“œ๊ฐ€ ์ ์ ˆํ•œ ์œˆ๋„์šฐ ๋…ธ๋“œ์— ํ• ๋‹น๋˜๋„๋ก ํ•˜๋ ค๋ฉด ํ…Œ์ธํŠธ, ํ†จ๋Ÿฌ๋ ˆ์ด์…˜ ๋ฐ ๋…ธ๋“œ ์…€๋ ‰ํ„ฐ๊ฐ€ ์—ฌ์ „ํžˆ ํ•„์š”ํ•˜๋‹ค.

ํŠน์ • OS ์›Œํฌ๋กœ๋“œ๋ฅผ ์ ์ ˆํ•œ ์ปจํ…Œ์ด๋„ˆ ํ˜ธ์ŠคํŠธ์—์„œ ์ฒ˜๋ฆฌํ•˜๋„๋ก ๋ณด์žฅํ•˜๊ธฐ

์‚ฌ์šฉ์ž๋Š” ํ…Œ์ธํŠธ์™€ ํ†จ๋Ÿฌ๋ ˆ์ด์…˜์„ ์ด์šฉํ•˜์—ฌ ์œˆ๋„์šฐ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ ์ ˆํ•œ ํ˜ธ์ŠคํŠธ์—์„œ ์Šค์ผ€์ค„๋ง๋˜๊ธฐ๋ฅผ ๋ณด์žฅํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ค๋Š˜๋‚  ๋ชจ๋“  ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋…ธ๋“œ๋Š” ๋‹ค์Œ ๊ธฐ๋ณธ ๋ ˆ์ด๋ธ”์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

  • kubernetes.io/os = [windows|linux]
  • kubernetes.io/arch = [amd64|arm64|...]

ํŒŒ๋“œ ์‚ฌ์–‘์— ๋…ธ๋“œ ์…€๋ ‰ํ„ฐ๋ฅผ "kubernetes.io/os": windows์™€ ๊ฐ™์ด ์ง€์ •ํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด, ๊ทธ ํŒŒ๋“œ๋Š” ๋ฆฌ๋ˆ…์Šค๋‚˜ ์œˆ๋„์šฐ, ์•„๋ฌด ํ˜ธ์ŠคํŠธ์—๋‚˜ ์Šค์ผ€์ค„๋ง๋  ์ˆ˜ ์žˆ๋‹ค. ์œˆ๋„์šฐ ์ปจํ…Œ์ด๋„ˆ๋Š” ์œˆ๋„์šฐ์—์„œ๋งŒ ์šด์˜๋  ์ˆ˜ ์žˆ๊ณ  ๋ฆฌ๋ˆ…์Šค ์ปจํ…Œ์ด๋„ˆ๋Š” ๋ฆฌ๋ˆ…์Šค์—์„œ๋งŒ ์šด์˜๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Š” ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ๋‹ค. ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์€ ๋…ธ๋“œ ์…€๋ ‰ํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋งŽ์€ ๊ฒฝ์šฐ ์‚ฌ์šฉ์ž๋Š” ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ๋Œ€๋Ÿ‰์˜ ๋ฆฌ๋ˆ…์Šค ์ปจํ…Œ์ด๋„ˆ์šฉ ๋””ํ”Œ๋กœ์ด๋จผํŠธ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์„ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, ํ—ฌ๋ฆ„(Helm) ์ฐจํŠธ ์ปค๋ฎค๋‹ˆํ‹ฐ ๊ฐ™์€ ์ƒ์šฉ ๊ตฌ์„ฑ์˜ ์—์ฝ”์‹œ์Šคํ…œ์ด๋‚˜, ์˜คํผ๋ ˆ์ดํ„ฐ(Operator) ๊ฐ™์€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹์˜ ํŒŒ๋“œ ์ƒ์„ฑ ์‚ฌ๋ก€๊ฐ€ ์žˆ์Œ์„ ์•Œ๊ณ  ์žˆ๋‹ค. ์ด๋Ÿฐ ์ƒํ™ฉ์—์„œ๋Š” ๋…ธ๋“œ ์…€๋ ‰ํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ตฌ์„ฑ ๋ณ€๊ฒฝ์„ ๋ง์„ค์ผ ์ˆ˜ ์žˆ๋‹ค. ์ด์— ๋Œ€ํ•œ ๋Œ€์•ˆ์€ ํ…Œ์ธํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค. Kubelet์€ ๋“ฑ๋กํ•˜๋Š” ๋™์•ˆ ํ…Œ์ธํŠธ๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์œˆ๋„์šฐ์—์„œ๋งŒ ์šด์˜ํ•  ๋•Œ์— ์ž๋™์œผ๋กœ ํ…Œ์ธํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ธฐ ์‰ฝ๋‹ค.

์˜ˆ๋ฅผ ๋“ค๋ฉด, --register-with-taints='os=windows:NoSchedule'

๋ชจ๋“  ์œˆ๋„์šฐ ๋…ธ๋“œ์— ํ…Œ์ธํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ์•„๋ฌด ๊ฒƒ๋„ ๊ฑฐ๊ธฐ์— ์Šค์ผ€์ค„๋งํ•˜์ง€ ์•Š๊ฒŒ ๋  ๊ฒƒ์ด๋‹ค(์กด์žฌํ•˜๋Š” ๋ฆฌ๋ˆ…์Šค ํŒŒ๋“œ๋ฅผ ํฌํ•จํ•˜์—ฌ). ์œˆ๋„์šฐ ํŒŒ๋“œ๊ฐ€ ์œˆ๋„์šฐ ๋…ธ๋“œ์— ์Šค์ผ€์ค„๋ง๋˜๋„๋ก ํ•˜๋ ค๋ฉด, ์œˆ๋„์šฐ ๋…ธ๋“œ๊ฐ€ ์„ ํƒ๋˜๋„๋ก ํ•˜๊ธฐ ์œ„ํ•œ ๋…ธ๋“œ ์…€๋ ‰ํ„ฐ ๋ฐ ์ ํ•ฉํ•˜๊ฒŒ ์ผ์น˜ํ•˜๋Š” ํ†จ๋Ÿฌ๋ ˆ์ด์…˜์ด ๋ชจ๋‘ ํ•„์š”ํ•˜๋‹ค.

nodeSelector:
    kubernetes.io/os: windows
    node.kubernetes.io/windows-build: '10.0.17763'
tolerations:
    - key: "os"
      operator: "Equal"
      value: "windows"
      effect: "NoSchedule"

๋™์ผ ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์—ฌ๋Ÿฌ ์œˆ๋„์šฐ ๋ฒ„์ „์„ ์กฐ์ž‘ํ•˜๋Š” ๋ฐฉ๋ฒ•

ํŒŒ๋“œ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์œˆ๋„์šฐ ์„œ๋ฒ„ ๋ฒ„์ „์€ ๋…ธ๋“œ์˜ ์œˆ๋„์šฐ ์„œ๋ฒ„ ๋ฒ„์ „๊ณผ ์ผ์น˜ํ•ด์•ผ ํ•œ๋‹ค. ๋งŒ์•ฝ ๋™์ผํ•œ ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์—ฌ๋Ÿฌ ์œˆ๋„์šฐ ์„œ๋ฒ„ ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด, ์ถ”๊ฐ€๋กœ ๋…ธ๋“œ ๋ ˆ์ด๋ธ”๊ณผ nodeSelectors๋ฅผ ์„ค์ •ํ•ด์•ผ ํ•œ๋‹ค.

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค 1.17์€ ์ด๊ฒƒ์„ ๋‹จ์ˆœํ™”ํ•˜๊ธฐ ์œ„ํ•ด ์ƒˆ๋กœ์šด ๋ ˆ์ด๋ธ”์ธ node.kubernetes.io/windows-build ๋ฅผ ์ž๋™์œผ๋กœ ์ถ”๊ฐ€ํ•œ๋‹ค. ๋งŒ์•ฝ ์ด์ „ ๋ฒ„์ „์„ ์‹คํ–‰ ์ค‘์ธ ๊ฒฝ์šฐ, ์ด ๋ ˆ์ด๋ธ”์„ ์œˆ๋„์šฐ ๋…ธ๋“œ์— ์ˆ˜๋™์œผ๋กœ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•œ๋‹ค.

์ด ๋ ˆ์ด๋ธ”์€ ํ˜ธํ™˜์„ฑ์„ ์œ„ํ•ด ์ผ์น˜์‹œ์ผœ์•ผ ํ•˜๋Š” ์œˆ๋„์šฐ ๋ฉ”์ด์ €, ๋งˆ์ด๋„ˆ ๋ฐ ๋นŒ๋“œ ๋ฒˆํ˜ธ๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค. ๊ฐ ์œˆ๋„์šฐ ์„œ๋ฒ„ ๋ฒ„์ „์— ๋Œ€ํ•ด ํ˜„์žฌ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ๋นŒ๋“œ ๋ฒˆํ˜ธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

์ œํ’ˆ ์ด๋ฆ„๋นŒ๋“œ ๋ฒˆํ˜ธ
Windows Server 201910.0.17763
Windows Server, ๋ฒ„์ „ 20H210.0.19042
Windows Server 202210.0.20348

RuntimeClass๋กœ ๋‹จ์ˆœํ™”

๋Ÿฐํƒ€์ž„ํด๋ž˜์Šค(RuntimeClass)๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํ…Œ์ธํŠธ(taint)์™€ ํ†จ๋Ÿฌ๋ ˆ์ด์…˜(toleration)์„ ์‚ฌ์šฉํ•˜๋Š” ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ฐ„์†Œํ™” ํ•  ์ˆ˜ ์žˆ๋‹ค. ํด๋Ÿฌ์Šคํ„ฐ ๊ด€๋ฆฌ์ž๋Š” ์ด ํ…Œ์ธํŠธ์™€ ํ†จ๋Ÿฌ๋ ˆ์ด์…˜์„ ์บก์Аํ™”ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” RuntimeClass ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

  1. ์ด ํŒŒ์ผ์„ runtimeClasses.yml ๋กœ ์ €์žฅํ•œ๋‹ค. ์—ฌ๊ธฐ์—๋Š” ์œˆ๋„์šฐ OS, ์•„ํ‚คํ…์ฒ˜ ๋ฐ ๋ฒ„์ „์— ์ ํ•ฉํ•œ nodeSelector ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๋‹ค.
apiVersion: node.k8s.io/v1
kind: RuntimeClass
metadata:
  name: windows-2019
handler: 'docker'
scheduling:
  nodeSelector:
    kubernetes.io/os: 'windows'
    kubernetes.io/arch: 'amd64'
    node.kubernetes.io/windows-build: '10.0.17763'
  tolerations:
  - effect: NoSchedule
    key: os
    operator: Equal
    value: "windows"
  1. ํด๋Ÿฌ์Šคํ„ฐ ๊ด€๋ฆฌ์ž๋กœ kubectl create -f runtimeClasses.yml ๋ฅผ ์‹คํ–‰ํ•ด์„œ ์‚ฌ์šฉํ•œ๋‹ค.
  2. ํŒŒ๋“œ ์‚ฌ์–‘์— ์ ํ•ฉํ•œ runtimeClassName: windows-2019 ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.

์˜ˆ์‹œ:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: iis-2019
  labels:
    app: iis-2019
spec:
  replicas: 1
  template:
    metadata:
      name: iis-2019
      labels:
        app: iis-2019
    spec:
      runtimeClassName: windows-2019
      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
 selector:
    matchLabels:
      app: iis-2019
---
apiVersion: v1
kind: Service
metadata:
  name: iis
spec:
  type: LoadBalancer
  ports:
  - protocol: TCP
    port: 80
  selector:
    app: iis-2019
์ตœ์ข… ์ˆ˜์ • October 04, 2022 at 10:59 PM PST: outdated M42 - M52 (267a904afe)