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

 

결론
1. 실제로 프로덕트 환경에서는 안쓰일거같다 왜냐하면 컨테이너 개발이 상당히 어려울거같기 떄문..

 

반박 시 님들말이 맞습니다. ㅎㅎ 

 

이번에는 폐쇄망 환경에서 윈도우즈 2019 서버를 클러스터에 노드로 추가해보겠습니다. 

 

개념은 온라인 설치와 똑같습니다 

 

CalicoNode와 CalicoFelix 서비스를 설치한 뒤 Kubelet과 Kube-proxy를 설치하면 클러스터에 붙습니다. 

 

대신 폐쇄망이므로 온라인설치에 필요한 모든 파일을 사전에 다운로드 받아 노드로 추가할 윈도우즈 서버에 옮겨야 합니다. 

 

시작해보겠습니다

 

필요 파일 리스트 
* 7zip.msi (압축풀기용으로 필요)

(https://www.7-zip.org/download.html)
* Containers 설치 파일

(https://github.com/containerd/containerd/blob/main/docs/getting-started.md 에서 Windows검색하여 최신버전 받을 수 있음)
* calico-windows(v3.27.0버전 사용)

(https://docs.tigera.io/calico/latest/getting-started/kubernetes/windows-calico/manual-install/standard 에서 최신버전의 Calico 설치 스크립트를 받을 수 있습니다)
* kubernetes-node-windows-amd64(k8s 요소 설치 관련)


* helper.psm1, helper.psm1, hns.psm1(calico install script에서 필요 모듈 파일)

(helperv2 -> https://raw.githubusercontent.com/Microsoft/SDN/master/Kubernetes/windows/helper.v2.psm1

helper -> https://raw.githubusercontent.com/Microsoft/SDN/master/Kubernetes/windows/helper.psm1

hns -> https://github.com/microsoft/SDN/blob/master/Kubernetes/windows/hns.psm1  )

 

* install-calico-windows.ps1(calico install 스크립트)
(https://github.com/projectcalico/calico/blob/master/node/windows-packaging/install-calico-windows.ps1)


* kube config 파일 (calico 설치시 필요)

(마스터의 ~/.kube/config 파일입니다.)

 

위 파일들을 모두 받아 윈도우즈 서버 C:\k 디렉토리로 옮겨둡니다(k 디렉토리가 없으면 생성해줍니다). 

 

사전작업

    1. HNS 서비스 활성화 하기 

Install-WindowsFeature -Name containers
Restart-Computer -Force

위 명령어를 윈도우 powershell에 입력하여 HNS서비스를 활성해 좁니다. 

(인터넷 없어도 실행됩니다)

 

    2. 2개 폴더를 생성해 줍니다. 

mkdir "C:\Program Files\containerd\cni\bin"
mkdir "C:\k"

해당 폴더가 자동으로 생성되지 않으므로 사전에 생성해둠
“C:\k” 폴더는 calico설치시 사용되는 폴더이므로 인터넷에서 받은 파일을 넣어줍니다

 

본작업

 

    1. 7zip.msi를 설치해 줍니다

    2. ContainerD 설치

# *인터넷필요*
# 인터넷에서 해당 파일을 받고 폐쇄망 서버로 옮긴다. 이 단계 이후 설치 방법은 내용을 참조
# [ContainerD버전]를 받은 버전으로 수정한다 
curl.exe -L https://github.com/containerd/containerd/releases/download/v[ContainerD버전]/containerd-[ContainerD버전]-windows-amd64.tar.gz -o containerd-windows-amd64.tar.gz
tar.exe xvf .\containerd-windows-amd64.tar.gz
#____________________________________________________

# Copy and configure
Copy-Item -Path ".\bin" -Destination "$Env:ProgramFiles\containerd" -Recurse -Container:$false -Force
cd $Env:ProgramFiles\containerd\
.\containerd.exe config default | Out-File config.toml -Encoding ascii

# Review the configuration. Depending on setup you may want to adjust:
# - the sandbox_image (Kubernetes pause image)
# - cni bin_dir and conf_dir locations
Get-Content config.toml

# Register and start service
.\containerd.exe --register-service
Start-Service containerd

 

    3. Calico 설치 

        1. Install-calico-windows.ps1 스크립트를 참조하여 인터넷으로 다운로드 받는 파일들을 미리 폐쇄망에 옮겨놓는다 

           -> Line 48, 49, 54, 56, 주석처리한다 [스크립트에 인터넷을 사용하여 다운로드 하는 코드를 주석처리 한다]

           -> 스크립트 처음 Param부분에서 $RelaseFile, $KubeVersion, $ServiceCidr, $DNSServerIPs를 알맞게 수정
         

        2. kubectl 파일 미리 받아둠 - 7zipFM으로 압축풀기 (인스톨스크립트에서 인터넷에서 소스땡겨오는부분 주석처리)
           -> kubernetes-node-windows-amd64.tar 파일을 7zip으로 압축풀어 내용물을 k 폴더에 넣어놓는다

 

        3.  k8s마스터 노드의 /root/.kube/config 파일 k 폴더로 옮기기

        4. calico-windows.zip 파일을 C:\로 옮긴다

        5. Install-calico-windows.ps1 스크립트를 실행한다

        6. CalicoNode, CalicoFelix 서비스가 정상적으로 실행되는지 확인한다

            [Get-Service 명령어 사용]

 

    4. Calico 설치 이후 C:\CalicoWindows\Kubernetes 내부 install-kube-services.ps1 스크립트를 실행하여 Kubelet, kube-proxy 설치 후 실행까지 확인

    5. K8s Master에서 Windows노드가 정상적으로 추가되었는지 확인

 

아쉽게도 아직 윈도우 노드와 빌드가 맞게 생성된 pod이 없어서 pod이 올라가는지 테스트는 못해봤지만 노드가 정상적으로 추가되는것을 확인했습니다. 

 

궁금하시거나 이상하다 하시는점 있으시면 알려주세요!

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

OpenStack에서 Ubuntu 20.04위에 Multi-cluster k8s설치 기록입니다

 

1. 도커 설치 

sudo apt-get update
 
sudo apt-get install \
    ca-certificates \
    curl \
    gnupg \
    lsb-release

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
  
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io

sudo systemctl enable docker
sudo systemctl start docker

 

1.1 설치 이후 containerd설정파일을 수정

vim /etc/containerd/config.toml

이부분을 주석처리 해준다
#disable_plugins = ["cri"]

containerd 재시작

systemctl stop containerd
systemctl start containerd

 

2. K8s 설치

#swap영역을 꺼준다
swapoff -a && sed -i '/swap/s/^/#/' /etc/fstab
#ubuntu 20.04에서는 기본적으로 keyrings폴더가 없어서 다르게 설정함
sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://dl.k8s.io/apt/doc/apt-key.gpg
echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo apt-get update -y
#k8s 설치 및 버전 홀드 명령어
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl

#설치 후 환경설정
 mkdir -p $HOME/.kube
 sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
 sudo chown $(id -u):$(id -g) $HOME/.kube/config

 export KUBECONFIG=/etc/kubernetes/admin.conf

 

3. K8s control-plane 설정

 

sudo kubeadm init --control-plane-endpoint [controlplane IP]:6443 --upload-certs

#이후 다음과같은 URL들이 생성됨

kubeadm join 10.10.10.46:6443 --token ygmu0q.07f8v7xz3ghq6k1t \
	--discovery-token-ca-cert-hash sha256:f16a98dbc6fedbe229f57ba2c8bf531623be8ca8d0f536afb3e363a3ca14f527 \
	--control-plane --certificate-key 3964d2b0dc528a3c2000d51383aa2825197305d31ab935a92069741628e1ca8d
#위 URL은 join할 control-plane node에서 실행해 주면 됨

kubeadm join 10.10.10.46:6443 --token nf8qv9.g3iu91lv102w17yt --discovery-token-ca-cert-hash sha256:f16a98dbc6fedbe229f57ba2c8bf531623be8ca8d0f536afb3e363a3ca14f527
#위 URL은 join할 worker-node 에서 실행해 주면 됨

 

만약 url을 잃어버렸을경우 재 발급 방법

#일반 node join문 재 출력 명령어
kubeadm token create --print-join-command

#Control-plane join문 재 출력 
echo $(kubeadm token create --print-join-command) --control-plane --certificate-key $(kubeadm init phase upload-certs --upload-certs | grep -vw -e certificate -e Namespace)

 

4. Calico 설치

kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
#시간좀 지난뒤 Pod 생성 및 구동 확인

kubectl get pods -A

NAMESPACE     NAME                                       READY   STATUS              RESTARTS      AGE
kube-system   calico-kube-controllers-7ddc4f45bc-vhsxq   0/1     ContainerCreating   0             17s
kube-system   calico-node-4rwvz                          0/1     Init:2/3            0             17s
kube-system   calico-node-v7x54                          0/1     Init:2/3            0             17s
kube-system   coredns-5dd5756b68-7q2vm                   0/1     ContainerCreating   0             19m
kube-system   coredns-5dd5756b68-vzr8g                   0/1     ContainerCreating   0             19m
kube-system   etcd-issac-master                          1/1     Running             1             19m
kube-system   etcd-issac-master3                         1/1     Running             0             18m
kube-system   kube-apiserver-issac-master                1/1     Running             1             19m
kube-system   kube-apiserver-issac-master3               1/1     Running             0             18m
kube-system   kube-controller-manager-issac-master       1/1     Running             1 (18m ago)   19m
kube-system   kube-controller-manager-issac-master3      1/1     Running             0             18m
kube-system   kube-proxy-6kd4x                           1/1     Running             0             18m
kube-system   kube-proxy-8f8h9                           1/1     Running             0             19m
kube-system   kube-scheduler-issac-master                1/1     Running             2 (18m ago)   19m
#k8s control-plane node ready상태 확인

kubectl get nodes

root@issac-master:/home/ubuntu# k get nodes
NAME            STATUS   ROLES           AGE   VERSION
issac-master    Ready    control-plane   20m   v1.28.2
issac-master3   Ready    control-plane   18m   v1.28.2

+ Recent posts