테크믈리에의 리뷰 공간

Talos Linux를 통한 간편한 Production Level K8S 환경 구축하기 - 1 - 본문

프로그래밍|소프트웨어/Talos Linux

Talos Linux를 통한 간편한 Production Level K8S 환경 구축하기 - 1 -

테크믈리에 2024. 8. 1. 14:56

https://www.talos.dev/v1.7/introduction/getting-started/

 

Getting Started

A guide to setting up a Talos Linux cluster.

www.talos.dev

 

Talos Linux는 Sidero Labs에서 개발한 K8S 특화형 Linux 배포판이다.

 

특징으로는

1. SSH 접속 등 전통적인 리눅스 접근 방식 대신 talosctl이라는 자체 프로그램을 통해서만 노드를 다룰 수 있게 되어 있으며, 모든 연결은 mTLS 인증을 기반으로 동작하기 때문에 보안면에서 관리자가 신경쓸 부분이 적다.

 

2. Production Level의 안정적인 K8S 구축을 위해서 기존에는 RHEL의 CoreOS나 SUSE의 MicroOS등 보다 마이너한 불변성 OS를 갖고 네트워크 설정, 디스크 파티션 설정, 그래픽 카드 및 각종 드라이버 설치 등의 OS 설정도 전부 수동으로 해줘야하는 등 불편하고 어려운 부분이 많았지만, Talos Linux는 설치하는 단계에서 K8S 동작에 가장 적합한 OS 설정을 자동으로 해주기 때문에 보다 편하고 신뢰할 수 있다.

 

3. 기존 블로그에서 K0S 등을 다뤄봤던 이유는 번거로운 CNI 설정 부분을 간편하게 건너뛰고 작업하여 소수 작업자에 의한 K8S환경 구축 및 유지 보수를 편하게 해보기 위해서였는데, Talos Linux는 Flannel CNI를 자동으로 최적화하여 설치해주기 때문에 해당 목적에 부합하다.

 

4. DDNS 또는 Virtual IP 등을 통하여 단 몇 줄만의 설정으로 복수의 Control Plane을 쉽게 Load Balancing 하게끔 도와주며 Wireguard 기반으로 다른 개인 네트워크 영역에 속해있는 노드들을 묶을 수 있게 도와준다.

 

설치 파일의 경우, 만약 NVIDIA GPU 지원이나 Proxmox/VMWare 등 위에서 돌리기 위한 가상 환경 지원 등의 시스템 확장 프로그램이 필요하지 않다면 위의 Getting Started 링크에서 본인에게 맞는 버전으로 다운받으면 된다.

 

시스템 확장 프로그램이 필요한 경우에는 https://www.talos.dev/v1.7/talos-guides/install/boot-assets/ 해당 링크를 통하여 본인에게 필요한 시스템 확장을 추가한 설치파일 및 해당 파일의 ID를 발급받으면 된다.

 

설치 가능한 확장 목록은 다음 링크를 참고하면 된다. https://github.com/siderolabs/extensions

 

GitHub - siderolabs/extensions: Talos Linux System Extensions

Talos Linux System Extensions. Contribute to siderolabs/extensions development by creating an account on GitHub.

github.com

 

우선은 준비한 설치파일을 USB / PXE Boot 등을 통하여 설치하고자 하는 노드에서 실행해주도록 한다.

이 때, Talos Linux를 설치하고자 하는 노드에서 고정 IP를 제대로 먹이기 위해서는 공유기 단에서 MAC 주소를 기반으로 고정 IP 설정 해놓는 것을 추천한다. (Talos Linux 설정을 통해서도 고정 IP를 할당할 수 있지만, 이 경우 Control Node의 VIP 설정 시 문제가 발생하는 것을 확인하였다.)

 

본인은 https://www.ventoy.net/en/index.html를 사용하여 부팅 디스크를 만들고, 안에 Lubuntu와 같은 가벼운 리눅스 배포판을 같이 넣어두는 것을 추천한다.

 

그러면 Talos Linux로 부팅하기 전에 리눅스로 먼저 진입하여 ip addr 명령어로 MAC 주소를 확인하여 공유기 단 고정 IP 설정을 위한 MAC 주소를 확인할 수 있고 Rook Ceph나 OpenEBS Maystor 같이 Unformatted, Unpartitioned 저장장치를 필요로 하는 CSI를 쓸 경우를 위해 설치 전 저장장치들의 검토 및 재설정을 해줄 수 있기 때문이다. Talos Linux도 하드디스크 Wipe & Partition & Mount 기능들을 제공하기는 하지만 오직 XFS 타입으로 포맷하여 특정 경로에 마운트해주는 정도이기 때문에 사용하던 장비를 Unformatted, Unpartitioned 상태로 되돌리는 것에는 한계가 있다.

 

모든 준비를 마친 다음 Talos Linux로 부팅을하면 다음과 같은 화면이 반겨줄 것이다. 이 상태에서 키보드 조작을 하려고 하면 F1/F2/F3를 제외한 나머지 동작은 로그 갱신에 문제를 일으킨다던지 하는 문제가 있기 때문에 노드에 연결된 키보드는 살포시 치워두는 것을 권장한다.

 

이제 Linux나 Mac 기반의 관리자 컴퓨터를 준비하여 주도록 하자.

brew install siderolabs/tap/talosctl

Talos Linux 노드들을 관리하기 위해서는 talosctl이란 프로그램이 필수인데, 이는 brew를 통해서 배포된다.

talosctl gen secrets -o secrets.yaml
talosctl gen config --with-secrets secrets.yaml \
                    --kubernetes-version <버전> \
					<클러스터 이름> <클러스터 Endpoint>

talosctl 설치 후에는 위의 명령어를 통하여 mTLS 연결을 위한 인증서를 생성하고 이를 기반으로 Talos Linux의 기본 설정 파일들을 생성하도록 하자.

 

여기서 클러스터 EndpointHA-Proxy / Nginx 등의 Reverse Proxy 기능을 통하여 Control Plane들로 연결될 DDNS 주소를 적어주거나 혹은 Virtual IP로 사용될 IP 기반 주소를 적어주도록 하자.

 

결과물로 나오는 controlplane.yamlworker.yaml은 모든 노드 설정에 쓰일 템플릿 설정 파일이며 talosconfig 파일은 해당 클러스터 내 노드들에 talosctl로 접속하기 위해 필요한 인증파일이다. 아직 한번도 설정되지 않은 노드의 경우에는 talosconfig 없이 --insecure 옵션으로 접속이 가능하지만 한번 설정된 다음부터는 해당 클러스터의 talosconfig 파일 없이는 접속이 안 된다.

 

talosctl -n <노드 IP> disks --insecure

우선은 설치할 경로 파악을 위해 위 명령어로 어떠한 저장 장치들이 해당 노드 내에 꽂혀있는지 확인하여 주도록 하자.

본인의 경우 해당 노드에서는 /dev/sdc 상의 SSD를 OS 설치 장소로 사용할 예정이다.

 

talosctl get address -n <노드 IP> address --insecure

 

 

그 다음에는 위 명령어를 통하여 어떤 네트워크 어댑터들이 있는지 확인을 한 다음, 어떤 어댑터를 통신에 사용할 것인지 정하도록 하자.

 

전부 확인이 끝났다면, 아래 링크와 본인이 작성하여둔 템플릿을 참고하여 본인만의 .patch 파일을 만들어보도록 하자.

https://www.talos.dev/v1.7/reference/configuration/v1alpha1/config/

 

Config

Config defines the v1alpha1.Config Talos machine configuration document.

www.talos.dev

 

# Control Plane용 .patch 파일

machine:
  kubelet:
    nodeIP:
      validSubnets:
        -  <본인의 IP 대역>
        # 본인이 사용할 IP 대역에 맞게 설정하도록 하자.
        # 보통 많이 쓰는 사설 IP 대역인 192.168.0.1 ~ 192.168.0.255의 경우 아래와 같다.
        # - 192.168.0.1/24
    
    # 만약 Metrics Server를 클러스터 내에서 사용하고 싶다면 노드 간 인증서를 교환하도록 하여야 한다.
    # 자세한건 아래 링크를 참고하도록 하자.
    # https://www.talos.dev/v1.7/kubernetes-guides/configuration/deploy-metrics-server/    
    # extraArgs:
      # rotate-server-certificates: true

  network:
    interfaces:
    # 아래 interface 항목에는 앞서 get address 명령어로 확인한 LINK 이름을 적어주도록 하자. (ex. eno1)
    - interface: eno1
      # 만약 Shared VIP를 기반으로 동작하게 하고 싶다고 한다면 
      # 무조건 공유기 단에서 MAC을 기반으로 고정 IP를 설정한 다음
      # Talos Control Plane 설정에서는 고정 IP 설정을 하지 않아야 한다.
      # 만약 고정 IP 설정을 하게 되면 Shared VIP와 충돌이 생기는 것 같다.
      dhcp: true
      # Shared VIP일 때는 아래와 같이 vip 항목을 만들어줘야하고 해당 IP는 실제로 점유되지 않은 IP여야 한다.
      # 또한, vip 값은 모든 control plane 노드가 똑같은 값을 공유하여야 한다.
      vip:
        ip: <본인의 가상 IP>
        # ex) ip: 192.168.0.100
    
    # 본인의 클러스터에서 사용할 Name Server 목록
    # nameservers:
      # - 192.168.0.1
      # - 8.8.8.8
      # - 8.8.4.4
      # - 1.1.1.1
      
    # 본인 클러스터 내에서 해당 노드가 사용할 hostname
    # 절대로 겹치는 hostname을 사용하면 안 된다.
    # hostname: control-1
    
    # 클러스터 내 노드들에 대하여 hostname 기반 통신을 할 수 있게 등록
    # 본인은 무조건 control plane은 3개를 고정적으로 사용할 생각이기에 control plane 3개는 등록해놨다.
    # extraHostEntries:
    #   - ip: 192.168.0.101
    #     aliases:
    #       - control-1
    #   - ip: 192.168.0.102
    #     aliases:
    #       - control-2
    #   - ip: 192.168.0.103
    #     aliases:
    #       - control-3
  
  # Talos OS가 설치되었으면 하는 경로
  # 앞서 disks 옵션으로 확인하였던 것을 참조하자
  install:
  	disk: <설치할 디스크 경로>
    # ex) disk: /dev/sda
    wipe: true
    
  # 사설 Docker Registry 접속 정보를 등록하고자 하는 경우
  # registries:
    # config:
      # <사설 Docker Registry 주소 (https 등 붙는 것 없이)>:
        # auth:
          # username: <사설 Docker Registry ID>
          # password: <사설 Docker Registry PWD>

cluster:
  # API 서버의 인증서에서 사용될 alternative name
  # 아마 control plane 노드들의 IP를 등록하여두면 도움이 되는거 같다.
  # apiServer:
    # certSANs:
      # - 192.168.0.101
      # - 192.168.0.102
      # - 192.168.0.103
      
  # Talos Linux의 기본 ETCD 가용 용량은 2GiB로 설정되어 있다.
  # 권장하는 Maximum 값은 8GiB로, 2~8GiB 사이에서 본인 필요에 따라 가용 용량을 조절하여 설치할 수 있다.
  # 아래 예시는 4GiB로 설정하는 설정값이다.
  # etcd:
  #   extraArgs:
  #     quota-backend-bytes: 4294967296

 

# Worker Node용 .patch

machine:
  kubelet:
    nodeIP:
      validSubnets:
        - <본인이 사용할 IP 대역>
        
    # extraArgs:
    #   rotate-server-certificates: true

  network:
    interfaces:
    - interface: <본인 네트워크 인터페이스>
      # Worker 노드의 경우, Shared VIP일 때의 Control Plane과 달리 Talos에서 고정 IP를 할당하여도 문제가 없다.
      addresses:
        - <고정 IP/Subnet mask>
        # ex) - 192.168.0.105/24
      # 고정 네트워크 설정 시 Network Route 정보를 주는 것도 고려해볼 수 있다.
      # 아래는 예시다.
      # routes:
      #   - network: 0.0.0.0/0
      #     gateway: 192.168.0.1
      
    # nameservers:
    #   - 192.168.0.1
    #   - 8.8.8.8
    #   - 8.8.4.4
    #   - 1.1.1.1
    
    # hostname은 반드시 각 노드가 다른 값을 쓰도록 해주자
    hostname: worker-1
    
    # extraHostEntries:
    #   - ip: 192.168.0.101
    #     aliases:
    #       - control-1
    #   - ip: 192.168.0.102
    #     aliases:
    #       - control-2
    #   - ip: 192.168.0.103
    #     aliases:
    #       - control-3

  install:
    disk: <설치할 저장장치>
    wipe: true
    # 만약 Nvidia 그래픽카드 지원이라던가 ISCSI 등의 모듈을 사용하고 싶은 경우, 알맞은 image 옵션을 반드시 줘야한다.
    # 이미지를 생성하는 방법은 아래 링크를 참조하자. (Image Factory 참고)
    # https://www.talos.dev/v1.7/talos-guides/install/boot-assets/
    # WEB GUI를 기반으로 이미지를 생성해보려면 아래 링크에서 생성하자
    # https://factory.talos.dev
    # 사용 가능한 시스템 확장들은 아래와 같다.
    # https://github.com/siderolabs/extensions
    # 아래 예시는 iscsi, nvidia driver를 추가하여 만든 본인의 이미지 예시이다.
    # image: factory.talos.dev/installer/aefe418d4647eb3ecb93d2c5d583c663aa54c790165493b0414bf01442d93897:v1.7.5

  # registries:
  #   config:
  #     <사설 Docker Registry>:
  #       auth:
  #         username: <사설 Docker Registry ID>
  #         password: <사설 Docker Registry PWD>

# cluster:
#   apiServer:
#     certSANs:
#       - 192.168.0.101
#       - 192.168.0.102
#       - 192.168.0.103

 

각 노드별로 .patch 파일 작성을 완료하였다면 아래 명령어셋을 참고하여 각 노드들에 설정을 적용하고 Talos Linux 설치를 진행한다.

# Control Plane의 경우
talosctl machineconfig patch controlplane.yaml --patch @<패치 파일명> --output <출력 파일명> 

# Worker의 경우
talosctl machineconfig patch worker.yaml --patch @<패치 파일명> --output <출력 파일명>

# 설정파일 적용
talosctl apply-config --insecure -n <노드 IP> --file <설정 파일명>

 

 

Talos Linux Cluster를 활성화 하기 위해서는 해당 Cluster 내 Control Plane들 중 하나의 노드에 Bootstrap 신호를 보내야만 한다.

유의할 것은, 정확히 한 개의 노드에서 Bootstrap 과정이 일어나야한다는 것이다.

talosctl bootstrap --nodes <Bootstrap할 Control Plane 노드 IP> --endpoints <Control Plane 노드들의 IP를 ,으로만 구분지어 넣어준다> --talosconfig=talosconfig

 

모든게 성공적이었다면, 모든 노드들에서 READY값이 True가 되는 것을 확인할 수 있을 것이다.

혹은 아래 명령어로 상태 점검을 해볼 수 있다.

 

talosctl --nodes <control plane 노드 IP> --endpoints <control plane 노드 IP> health --talosconfig=talosconfig

(참고로 Talos Linux만 막 설치하고 아무런 Pod도 올리지 않았다면 missing static pods on node란 문제가 나올 수 있는데 당연한 상태이니 무시하여도 괜찮다.)

 

만약, Nvidia Driver 모듈을 추가로 넣은 이미지로 Talos Linux를 설치한 경우, 해당 노드의 대시보드에 계속하여 nvidia 관련 오류가 출력되며 READY가 FALSE인 상태를 계속 유지할 것인데, 해당 이슈는 다음 글을 통하여 해결 방법을 설명하도록 하겠다.

 

또한, 기본적으로 Talos Linux는 Pod Security가 엄격하게 적용되어 있기에 필요한 프로그램을 올리는데 문제가 있을 수 있는데, 해당 해결 방법 역시 다음 글을 통해 설명할 것이며, metrics server 동작을 위하여 rotate-server-certificates 옵션을 준 경우에는 TLS 관련 오류가 발생할 것인데 이 역시 다음 글에서 설명하도록 하겠다.

Comments