테크믈리에의 리뷰 공간

[k0s Cluster 구축] 1. Ansible을 통한 기초 세팅 본문

프로그래밍|소프트웨어/K0S

[k0s Cluster 구축] 1. Ansible을 통한 기초 세팅

테크믈리에 2023. 11. 21. 10:56

 

Ansible이란

 

Ansible 공식 홈페이지: https://www.ansible.com

 

Ansible is Simple IT Automation

Ansible is the simplest way to automate apps and IT infrastructure. Application Deployment + Configuration Management + Continuous Delivery.

www.ansible.com

 

Ansible은 RedHat에서 개발 중인 환경 구성 자동화 도구로 SSH를 기반으로 하여 타겟 노드들에 자동으로 명령을 내리고 그 값을 처리할 수 있는 도구이다. 기존 .sh 파일을 사용하던 Bash Shell Script와는 달리 Yaml 파일을 사용하여 플레이북이라 불리는 명령어 셋을 정의하게 되며, 이를 인벤토리에 정의된 host 들에 전달하는 방식으로 동작한다.

 

k0s 환경을 본격적으로 구성하려 한다면 최소 3대 이상의 컴퓨터를 설치하게 될텐데, 이를 일일히 설정해주는 것은 매우 번거롭기 때문에 Ansible을 통해 자동으로 환경 구축하는 것이 여러모로 편할 것이다.

 

(Host) Mac / Ubuntu OS 등에 Ansible 설치

 

우선은 명령을 내릴 컴퓨터에 Ansible을 설치하도록 한다.

Ansible은 Python을 기반으로 동작하기에 Python 3가 깔려있다면 아래의 명령어로도 간단하게 설치가 된다.

pip3 install ansible

 

 

(Client) Rocky Linux에 의존 패키지 및 Ansible 설치 (Client)

 

그 다음에는 k0s를 운용할 컴퓨터에도 Ansible을 설치해주도록 한다.

Rocky Linux나 CentOS 계열에서는 epel-release에 ansible이 포함되어 있으며, 이를 설치하면 알아서 Python3도 설치해준다.

sudo dnf update -y
sudo dnf install epel-release -y
sudo dnf install ansible -y

 

설치가 끝난 다음 Ansible 동작 확인은 아래 명령어로 해보도록 한다.

ansible --version

 

 

 

Ansible 설정

 

이제 남은 것은 Host에서 Client들에게 명령을 내릴 수 있게 SSH 연결을 설정하는 것이다.

우선은 Host에서 SSH 연결에 쓰일 암호키를 생성하도록 하자.

ssh-keygen

 

그 다음, 해당 암호키를 Client에 전송하기 위해 아래 명령어를 실행하도록 한다.

ssh-copy-id <관리자 계정>@<타겟 IP>

 

k0s는 기본적으로 동작하는데 루트 권한을 요구하기 때문에 관리자 계정에는 root를 적어주는 것이 여러모로 편할 것이다.

(몇몇 명령어는 디폴트 상황에서는 sudo 명령어와 함께 사용하여도 동작하지 않는다. 때문에 아래 root 계정 기반으로 작성된 ansible 플레이북은 동작하지 않을 수 있다.)

 

만약 root 외의 계정으로 ansible을 사용하고자 한다면 아래 명령어를 통해 암호 없이도 sudo를 사용할 수 있게 해주자.

(아래 명령어는 해당 관리자 계정으로 SSH 접속하여 실행하도록 한다.)

echo "$(whoami) ALL=(ALL) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/$(whoami)

 

 

그 다음, Host에서 아래 명령어를 실행하여 ansible 설정 폴더를 만들도록 한다.

sudo mkdir -p /etc/ansible

 

/etc/ansible/hosts 파일을 생성하여 아래의 양식으로 관리할 Client 정보를 작성한다. 만약 전역 설정으로 관리하고 싶지 않다면 Ansible Inventory 관련 내용을 읽어보고 따로 관리하도록 하자.

[<그룹이름>]
<client IP 1> ansible_user=<관리자 계정> 
<client IP 2> ansible_user=<관리자 계정>

# 예제
# [non-gpu]
# 192.168.0.2 ansible_user=user1
# 192.168.0.3 ansible_user=user2
#
# [gpu]
# 192.168.0.4 ansible_user=user3
# 192.168.0.5 ansible_user=user4

 

작성이 끝난 다음 아래 명령어를 통해 접속 가능 여부를 확인할 수 있다.

ansible -m ping <그룹이름>

 

Ansible 스크립트

 

이제 전체 노드들을 설정할 준비는 끝났다.

우선은, k0s를 설치하는 플레이북을 실행해주도록 하자.

자세한 파일 내용 및 실행 방법 등은 아래 접은 글에 들어 있으며, 최하단의 주의 사항을 읽고 실행하도록 하자.

더보기

파일 이름: k0s_setup.yml

실행 방법:

ansible-playbook k0s_setup.yml

 

파일 내용:

---
- name: k0s_setup
  hosts: all
  tasks:
  - name: Disable Swap Memory
    shell: swapoff -a && sed -i '/swap/s/^/#/' /etc/fstab
    become: yes

  - name: Setup NTP
    shell: "echo server <NTP 중앙 서버 IP> | tee -a /etc/chrony.conf"
    become: yes

  - name: Restart NTP
    systemd:
      state: restarted
      name: chronyd
    become: yes
    
  - name: IpTables Setting 1
    shell: |
      cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
      overlay
      br_netfilter
      nf_nat
      xt_REDIRECT
      xt_owner
      iptable_nat
      iptable_mangle
      iptable_filter
      EOF
    become: yes
    
  - name: IpTables Setting 2
    shell: |
      cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
      net.bridge.bridge-nf-call-ip6tables = 1
      net.bridge.bridge-nf-call-iptables = 1
      net.ipv4.ip_forward = 1
      net.ipv4.conf.all.rp_filter = 1
      EOF
    become: yes
    
  - name: Apply IpTables Settings
    shell: sudo sysctl --system
    become: yes

  - name: Add K8S Repository
    shell: |
      cat <<EOF | tee /etc/yum.repos.d/kubernetes.repo
      [kubernetes]
      name=Kubernetes
      baseurl=https://pkgs.k8s.io/core:/stable:/v1.28/rpm/
      enabled=1
      gpgcheck=1
      gpgkey=https://pkgs.k8s.io/core:/stable:/v1.28/rpm/repodata/repomd.xml.key
      EOF
    become: yes
  
  - name: Install latests kubectl
    ansible.builtin.dnf:
      name: kubectl
      state: latest
    become: yes

  - name: Add Docker Repository
    shell: dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
    become: yes
  
  - name: Install Docker / Containerd / Docker-Compose
    ansible.builtin.dnf:
      name: 
        - docker-ce
        - docker-ce-cli
        - containerd.io
        - docker-compose-plugin
      state: latest
    become: yes
  
  - name: Enable Docker service
    systemd:
      name: docker
      enabled: yes
      masked: no
      state: started
    become: yes

  - name: Install latest k0s
    shell: curl -sSLf https://get.k0s.sh | DEBUG=true sh
    become: yes

 

** 파일 내용 중 <NTP 중앙 서버 IP>를 본인의 상황에 맞게 대체하도록 한다.

** 만약 NTP 중앙 서버가 아직 준비되지 않았다면 아래 명령어를 참고하여 NTP 서버를 준비하자

sudo nano /etc/chrony.conf
# 접근할 네트워크 목록 추가
# 예시: allow 192.168.0.1/24

sudo systemctl restart chronyd

# 만약 firewall이 실행중이라면?
firewall-cmd --add-service=ntp --permanent
firewall-cmd --reload

 

만약 Nvidia GPU 노드가 있어서 k0s 환경에서 GPU를 사용하고 싶다면 아래 플레이북을 참고하도록 하자.

더보기

파일 이름: nvidia_setup.yml

실행 방법: 

ansible-playbook nvidia_setup.yml

 

파일 내용:

 

---
- name: nvidia_setup
  hosts: gpu
  tasks:
  - name: Add Nouveau on blacklist
    shell: |
      cat << EOS > /etc/modprobe.d/blacklist-nouveau.conf
      blacklist nouveau
      options nouveau modeset=0
      EOS
    become: yes
  
  - name: Disable Nouveau
    shell: dracut --force
    become: yes

  - name: Restart and Wait
    reboot:
      reboot_timeout: 3600

  - name: Download Nvidia Cuda 12.3 bash
    get_url:
      url: https://developer.download.nvidia.com/compute/cuda/12.3.2/local_installers/cuda_12.3.2_545.23.08_linux.run
      dest: /tmp/cuda_installer.run
      mode: 777
  
  - name: Install Nvidia Driver and Cuda
    shell: sh /tmp/cuda_installer.run --silent --driver --toolkit
    become: yes

  - name: Add Nvidia-Container-Toolkit Repo
    shell: |
      curl -s -L https://nvidia.github.io/libnvidia-container/stable/rpm/nvidia-container-toolkit.repo | \
      sudo tee /etc/yum.repos.d/nvidia-container-toolkit.repo

  - name: Install Nvidia-Container-Toolkit
    ansible.builtin.dnf:
      name: nvidia-container-toolkit
      state: latest
    become: yes

  #- name: Add CUDA to zshrc
  #  shell: |
  #    echo export PATH="/usr/local/cuda-12.2/bin:\$PATH" | tee -a /home/<사용자명>/.zshrc
  #    echo export LD_LIBRARY_PATH="/usr/local/cuda-12.2/lib64:\$LD_LIBRARY_PATH" | tee -a /home/<사용자명>/.zshrc

 

** 파일 내용 중 hosts: gpu는 본인이 /etc/ansible/hosts에서 정의한 그룹 중 GPU를 갖고 있는 그룹 이름으로 변경한다.

** CDUA to zshrc 항목의 경우, 사용자 명을 본인이 생성한 사용자 이름으로 변경한 다음 주석을 풀어 사용하도록 한다.

 

 

Reference

https://linux.how2shout.com/how-to-install-ansible-on-rocky-linux-8-or-almalinux/

Comments