상현
개발 덕후

proxmox k3s 튜토리얼

( 업데이트: )

k3s란

K3S란 가벼운 Kubernetes로 쉽게 설치하고 적은 메모리/binary 파일을 사용하여 Edget/IoT 환경 혹은 CI/Dev 환경에서 k8s를 쉽게 사용할 수 있도록 도와주는 도구이다.

Rancher Labs에서 만든 Kubernetes의 또 다른 버전. Kubernetes와 비교해서는 크게 두가지의 차이점이있다.

경량화, 외부 클라우드 서비스와의 연동 기능을 최소한으로 줄이고, 고가용성(HA) 배포를 위해 기본으로 사용하던 etcd 의존성을 없애고 sqlite를 기본값으로 사용한다. 또한 Docker와 같은 의존성을 모두 삭제하고 containerd와 같은 가벼운 대체재를 사용한다. 기존 Kubernetes에서 지원하는 과거 버전의 API또한 지원하지 않는다.

설치가 무척 간단하다. 경량화를 통해 시스템 요구 사항을 극단적으로 줄인 결실이 설치 과정에서 드러나는데, 쉘 스크립트 하나로 대부분의 배포판에서 설치할 수 있다. 설치 후 자동으로 systemd 서비스 또한 만들기 때문에, 사용자가 신경 써 주어야 할 것이 거의 없다.


proxmox에서 k3s

k3s의 노드가될 LXC 컨테이너 생성

  • control.k8s
  • worker-1.k8s
  • worker-2.k8s

컨테이너에서 사용할 SSH Public Key를 생성한다.

Ubuntu 22 템플릿 추가하기

먼저 사용할 Ubuntu 22.04 템플릿을 추가해줍니다.
LXC컨테이너는 경량화된 리눅스로 템플릿이 별도로 있습니다.

사용하고있는 스토리지의 CT 템플릿 > 템플릿으로 이동

스크린샷 2023-02-04 오전 12 19 14
스크린샷 2023-02-04 오전 12 21 05

LXC 컨테이너는 보안상 권한이 없는 컨테이너로 만들어주셔야 안전합니다.

Control Plane LXC컨테이너 생성

Create CT 클릭해서 CT 생성

다음과 같이 설정

스크린샷 2023-01-18 오후 5 06 47

꼭 권한이없는 컨테이너를 체크해재해줘야합니다.

The connection to the server 127.0.0.1:6443 was refused - did you specify the right host or port?Code language: CSS (css)

아니면 이런 오류에 해매게될겁니다.

스크린샷 2023-01-18 오후 5 07 04
스크린샷 2023-01-18 오후 5 07 29
스크린샷 2023-01-18 오후 5 07 42
스크린샷 2023-01-18 오후 5 07 51
스크린샷 2023-01-18 오후 5 08 14
스크린샷 2023-01-18 오후 5 08 29

Worker 노드 LXC 컨테이너 생성

Control 노드와 동일하게 생성하고 Hostnmae을 worker-[id].k8s로 변경해서 생성한다.

컨테이너 권한부여

  1. pve의 shell or SSH로 연결한다.
  2. 내용 추가하기
vim /etc/pve/lxc/300.confCode language: Shell Session (shell)
  1. 다음을 추가합니다
lxc.apparmor.profile: unconfined
lxc.cgroup.devices.allow: a
lxc.cap.drop:
lxc.mount.auto: "proc:rw sys:rw"Code language: plaintext (plaintext)
  1. 설정 파일을 저장
  2. 그런다음 woker 노드에 대해서 동일한 작업을 반복합니다.
vim /etc/pve/lxc/[CT_ID].confCode language: Shell Session (shell)

해당 설정을 LXC 컨테이너를 재부팅하여 설정을 반영합니다.

  1. pve의 shell or SSH로 연결한다.
pct push 300 /boot/config-$(uname -r) /boot/config-$(uname -r)Code language: Shell Session (shell)
  1. 그런다음 woker 노드에 대해서 동일한 작업을 반복합니다.

각 LXC 컨테이너에서

운영체제에서 필요한 프로그램 설치

LXC는 경량화다보니 기본적인 명령어들이 없는 경우가 있습니다. 필요한 프로그램들을 설치합니다.

apt update && apt upgrade -yCode language: Shell Session (shell)
apt-get install neovim git curlCode language: Shell Session (shell)

create conf-kmsg.sh

  1. 스크립트
vim /usr/local/bin/conf-kmsg.sh
  1. 내용 추가
#!/bin/sh -e
if [ ! -e /dev/kmsg ]; then
  ln -s /dev/console /dev/kmsg
fi
mount --make-rshared /Code language: Bash (bash)

create conf-kmsg.service

  1. 서비스추가
vim /etc/systemd/system/conf-kmsg.serviceCode language: Shell Session (shell)
  1. 내용 추가
[Unit]
Description=Make sure /dev/kmsg exists

[Service]
Type=simple
RemainAfterExit=yes
ExecStart=/usr/local/bin/conf-kmsg.sh
TimeoutStartSec=0

[Install]
WantedBy=default.targetCode language: plaintext (plaintext)

service 실행

chmod +x /usr/local/bin/conf-kmsg.shCode language: Shell Session (shell)
systemctl daemon-reloadCode language: Shell Session (shell)
systemctl enable --now conf-kmsgCode language: Shell Session (shell)

Control Plane에 k3s 설치

curl -fsL https://get.k3s.io | sh -s - --write-kubeconfig-mode 644 --disable traefik --node-name control.k8sCode language: Shell Session (shell)

control plane의 ip 주소 가져오기

hostname -ICode language: Shell Session (shell)

k3s woker node 등록 토큰을 표시

cat /var/lib/rancher/k3s/server/node-tokenCode language: Shell Session (shell)

클러스터에 액세스하기 위해서 k3s.yaml을 복사한다.

cp /etc/rancher/k3s/k3s.yaml ~/.kube/configCode language: Shell Session (shell)
mkdir ~/.kube
cp /etc/rancher/k3s/k3s.yaml ~/.kube/config
chmod go-r ~/.kube/config
echo 'export KUBECONFIG="/root/.kube/config"' >> ~/.zshrcCode language: Shell Session (shell)

woker 노드에 k3s 설치

curl -fsL https://get.k3s.io | K3S_URL=https://[control-node-ip]:6443 K3S_TOKEN=[node-token] sh -s - --node-name worker-1.k8sCode language: Shell Session (shell)

설치완료

control 노드에서

kubectl get nodesCode language: Shell Session (shell)

확인가능

issue

The connection to the server 127.0.0.1:6443 was refused - did you specify the right host or port?Code language: Shell Session (shell)

swap off

proxmox 가상 환경에서 시스템 성능 문제가 발생할때 swap을 비활성화하는 것이 유용한 솔루션이 될 수 있습니다. SWAP은 시스템의 물리적 메모리(RAM)이 부족할 떄 임시로 데이터를 저장하는 데 사용되는 하드 드라이브 공간입니다.

proxmox에서 SWAP을 비활성화하려면

swapoff /dev/pve/swapCode language: Shell Session (shell)

그런 다음 명령을 사용하여 SWAP 논리 볼륨을 비활성화합니다.

lvchange -a n /dev/pve/swapCode language: Shell Session (shell)

마지막으로 다음 명령을 사용하여 SWAP 논리 볼륨을 제거합니다.

lvremove /dev/pve/swapCode language: Shell Session (shell)

  • [[kubernetes traefik 서비스하기 ingressRouter]]
  • [[kubernetes traefik ingress 라우팅, cert-manger로 인증서관리]]
  • [[traefik ingress cert-manger 조합에서 traefik만 사용하는 방법으로 변경]]