July 20, 2025

[Home-K8S] #8 k8s 전용 OS Talos linux

[Home-K8S] #8  k8s 전용 OS Talos linux

k8s에 관해서 gpt랑 얘기를 하고 있다가 talos linux 라는 OS를 알게 되었습니다.
50MB 에 29개의 바이너리 파일을 가진 엄청 경량화된 OS 이고, Yaml 과 API를 이용해서 관리를 한다는 점이 매우 매력적으로 들렸습니다.
(그리고 오픈소스 입니다. "Mozilla Public License Version 2.0")

Talos Linux 란

talos는 k8s에 필요한 파일을 제외하고 다른 바이너리 파일을 최대한 줄인 OS 입니다.
talos의 고유 바이너리는 12개 밖에 없습니다.

프로세스/서비스 설명
init Talos API
containerd 컨테이너 런타임
runc 컨테이너 런타임의 부모 프로세스
modprobe 커널 모듈 관리 (GPU 등)
lvm 리눅스 논리 볼륨
dmsetup 장치 매핑 드라이버
udevd 커널 메시지 전달
mkfs.xfs xfs 파일 시스템
xfs_repair xfs 복구 시스템
xtables-legacy-multi iptable 동기화

자세한 건 아래 글을 확인해 주세요.

There are only 12 binaries in Talos Linux - Sidero Labs
Talos is a single purpose Linux distribution for Kubernetes. We only include binaries you need. Here’s a list of all the binaries and what they do.

경량 OS

그에 맞게 공식 iso 파일도 용량이 작습니다.
심지어 라즈베리 파이(SD card) 에도 설치가 가능할 정도입니다.
다음에는 라즈베리 파이에 마스터를 설치하고 워커를 더 써봐야 겠어요.

리소스 사용량

확실히 디스크메모리의 사용량은 압도적으로 적습니다. CPU와 i/o 도 낮은 편이지만 그렇다고 많이 낮은 것은 아니더군요.
https://www.siderolabs.com/blog/which-kubernetes-is-the-smallest/

보안

Talos는 고유 바이너리가 적어서 취약점이 적다는 것을 강조하고 있습니다.
SSH 나 쉘, 패키지 관리자 등 접근할 방법 자체가 적은 것도 있습니다.

루트 파일 시스템을 읽기 전용으로 마운트해서 시스템 파일의 변조를 막습니다.
kubelet을 root 로 실행하지 않고, 새로운 namespace를 만들어서 실행합니다.
(그래서 폴더를 링크해줘야 사용할 수 있습니다. )

Talos Linux 설치

Talos를 처음 찾아봤을 때 누가 가장 쉬운 k8s 구성 방법이라고 적어놓은 글을 봤습니다만, 처음 구성할 때는 어려웠습니다.
자료도 많이 없는데, 업데이트에 따라 API 명령어도 좀 바뀌는 게 있어서 gpt를 사용해도 자료를 찾기가 힘들더라구요.

1. ISO 이미지 다운로드

다른 OS를 설치할 때처럼 ISO 이미지로 USB 드라이브를 만들어 줍니다.
아래 공식 github Release 에서 알맞은 iso 파일을 사용합니다.
(부팅 USB를 제작하는 방법은 아시리라 믿습니다. 저는 ventoy 사용 중입니다.)

Releases · siderolabs/talos
Talos Linux is a modern Linux distribution built for Kubernetes. - siderolabs/talos

2. talosctl 설치

talos는 SSH 같은 원격 접속이나 UI 없이 talosctl 을 이용합니다.
윈도우는 위의 release 페이지에 같이 있습니다.

brew install siderolabs/tap/talosctl
curl -sL https://talos.dev/install | sh

3. Config 파일 생성하기

k8s API 로 설정할 ip를 입력해서 talos yaml 파일들을 만들어 줍니다.
마스터 / 워커 노드의 설정과 talosctl 의 config 가 나옵니다.

talosctl gen config <cluster-name> <cluster endpoint>

talosconfig 는 talosctl 명령어를 사용할 때마다 지정해줘도 되지만, 귀찮으니까 $HOME/.talos/config 로 넣어줍니다. (or export TALOSCONFIG=./talosconfig)

talosctl 에는 endpoint 가 반드시 필요합니다. node와 통신이 되는 지점을 endpoint 로 사용하여 요청을 node로 프록시 합니다. 별도의 네트워크나 VPN을 사용할 때 유용합니다만, 동일 네트워크에서 구성할 때는 node 중 하나의 ip를 찍어서 endpoint를 사용합니다.

talosctl config endpoints <node ip>

4. Config 수정하기

수정이 꼭 필요한 부분이 하나 있습니다. OS 를 설치할 disk 의 정보를 수정해 줘야 합니다.

ISO 부팅

설치할 기기의 정보를 알기 위해 USB를 이용해 Talos OS를 부팅해 줍니다.
부팅 후 Connectivity 에 녹색 체크표시 가 뜨면 talos API를 사용할 수 있습니다.

해당 node의 IP와 nameserver 가 나타나게 됩니다.

Disk 확인

disk의 os 설치 경로를 정하기 위해서 disk 확인은 필수입니다.

talosctl get disks -n <node ip> --insecure

node 에 연결된 disk 의 list 를 확인할 수 있습니다.

💡
talos 가 이미 구성된 node 에서 usb로 부팅하면 오류가 발생합니다.
talos 가 이미 구성된 disk 를 reset 하고 다시 부팅해야 합니다.
reset 방법은 trouble shooting 에 적어 놓겠습니다.

OS 설치 위치

yaml 파일에서 machine > install > disk 부분을 수정합니다.
disk 위치에 따라 "/dev/nvme0n1" 로 수정해 줍니다.

💡
USB를 꽂으면 disk 의 mount 위치도 변합니다.
/dev/sd* 의 경로는 diskSelector를 이용하는 것을 추천드립니다.
(usb 경로로 설치했다가 ventoy를 날려먹었습니다. )

Worker 설정

Controlplane node 의 정보로 controlplane.yaml 파일을 수정하고 나면
Worker node 의 worker.yaml 도 수정해 줍니다.

node가 여러개라면 파일도 여러개 만들어 줍니다.

5. Config 적용하기

OS 경로를 설정해 줬으면 Config 를 적용해주면 됩니다. apply-config 를 진행하면 node가 재부팅 됩니다.

talosctl apply-config -n <master node ip> -f controlplane.yaml --insecure

재부팅 되고 나서 화면에 bootstrap 을 해달라는 메시지가 뜨면 bootstrap 을 실행해 줍니다. (화면이 없으면 talosctl dmesg 로 확인합니다. )

talosctl bootstrap -n <master node ip>

bootstrap 이 완료되고 나면 worker 도 동일하게 config를 적용합니다.
(master node 설정하면서 동시에 진행해도 됩니다. )

추가 설정

  1. Metric Server
    1. 모든 노드에 certificates 설정을 해주고, master 에서 metric 서버를 추가해주면 됩니다.
# 모든 노드에
machine:
  kubelet:
    extraArgs:
      rotate-server-certificates: true

# master에만
cluster:
  extraManifests:
    - https://raw.githubusercontent.com/alex1989hu/kubelet-serving-cert-approver/main/deploy/standalone-install.yaml
    - https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
  1. Disk 추가 와 Partition(파티션)
    1. Disk 를 추가하면 /var/mnt/<Volume name> 으로 마운트 됩니다.
    2. local-host 를 사용하려면 경로를 지정해 줘야 합니다.
[Home-K8S] #9 Talos - Disk & Partition (v1.10+)
ssh 를 통한 원격 접속도 안되고, kubelet이 namespace로 분리되어 있기 때문에 폴더 하나 만드는 일에도 yaml 파일을 수정해서 apply 를 해줘야 합니다. Host Path 생성 (extraMounts) root 파일 시스템에 폴더를 만들고 kubelet namespace에서 해당 경로를 연결해 줘야 합니다. 저는 local-path-provisioner 를 사용하기 위해 경로를 하나 만들어 줄 겁니다. destination : containerd
  1. kernel module - NFS Server & GPU 설정
    1. kernel 은 읽기 전용이므로 드라이버나 nfs 모듈을 구성한 후에 OS를 재설치 하셔야 합니다.
[Home-K8S] #10 Talos - Kernel Module 추가 (NFS & GPU)
k8s는 OS 위에서 프로세스만 격리되어 작동하므로 Kernel 의 기능을 사용합니다. talos는 root 파일 시스템도 격리되어 읽기 전용으로 되어 있어 드라이버나 모듈의 설치가 안됩니다. OS 이미지 자체가 드라이버나 모듈이 설치된 상태여야 합니다. Talos linux extensions GitHub - siderolabs/extensions: Talos Linux System ExtensionsTalos Linux System Extensions. Contribute to siderolabs/extensions development
  1. Cilium or 별도의 network cni 구성
    1. 기본은 flannel 입니다.
[Home-K8S] #11 Talos - Cilium CNI 설치
Deploying Cilium CNIIn this guide you will learn how to set up Cilium CNI on Talos.TALOS LINUXSidero Labs, Inc. Talos Linux는 기본적으로 flannel 을 사용하므로, 기본 cni를 사용하지 않는 다는 것을 명시해 주어야 합니다. controlplane.yaml 에서 cni: none 을 설정해 줍니다. cluster: network: cni: name: none Cilium 설치

마무리

위에서 작성한 글대로 OS 설치 경로만 정해주면 설치는 할 수 있습니다만,
구성하려는 cni, 서비스, disk 에 따라 추가를 해줘야 합니다.
(talos linux 는 기본적으로 flannel cni 를 사용합니다.)

kubelet이 별도의 namespace 에서 실행되고, root fs 가 읽기 전용이기에 gpu나 nfs 등 kernel 을 사용하는 경우에는 OS부터 다른 이미지로 설치해야 합니다.

Pod를 설치하다 보면 Pod Security Warning 이 계속 뜰텐데, 별 문제는 없지만 궁금하다면 PSS 와 PSA 에 관해서 찾아보거나 talos config에서 PodSecurty 부분을 전부 Previleged 로 설정하면 됩니다.

Trouble Shooting

  1. 로그 확인
    1. talos 의 자료가 많이 없어서 log 를 보면서 직접 수정해야 합니다.
talosctl dmesg -n <node ip> > ./dmesg.log
talosctl logs kubelet -n <node ip> > ./kubelet.log
  1. talos reset (초기화)
    1. node 의 OS를 다시 설치하고 싶을 경우 reset 하면 됩니다.
    2. worker node 의 경우 reset 하면 OS 가 전부 삭제됩니다.
      (usb로 부팅하셔야 합니다. )
    3. controlplane 의 경우 reset 해도 OS 가 남아있는 경우가 있습니다.
talosctl reset -n <node ip>
  1. talos config 분실 시 재설치
    1. reset 명령어는 insecure 옵션이 안되고, config가 설치된 talos linux는 usb로 부팅해도 insecure 가 안됩니다.
    2. config가 없거나 다시 설치하고 싶으시면 usb 부팅 시에 2번째 옵션인 (reset System Disk) 옵션을 선택하셔서 apply-config 를 적용하시면 됩니다.
  1. network MAC 주소 설정
    1. network > interfaces > deviceSelector > hardwareAddr 를 사용할 때 MAC 주소무조건 소문자로 하셔야 합니다.
  2. Host Path 를 사용하는 Pod 확인
    1. kubelet 은 OS 와 별도의 namespace 에서 실행됩니다.
    2. 그래서 Host Path를 사용하는 서비스는 extraMounts 를 하지 말고 디스크 마운트 포지션을 사용하셔야 합니다. (/var/mnt/<disk>)
    3. Longhorn 이나 nfs 가 그러합니다.

Comments