시간은 없고 내용은 많으니 TL;DR 하겠습니다 

 

결론
1. 윈도우즈 노드가 추가되는 시점부터 특정 서비스 사용이 강제된다
   -> 기존 환경과 다를경우 다시 서비스를 구성해야 할수도 있다 
2. 윈도우즈 노드의 k8s 업데이트는 현재 방법이 없다. K8s 업데이트시 다시 설치해야한다. 
3. 윈도우즈 컨테이너를 빌딩할 때 현재 사용중인 노드의 빌드와 맞게 구성해야하므로 윈도우즈 업데이트에 제약이 생긴다

 

제가 설치 및 자료 찾아보면서 느낀 결과이니 반박 시 님들말이 맞습니다ㅎㅎ

 

*2024년 2월 부로 윈도우즈 서버 노드 추가시 제약사항

* 윈도우즈 서버로 컨트롤플레인 구성 불가
* 윈도우 특정 버전만 지원(2019, 2022)
* 윈도우 컨테이너가 리눅스 컨테이너와 함께 동작하지 않음
* 윈도우에서 볼륨 마운트 옵션을 지원하지 않음
* 윈도우에서는 호스트 네트워크 모드를 지원하지 않음

 

사전 체크 사항 
* 유휴 윈도우즈 서버 버전 체크
  - 윈도우즈 서버 버전 체크 (2019, 2022만 가능)
* Host OS 버전이 배포할 Container OS 버전과 일치해야 한다
(예를들어 Node가 2019.17763이면 안의 컨테이너도 2019.17763버전 이어야한다)
* 윈도우즈 업데이트 설치 확인
  - 2019 Server기준 **KB4489899 업데이트 이후 버전이 설치되어있으면 됨.**
* Calico의 Overlay모드를 사용할때 IPIP모드는 지원하지 않는다. 따라서 VXLAN모드로 변경하여 사용해야 한다

 

  윈도우 리눅스
컨테이너 런타임 여러 런타임 지원 ContainerD
리소스 Isolation Cgroups 프로세스 및 Namespace Isolation
Network 기존 네트워크 사용 Host Networking Service(HNS)사용
컨테이너 가벼운용량, 쉬운 컨테이너 개발 무거운 용량, 상대적으로 어려운 컨테이너개발
네트워크 여러 Networking Plugin 사용가능  Calico 혹은 Flannel

 

클러스터 사전작업

    1. 윈도우즈 업데이트 확인

    2. Master Node 에서 CalicoCTL 설치 

        1. curl -O -L https://github.com/projectcalico/calicoctl/releases/download/v3.17.1/calicoctl
        2. chmod +x calicoctl
        3. sudo mv calicoctl /usr/local/bin

    3. IPIP를 VXLAN모드로 변경

calicoctl get ippool default-ipv4-ippool -o wide
calicoctl get ippool default-ipv4-ippool -o yaml | sed -e "s/ipipMode: Always/ipipMode: Never/" | calicoctl apply -f -
calicoctl get ippool default-ipv4-ippool -o yaml | sed -e "s/vxlanMode: Never/vxlanMode: Always/" | calicoctl apply -f -
calicoctl get ippool default-ipv4-ippool -o wide

    4. IPAM 옵션 수정

calicoctl ipam configure --strictaffinity=true

 

    5. 디렉토리 생성 및 Config 복사

       

(윈도우즈 서버에서) mkdir c:\k
(윈도우즈 powershell에서) scp root@[마스터서버]:~/.kube/config c:\k\

참고로 만약 권한 없음으로 scp 가 되지 않을경우 config파일을 일반 유저 권한으로 변경 후 scp 를 실행한다 

 

 

인터넷망에서 윈도우즈 서버 노드 추가방법 - 본 작업

 

모든 작업은 추가하고자 하는 윈도우즈 서버에서 작업한다 

 

    1. ContainerD 설치

Invoke-WebRequest -UseBasicParsing "https://raw.githubusercontent.com/microsoft/Windows-Containers/Main/helpful_tools/Install-ContainerdRuntime/install-containerd-runtime.ps1" -o install-containerd-runtime.ps1

.\install-containerd-runtime.ps1

 

    2. Calico Component 설치 및 구동

Invoke-WebRequest -Uri https://github.com/projectcalico/calico/releases/download/v3.27.0/install-calico-windows.ps1 -OutFile c:\k\install-calico-windows.ps1

    (*Calico 버전은 수정될 수 있다)

c:\k\install-calico-windows.ps1 -ReleaseBaseURL "https://github.com/projectcalico/calico/releases/download/v3.27.0" -ReleaseFile "calico-windows-v3.27.0.zip" -KubeVersion "1.28.2" -DownloadOnly "yes" -ServiceCidr "10.96.0.0/12" -DNSServerIPs "10.96.0.10"

 

    (*Calico 버전은 수정될 수 있다.)

    (* KubeVersion은 현재 클러스터에 설치된 K8s 버전이다)

    (* ServiceCidr과 DNSServerIPs는 클러스터의 Master서버에서 kubectl cluster-info dump > dump.log 명령어 실행후                   dump.log파일을 확인하여 찾을 수 있다 )

 

    환경변수 설정

$ENV:CNI_BIN_DIR="c:\program files\containerd\cni\bin" 
$ENV:CNI_CONF_DIR="c:\program files\containerd\cni\conf" 
c:\calicowindows\install-calico.ps1
c:\calicowindows\start-calico.ps1

 

    Service 실행

Start-Service CalicoFelix
Start-Service CalicoNode
Get-Service CalicoFelix
Get-Service CalicoNode

-> 각각 Running 상태이면 된다

 

    3. 쿠버네티스 컴포넌트 설치 및 구동

c:\calicowindows\kubernetes\install-kube-services.ps1

Start-Service kubelet 
Start-Service kube-proxy
Get-Service Kubelet
Get-Service kube-proxy

-> 각각 Running 상태이면 된다

New-NetFirewallRule -Name 'Kubelet-In-TCP' -DisplayName 'Kubelet (node)' -Enabled True -Direction Inbound -Protocol TCP -Action Allow -LocalPort 10250
(* 위 명령어는 방화벽이 막혀있을때 사용하면 된다)

 

설치는 간단하게 이것으로 끝이다.  실제로 Pod까지 띄울수 있는지 확인해 보자 

 

다음과 YAML을 작성 후 마스터노드에서 실행해보자 

---
apiVersion: v1
kind: Service
metadata:
  name: win-webserver
  labels:
    app: win-webserver
spec:
  ports:
    # the port that this service should serve on
    - 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

 

사진으로 찍진 못했지만 윈도우즈 노드로 Pod이 배치되었을 것이다. 

'Docker & K8s' 카테고리의 다른 글

Windows 2019 폐쇄망 K8s(Kubernetes) 노드 추가 방법  (0) 2024.02.13
ubuntu 20.04 K8s 설치 노트  (0) 2024.01.08

+ Recent posts