시간은 없고 내용은 많으니 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 |