본문 바로가기

컨테이너

WSL 2 Ubuntu 우분투에 k3s(워커노드) 설치 / genie 에러해결

WSL(Windows Subsystem for Linux) 리눅스용 윈도우 하위 시스템

- 기존 윈도우 환경에서 리눅스를같이 사용하려면 VMware와 같은 가상머신을 사용했어야 하지만 Windows 10에서 도입된 Windows WSL(Windows Subsystem for Linux)은 Windows에서 별도의 가상머신을 설치하지 않고도 리눅스를 사용할 수 있게 해주는 기능

- WSL은 Microsoft Store를 통해서 여러가지 배포판을 설치할 수 있음

- 윈도우10과 윈도우 11에서 네이티브로 리눅스 실행파일을 실행하기 위한 호환성 계층

- 리눅스 커널코드가 포함되지 않은 마이크로소프트가 개발한 리눅스 호환 커널 인터페이스를 제공하며 그 위에 리눅스 유저랜드를 실행할 수 있음 ex) Ubuntu(우분투), 패도라, OpenSUSE, Kali, Debian, Arch Linux

- WSL을 사용하면 PowerShell 또는 Visual Studio Code와 같은 Windows 도구와 완전히 통합된 Bash 또는 Grep과 같은 Linux 도구를 이중 부팅할 필요없이 사용 가능

- WSL은 윈도우에 추가기능으로 등록되어 있어 해당 기능을 수동으로 켜주어야함

windows 기능 검색

- 해당 옵션이 체크가 안되어 있으면 체크를 해주고 PC 재부팅을 해주면 됨

- 재부팅이 완료되면 설치할 리눅스를 스토어(Microsoft Store)를 통해 다운로드!

 

 

스토어(Microsoft Store)에서 Ubuntu(우분투) 20.04 버전 설치

- 이미 설치되어 있는 경우 제거 후에 재설치

- 스토어에 ubuntu를 검색하고 Ubuntu 20.04.5 LTS 버전을 다운로드

- WSL에는 Microsoft Store를 통해서 여러가지 배포판 설치가 가능!

- 설치된 WSL 리스트 확인 명령어

wsl -l

- 다운로드가 완료되면 [열기]버튼을 클릭하여 설치를 진행

- 설치가 완료되면 아래와 같이 username을 입력하라는 메세지가 나올때까지 기다려줌

- 로그인할 이름과 비밀번호를 입력!

- 현재 WSL은 1,2 버전이 존재하며 차이는 아래와 같다

출처 : https://learn.microsoft.com/ko-kr/windows/wsl/compare-versions

- 위의 표를 보면 WSL 2 아키텍처는 여러가지면에서 WSL 1보다 성능이 우수함 (단, OS 파일 시스템의 성능을 제외하면 프로젝트에서 작업하기 위해 실행 중인 도구와 동일한 운영체제에 프로젝트 파일을 저장하여 해결할 수 있음

- WSL 버전 확인은 Powershell에서 가능

wsl -l -v

- 나의 버전은 WSL 1 이므로 WSL 2 로 업데이트를 진행하였다. 참고로 WSL 2는 Windows 11 또는 Windows 10 버전 1903, 빌드 18632 이상에서만 사용 가능하며 Windows 버전 확인은 Windows 로고 키 + R을 선택하고 winver를 입력하고 확인을 누르면 확인 가능하다.

 

WSL 1 → WSL 2 업데이트

 

wsl --set-version <distro name> 2

<distro name>을 업데이트 하려는 Linux 배포판의 이름으로 바꿈

wsl --set-version ubuntu-20.04 2

- WSL 버전이 1에서 2로 업데이트 된 것을 확인할 수 있음

 

WSL 2를 기본 값으로 설정

- WSL 2를 기본값으로 설정(wsl 버전을 조회했을때 왼쪽에 * 표시가 있어야함)이 되어있어야 정상 동작이 됨

- 파워쉘에서 진행

wsl -s [변경할 WSL]

(중간에 Windows10 버전을 11로 업데이트 했더니 파워쉘 배경 색상이 바뀜..)

- 기본값으로 설정하는 경우 *이 Ubuntu-20.04 에 표시되는것이 확인

 

WSL 2에서 systemd 활성화

- WSL 2에서 k3s 사용을 위해 systemd를 활성화를 하려면 system-genie라고 불리우는 툴을 설치

- 이 작업은 ubuntu 커맨드 창에서 진행

cd /tmp

- install-sg.sh의 내용을 새 파일로 복사

wget --content-disposition \
  "https://gist.githubusercontent.com/djfdyuruiry/6720faa3f9fc59bfdf6284ee1f41f950/raw/952347f805045ba0e6ef7868b18f4a9a8dd2e47a/install-sg.sh"

- 실행 권한 추가

chmod +x /tmp/install-sg.sh

- 새 스크립트를 실행

/tmp/install-sg.sh && rm /tmp/install-sg.sh

 

WSL 인스턴스 종료 후 터미널 열어 systemd 확인

- 파워쉘에서 진행

- wsl 인스턴스 종료

wsl.exe --shutdown

- wsl 터미널 열기

wsl genie -s

그러나 3가지 에러발생..

1. ssh.service (2,3번만 처리했는데 1번 에러도 함께 사라짐..)

2. systemd-remount-fs.service

3. multipathd.socket

 

WSL - systemd-genie와 관련된 에러 해결

[1] systemd-remount-fs.service error

- 먼저 에러에 대한 자세한 메세지를 확인

systemctl status systemd-remount-fs.service

더보기

● systemd-remount-fs.service - Remount Root and Kernel File Systems
     Loaded: loaded (/lib/systemd/system/systemd-remount-fs.service; enabled-runtime; vendor preset: enabled)
     Active: failed (Result: exit-code) since Tue 2022-10-18 11:46:36 KST; 16min ago
       Docs: man:systemd-remount-fs.service(8)
             https://www.freedesktop.org/wiki/Software/systemd/APIFileSystems
   Main PID: 63 (code=exited, status=1/FAILURE)

Oct 18 11:46:36 DESKTOP-HQ9O9JH-wsl systemd-remount-fs[67]: mount: /: can't find LABEL=cloudimg-rootfs.
Warning: journal has been rotated since unit was started, output may be incomplete.

- mount: /: can't find LABEL=cloudimg-rootfs. 라는 오류메세지가 나오는것을 확인할 수 있음

[원인]

- 이것은 systemd-remount-fs가 /etc/fstab에 구성된 옵션이 있는지 확인하기 위해 루트 파티션을 다시 마운트하려고 하기 때문에 발생. Ubuntu 기본 /etc/fstab에서는 루트 파티션에 "cloudimg-rootfs"라는 레이블이 지정되어있다고 가정하지만 WSL에서는 그렇지 않으므로 에러 발생

[해결]

df

- /(루트)에 Mounted on되어있는 파일시스템인 /dev/sdb를 cloudimg-rootfs 이름으로 지정

sudo e2label /dev/sdb cloudimg-rootfs

[2] multipathd.socket error

- 마찬가지로 자세한 오류 메세지 출력

systemctl status multipathd.socket

더보기

● multipathd.socket - multipathd control socket
     Loaded: loaded (/lib/systemd/system/multipathd.socket; enabled; vendor preset: enabled)
     Active: failed (Result: trigger-limit-hit) since Tue 2022-10-18 11:46:36 KST; 31min ago
   Triggers: ● multipathd.service
     Listen: @/org/kernel/linux/storage/multipathd (Stream)

Oct 18 11:46:36 DESKTOP-HQ9O9JH-wsl systemd[1]: multipathd.socket: Trigger limit hit, refusing further activation.
Oct 18 11:46:36 DESKTOP-HQ9O9JH-wsl systemd[1]: multipathd.socket: Failed with result 'trigger-limit-hit'.
Warning: journal has been rotated since unit was started, output may be incomplete.

- 다른 분 해결한 방법을 찾아 보면 원래 WSL 기본 커널에는 multipath 지원이 없어서 이 기능을 disable 하여 처리하였으므로 따라해보도록 한다.

systemctl disable multipathd.socket

 

* systemd-remount-fs.service / multipathd.socket 에러만 처리하고 다시 wsl genie -s 명령어를 하면 에러없이 시작이됨!

 

ps ef

 

이제 모든 준비가 되었으니 워커노드 k3s를 설치해보자!!

 

간단하게 k3s란?

- rancher라는 또 다른 쿠버네티스 배포판을 만든 회사에서 IoT 및 edge computing 디바이스 위에서도 동작할 수 있도록 만들어진 경량 쿠버네티스

- 설치가 쉽고 적은 리소스로도 클러스터를 구축할 수 있기 때문에 공부하기에 좋음!

 

WSL 2 에 워커노드 k3s 설치

- 반드시 마스터와 워커는 서로 다른 서버에 설치! 같은 서버에서 마스터와 워커 설치는 불가능

- 이 포스팅에서는 해당 서버는 워커노드의 역할을 수행

 [전제 조건]

  1. 마스터 노드는 다른 서버에서 동작하고 있어야함

  2. 마스터 노드에서 확인한 NODE_TOKEN과 MASTER_IP를 알고 있어야함

  3. 워커 노드에 다음과 같은 포트가 열려 있어야함

  • 포트 범위 : 10250(TCP) → kubelet API 목적
  • 포트 범위 : 30000 - 32767(TCP) → nodePort services 목적

curl -sfL https://get.k3s.io | K3S_URL=https://$MASTER_IP:6443 \
	K3S_TOKEN=$NODE_TOKEN \
    INSTALL_K3S_VERSION=v1.24.6+k3s1 sh -

- 마스터 노드에 접속하여 워커노드가 추가된것을 확인하고 STATUS가 Ready로 나온다면 정상적으로 쿠버네티스 클러스터를 완성한 것

kubectl get nodes -o wide

결과중 일부만 캡쳐

- 만약 설치 완료된 이후에 마스터, 워커 노드 둘 중 하나라도 NotReady 상태가 지속된다면 문제가 발생한 것이므로 문제가 되는 노드에 접속하여 상태 확인을 해서 에러 메세지나 exception 메세지를 확인해보자.

# 마스터 노드 로그 확인
systemctl status k3s.service

# 워커 노드 로그 확인
systemctl status k3s-agent.service

 

 

 

 

 

 

[참고]

https://github.com/arkane-systems/genie/wiki/Systemd-units-known-to-be-problematic-under-WSL#systemd-remount-fsservice