이쿠의 슬기로운 개발생활

함께 성장하기 위한 보안 개발자 EverNote 내용 공유

클라우드/Kubernetes

93. kubernetes Windows node 추가 (Docker)

이쿠우우 2021. 11. 19. 11:06
반응형

 

 

kubernetes Windows node 추가 (Docker)

 
 

목표

 
IIS web server container 와 같이 linux가 아닌 windows OS에서 실행가능한 container가 있음.
해당 container를 실행하기 위해서는 windows worker node가 필요함
이를 test해보기 위해 linux kubernetes cluster에 windows worker node를 추가하는 작업을 진행해봄.
 
Windows OS Container Runtime tool은 Containerd로 진행함.
 

 

Test 환경

on-premise 환경에서 진행.
linux cluster로 Master Node, Linux worker Node로 구성되어있는 상태에서 
Windows node를 추가해봄.
 
[Master Node server]
OS = CentOS 7
리눅스 커널 버전 : Linux 3.10.0-1062.el7.x86_64
containerd :1.4.10
[Linux Worker Node server]
OS = CentOS 7
리눅스 커널 버전 : Linux 3.10.0-1062.el7.x86_64
containerd :1.4.10
[Windows Worker Node server]
OS = Windows Server 2019

[kubernetes version]
1.22.2
CNI : flannel

 

 

 

1. 기존 Kubernetes cluster CNI상태 확인

 
현재 기존 kubernetes cluster에 CNI가 flannel로 등록되어 동작하고 있음.
flannel을 
https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
이 경로에서 받은 default flannel yaml을 그대로 설치해서 사용하고 있었음.
 
default로 설정 그대로 사용하게 되면 flannel은 8472Port로 동작함.
하지만 Windows Worker Node를 추가하기 위해서는 8472 Port를 사용하면 안되고
4096 또는 4789 Port로 동작해야함.
관련 설명은 아래 링크에 있음.
https://github.com/flannel-io/flannel/blob/master/Documentation/backends.md#vxlan

해당 문제를 해결하기 위해 flannel Port를 변경해야함.

flannel Port 변경

flannel ConfigMap 파일 확인
[명령어]
kubectl describe cm kube-flannel-cfg -n kube-system

flannel ConfigMap 변경
[명령어]
kubectl edit cm kube-flannel-cfg -n kube-system

위와같이 수정 후 저장.
configMap 적용하여 flannel을 재기동 하기위해
모든 node의 flannel을 삭제함.
flannel을 삭제하면 Daemonset에 의해 자동으로 재배포됨.

현재는 node가 2개만 존재하기때문에 2개의 flannel pod만 삭제해주면 됨.

flannel pod 재생성됨.

flannel 재생성 후 4789 port를 확인해보면 udp로 열려있는것을 확인가능.

 

 

2. Windows Worker Node에 Container Runtime tool 설치

container runtime tool은 Docker로 설치하겠음
Windows의 PowerShell을 Administrator 권한으로 실행시켜서 진행함.

Windows Docker설치

[1.] 
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All
설치
상위 명령어 이후  "y" 입력하여 재기동.
[2.] 
Install-Module -Name DockerMsftProvider -Repository PSGallery -Force

 
[3.] 
Install-Package -Name docker -ProviderName DockerMsftProvider

[4.] 
재기동 명령
Restart-Computer -Force
[5.] 
Get-Package -Name Docker -ProviderName DockerMsftProvider

[6.] 
Start-Service Docker

Windows docker 설치 확인

[powershell]
docker version

 

2. Windows Worker Node에 Wins, kubelet, kubeadm 설치

 

tool들을 1.22.2 version으로 설치
[tool 설치]
.\PrepareNode.ps1 -KubernetesVersion v1.22.2
[결과]
정상 설치
 

3. join token 확인

Master node에서 node join token을 확인함
[명령어]
kubeadm token create --print-join-command

 

4. Windows Worker Node join

windows worker node 를 추가함.
상위과정에서 확인한 명령으로 join 시도

[명령어] 
kubeadm join 10.0.2.15:6443 --token 8k79q1.l61wehbgth9z13te --discovery-token-ca-cert-hash sha256:d5945eac59f190751778dd94d532bfe1cf05b6ce29067dca8b518fa4da7ac4bf
[결과] 
정상적으로 join됨.

 

5. 결과 확인

[명령어]
kubectl get node -o wide
정상적으로 windows node가 추가되어있는 것을 확인가능.
 
 

 

CNI 정상 배포 확인

flannel CNI container 배포 확인

flannel container가 windows worker node에도 배포가 정상적으로 되어있는지 확인
[명령어]
kubectl get all -n kube-system -o wide

[확인결과]
windows worker node에는 배포가 되어있지 않음.
그리고 자세히 보면 kube-proxy도 배포되어있지 않음.
[원인]
기존에 동작하고 있던 flannel과 kube-proxy는 linux용도임.
이에 따라 별도의 windows용 flannel과 kube-proxy를
windows node에 배포해야함.

windows kube-proxy 배포

kubernetes version호환을 위해 1.22.2 version으로 설치
curl -L https://github.com/kubernetes-sigs/sig-windows-tools/releases/latest/download/kube-proxy.yml | sed 's/VERSION/v1.22.2/g' | kubectl apply -f -
 
[결과]

windows flannel 배포
최신 flannel version으로 설치
[결과]

 
 
[참고]
flannel이 정상적으로 설치가 안된다면
네트워크 인터페이스 이름을 확인해야함.
아래와 같이 장치 이름이 "Ethernet"이면 상관 없지만 이와 동일하지 않다면 문제가 발생함.

윈도우 노드에서 이더넷이 아닌 다른 인터페이스(예: "Ethernet0 2")를 사용하는 경우, 
flannel-host-gw.yml이나 flannel-overlay.yml 파일을 아래와 같이 수정이 필요함
wins cli process run --path /k/flannel/setup.exe --args "--mode=overlay --interface=Ethernet"
그리고, 이에 따라 인터페이스를 지정해야 함.
curl -L https://github.com/kubernetes-sigs/sig-windows-tools/releases/latest/download/flannel-overlay.yml | sed 's/Ethernet/Ethernet0 2/g' | kubectl apply -f -

결과

다음과 같이 windows worker node에 kube-proxy와 flannel이 정상적으로 배포되어야 성공
IP대역도 정상인지 확인해야함. 아래 그림과 같아야 정상.

docker ps 명령으로 container확인해보면
kube-proxy와 flannel이 있어야함.

flannel이 설치 된 후의 network interface 상태

 

 

 

오류 참고1.

[오류 상황]
windows worker node에 kube-proxy와 flannel cni가 정상적으로 배포되고 있지 않음
[오류 메세지]
kubectl describe 명령으로 windows node에 배포된 flannel, kube-proxy pod를 확인해보면 아래와 같은 오류 메세지를 확인가능.
Error: failed to create containerd task: hcsshim::CreateComputeSystem kube-flannel: The directory name is invalid.

[원인]
해당 오류는 windows update 관련 오류임.
windows worker node 추가할 시 
KB4489899 update가 되어있어야 한다고하는데
KB4489899 관련 패키지가 설치되어있지 않아서 발생하는 오류임.
[해결법]
windows update를 진행함.
예제 환경에서는 아래와 같은 package를 설치하니 오류가 해결됨.

 

 
 

 

IIS container 실행 Test

 

목표

windows 에서만 실행 가능한 iis container가 windows worker node에서 정상적으로 실행되는지 확인.
 

IIS container확인

windows server에 해당하는 image를 선정해야함
현재 windows worker node가 2019 server이기 때문에 
mcr.microsoft.com/windows/servercore/iis:windowsservercore-ltsc2019
image를 사용함.
 

IIS deployment, service 배포

[iis deployment 예제]
apiVersion: apps/v1
kind: Deployment
metadata:
  name: iis-deployment
  labels:
    app: iksoon-iis
spec:
  replicas: 1
  selector:
    matchLabels:
      app: iksoon-pod-iis
  template:
    metadata:
      labels:
        app: iksoon-pod-iis
    spec:
      containers:
      - name: iksoon-iis
        ports:
        - containerPort: 80
 
---
 
apiVersion: v1
kind: Service
metadata:
  name: iksoon-iis-service
  labels:
    name: service-iis-service
spec:
  type: NodePort
  ports:
  - name: "iksoon-iis-network-setting"
    port: 8088
    protocol: TCP
    targetPort: 80
    nodePort: 30002
  selector:
    app: iksoon-pod-iis

 

pod 배포 상태

IIS image 용량이 4GB가 넘어서 image pull하는데 시간이 오래걸림...

VirtualBox 포트포워딩 설정

외부에서 접근 결과

nodeport 30002로 접근을 시도한 결과로
iis 기본 page 정상 접근됨.

linux환경에서는 pod가 배포되면 
veth????와 같은 가상 인터페이스가 생성되는데
windows worker node network interface를 확인해보면
아래 그림과 같이 pod가 추가되도 별도의 interface가 생성되지 않고
해당 환경이 유지됨.

 


제 글을 복사할 시 출처를 명시해주세요.
글에 오타, 오류가 있다면 댓글로 알려주세요! 바로 수정하겠습니다!


 


 
 
참고
kubernetes worker node 추가 참고
 
windows hyper-V

 

반응형