[Home-K8S] #22 FluxCD 계층과 분리 / 다중 클러스터 리소스 공유와 설정 분리
FluxCD - yaml 앞서 fluxcd 를 이용해서 helm chart 를 구성했습니다. 그 외에 일반적인 yaml
k8s에 관해서 gpt랑 얘기를 하고 있다가 talos linux 라는 OS를 알게 되었습니다.
단 50MB 에 29개의 바이너리 파일을 가진 엄청 경량화된 OS 이고, Yaml 과 API를 이용해서 관리를 한다는 점이 매우 매력적으로 들렸습니다.
(그리고 오픈소스 입니다. "Mozilla Public License Version 2.0")
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 동기화 |
자세한 건 아래 글을 확인해 주세요.

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

확실히 디스크와 메모리의 사용량은 압도적으로 적습니다. CPU와 i/o 도 낮은 편이지만 그렇다고 많이 낮은 것은 아니더군요.
https://www.siderolabs.com/blog/which-kubernetes-is-the-smallest/
Talos는 고유 바이너리가 적어서 취약점이 적다는 것을 강조하고 있습니다.
SSH 나 쉘, 패키지 관리자 등 접근할 방법 자체가 적은 것도 있습니다.
루트 파일 시스템을 읽기 전용으로 마운트해서 시스템 파일의 변조를 막습니다.
kubelet을 root 로 실행하지 않고, 새로운 namespace를 만들어서 실행합니다.
(그래서 폴더를 링크해줘야 사용할 수 있습니다. )
Talos를 처음 찾아봤을 때 누가 가장 쉬운 k8s 구성 방법이라고 적어놓은 글을 봤습니다만, 처음 구성할 때는 어려웠습니다.
자료도 많이 없는데, 업데이트에 따라 API 명령어도 좀 바뀌는 게 있어서 gpt를 사용해도 자료를 찾기가 힘들더라구요.
다른 OS를 설치할 때처럼 ISO 이미지로 USB 드라이브를 만들어 줍니다.
아래 공식 github Release 에서 알맞은 iso 파일을 사용합니다.
(부팅 USB를 제작하는 방법은 아시리라 믿습니다. 저는 ventoy 사용 중입니다.)
talos는 SSH 같은 원격 접속이나 UI 없이 talosctl 을 이용합니다.
윈도우는 위의 release 페이지에 같이 있습니다.
brew install siderolabs/tap/talosctl
curl -sL https://talos.dev/install | sh
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>수정이 꼭 필요한 부분이 하나 있습니다. OS 를 설치할 disk 의 정보를 수정해 줘야 합니다.
설치할 기기의 정보를 알기 위해 USB를 이용해 Talos OS를 부팅해 줍니다.
부팅 후 Connectivity 에 녹색 체크표시 가 뜨면 talos API를 사용할 수 있습니다.
해당 node의 IP와 nameserver 가 나타나게 됩니다.

disk의 os 설치 경로를 정하기 위해서 disk 확인은 필수입니다.
talosctl get disks -n <node ip> --insecurenode 에 연결된 disk 의 list 를 확인할 수 있습니다.
yaml 파일에서 machine > install > disk 부분을 수정합니다.
disk 위치에 따라 "/dev/nvme0n1" 로 수정해 줍니다.
Controlplane node 의 정보로 controlplane.yaml 파일을 수정하고 나면
Worker node 의 worker.yaml 도 수정해 줍니다.
node가 여러개라면 파일도 여러개 만들어 줍니다.
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 설정하면서 동시에 진행해도 됩니다. )
# 모든 노드에
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


위에서 작성한 글대로 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 로 설정하면 됩니다.
talosctl dmesg -n <node ip> > ./dmesg.log
talosctl logs kubelet -n <node ip> > ./kubelet.logtalosctl reset -n <node ip>
Comments