Ubuntu 24.04 에서 APM 설치 및 Let's Encrypt SSL 적용하기 (사이트 기본 구성)

리눅스/APACHE|2024. 9. 13. 11:54
반응형

가장 기본적인 APT 패키지 관리툴로 설치를 진행합니다.

 

 

1. APM 설치

 

# apt-get -y update

# apt-get -y upgrade

# apt-get -y install apache2

# apt-get -y install php8.3 php8.3-mysql

# apt-get -y install mysql-server

# vi /etc/apache2/mods-available/mime.conf

# 아래 내용 추가
AddType application/x-httpd-php .php .htm .html
AddType application/x-httpd-php-source .phps 

 

# vi /etc/php/8.3/apache2/php.ini

; 수정 및 추가
short_open_tag = On
extension=mysqli
extension=pdo_mysql

 

# systemctl restart apache2

 


2. Virtualhost 설정

 

# cd /etc/apache2/sites-enabled

# vi default-ssl.conf

# 추가
ServerName sysdocu.kr
ServerAlias www.sysdocu.kr

 

# vi /etc/apache2/apache2.conf

# /var/www 디렉토리 설정을 찾아서 아래와 같이 수정, 디렉토리가 다를때는 추가
<Directory "/var/www/*">
    Options Indexes FollowSymLinks
    AllowOverride All
    Require all granted
</Directory>

# 404 에러 출력시 웹서버 버전 정보 숨기기
ServerSignature Off
ServerTokens Prod

 

# systemctl restart apache2

 

 

3. Let's Encrypt SSL 설정

 

# apt -y install letsencrypt

# letsencrypt certonly -a webroot --agree-tos -m admin@sysdocu.kr -w /var/www/html -d www.sysdocu.kr --rsa-key-size 4096

 

자동 갱신 설정을 합니다.

# vi /root/ssl-renew.sh

#!/bin/bash
/usr/bin/letsencrypt certonly -a webroot --agree-tos --renew-by-default -w /var/www/html -d www.sysdocu.kr
systemctl restart apache2

 

# chmod 700 /root/ssl-renew.sh

# echo "0 0 1,16 */2 * root sh /root/ssl-renew.sh" >> /etc/crontab

 

 

4. SSL 설정

 

# cd /etc/apache2/sites-enabled

# ln -s ../sites-available/default-ssl.conf .

# vi 000-default.conf

# 추가
ServerName sysdocu.kr
ServerAlias www.sysdocu.kr


# 수정
SSLCertificateFile            /etc/letsencrypt/live/www.sysdocu.kr/cert.pem
SSLCertificateKeyFile    /etc/letsencrypt/live/www.sysdocu.kr/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/www.sysdocu.kr/fullchain.pem 

 

# a2enmod ssl

# systemctl restart apache2

 

 

5. SSL Redirect 설정

 

# a2enmod rewrite

# systemctl restart apache2

# cd /var/www/html

# vi .htaccess

RewriteEngine On
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://www.sysdocu.kr/$1 [R,L]

 

 

6. MySQL 설정

 

MySQL root 패스워드 설정 및 사용자 추가 방법입니다.

 

# mysql -p

(처음에는 패스워드가 없습니다. 그냥 엔터)

 

mysql> use mysql;

mysql> alter user root@localhost identified by '12345678';

mysql> flush privileges; 

 

새 데이터베이스와 계정 생성 후 권한을 부여 합니다.

mysql> create database sysdb;

mysql> create user 'sysuser'@'localhost' identified by '12345678';
mysql> grant all privileges on sysdb.* to 'sysuser'@'localhost';
mysql> flush privileges;

 

테스트를 위해 웹소스 루트 디렉토리 (/var/www/html) 에서 MySQL 계정을 이용한 접속 테스트 PHP 소스 코드를 작성합니다.

# vi test.php

<?
define("DB_HOST", "localhost");
define("DB_USER", "sysuser");
define("DB_PASSWORD", "12345678");
define("DB_NAME", "sysdb");
$conn = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);
if (!$conn) {
    die("Connection failed: " . mysqli_connect_error());
}

$query = "SELECT VERSION()";
$result = mysqli_query($conn, $query);
$row = mysqli_fetch_array($result);
echo "version: " . $row[0];

mysqli_close($conn);
?>

 

웹브라우저를 통해 작성한 PHP 파일에 접근하면 MySQL 과 잘 연동되고 계정이 올바를 경우 아래와 같은 메세지가 출력됩니다.

여기에서는 간단히 curl 을 이용해 테스트 해보겠습니다.

# curl https://www.sysdocu.kr/test.php

version: 8.0.39-0ubuntu0.24.04.2

 

반응형

댓글()

Ubuntu 24.04 에 Prometheus + Grafana 설치하기 (GPU 포함)

리눅스/OS 일반|2024. 9. 5. 11:43
반응형

Prometheus 는 시스템 모니터링 도구로, 서버나 애플리케이션의 성능 데이터를 수집하고 경고를 설정해 문제 발생 시 알림을 주는 역할을 합니다.
Grafana 는 Prometheus 가 수집한 데이터를 시각화해 대시보드로 보여주는 도구로, 다양한 차트와 그래프로 데이터를 쉽게 분석할 수 있게 도와줍니다.
두 도구는 주로 함께 사용되어 실시간 모니터링과 시각화를 제공합니다.

Ubuntu 24.04 서버에 두개의 도구를 설치하고 사용하는 방법에 대해 설명합니다.

 

 

1. 프로메테우스 설치 및 설정

 

프로메테우스 사용자 계정을 생성합니다.

# useradd --no-create-home --shell /bin/false prometheus

 

구성 파일과 라이브러리를 저장할 디렉토리를 생성합니다.

# mkdir /etc/prometheus

# mkdir /var/lib/prometheus

# chown prometheus:prometheus /var/lib/prometheus

 

프로메테우스 바이너리 파일을 다운로드 합니다.

# wget https://github.com/prometheus/prometheus/releases/download/v2.54.1/prometheus-2.54.1.linux-amd64.tar.gz

# tar xvzf prometheus-2.54.1.linux-amd64.tar.gz

# cd prometheus-2.54.1.linux-amd64

# mv console* /etc/prometheus

# mv prometheus.yml /etc/prometheus

# chown -R prometheus:prometheus /etc/prometheus

# mv prometheus /usr/local/bin/

# chown prometheus:prometheus /usr/local/bin/prometheus

 

프로메테우스 시스템 파일을 생성합니다.

# vi /etc/systemd/system/prometheus.service

[Unit]
Description=Prometheus
Wants=network-online.target
After=network-online.target

[Service]
User=prometheus
Group=prometheus
Type=simple
ExecStart=/usr/local/bin/prometheus \
    --config.file /etc/prometheus/prometheus.yml \
    --storage.tsdb.path /var/lib/prometheus/ \
    --web.console.templates=/etc/prometheus/consoles \
    --web.console.libraries=/etc/prometheus/console_libraries

[Install]
WantedBy=multi-user.target

 

변경 사항을 적용합니다.

# systemctl daemon-reload

 

프로메테우스 부팅 가동 설정과 데몬을 실행합니다.

# systemctl enable --now prometheus

 

다음 주소와 같이 웹브라우저에서 접속이 되는지 확인합니다.

http://grafana.sysdocu.kr:9090

 

 

2. Node Exporter 설치

 

# wget https://github.com/prometheus/node_exporter/releases/download/v1.8.2/node_exporter-1.8.2.linux-amd64.tar.gz

# tar xvzf node_exporter-1.8.2.linux-amd64.tar.gz

# mv node_exporter-1.8.2.linux-amd64/node_exporter /usr/local/bin/

 

Node Exporter 계정을 생성합니다.

# useradd -rs /bin/false node_exporter

 

Node Exporter 시스템 파일을 생성합니다.

# vi /etc/systemd/system/node_exporter.service

[Unit]
Description=Node Exporter
After=network.target

[Service]
User=node_exporter
Group=node_exporter
Type=simple
ExecStart=/usr/local/bin/node_exporter

[Install]
WantedBy=multi-user.target

 

변경 사항을 적용합니다.

# systemctl daemon-reload

 

Node Exporter 부팅 가동 설정과 데몬을 실행합니다.

# systemctl enable --now node_exporter

 

 

3. 프로메테우스 설정

 

프로메테우스에 Node Exporter 설정을 합니다.

# vi /etc/prometheus/prometheus.yml

...

scrape_configs:
  - job_name: "node_exporter"
    static_configs:
      - targets: ["localhost:9100"]
    basic_auth:
      username: 'promadmin'
      password: '12345678'

 

데몬을 재시작하여 설정을 적용합니다.

# systemctl restart prometheus

 

 

4. Grafana 설치

 

다음 명령어로 Grafana GPG 키를 추가합니다.

# wget -q -O - https://packages.grafana.com/gpg.key | sudo apt-key add -

 

그라파나 저장소를 추가하고 설치를 진행합니다.

# add-apt-repository "deb https://packages.grafana.com/oss/deb stable main"

# apt -y update

# apt -y install grafana

 

부팅 실행 설정과 동시에 가동해줍니다.

# systemctl enable --now grafana-server

 

이제 웹브라우저에서 그라파나 대시보드에 접속할 수 있습니다.

주소는 아래와 같고, 기본 관리자 계정은 admin / admin 입니다.

로그인시 비밀번호 변경을 권장하고 있으므로, 바로 변경하여 보안을 강화하세요.

http://grafana.sysdocu.kr:3000

 

 

5. 프로메테우스와 그라파나 연결

 

다음은 프로메테우스 데이터 소스를 가져와 대시보드로 출력하는 과정입니다.

그라파나 대시보드에 로그인하여 아래 메뉴를 따라 이동합니다.

- Home > Connections > Data sources

열린 페이지에서 계속 진행

[ Add data source ] 클릭 > [ Prometheus ] 클릭

- Prometheus server URL : http://grafana.sysdocu.kr:9090

- Authentication methods : Basic authentication (선택), User, Password 입력 (prometheus.yml 에서 입력한 promadmin / 12345678)

- TLS settings : Skip TLS certificate validation (체크)

 

페이지 맨 하단의 [Save & test] 버튼을 눌러 이상이 없어야 합니다.

 

아래 메뉴를 따라 이동하여 대시보드 모니터링 스타일을 설정합니다.

- Dashboard > 열린 페이지에서 우측 상단 [New] 를 누르면 Import 가 보입니다. 이를 클릭합니다.

가운데 Grafana.com 의 대시보드 ID 를 넣을 수 있습니다. '15172' 를 입력하고 로드 합니다.

맨 아래 메뉴 'Select a Prometheus data source' 에서 'Prometheus' 선택 후 [Import] 를 누릅니다.

 

마지막으로, 아래 메뉴를 따라 선택하면 선택한 스타일의 대시보드에 데이터 소스값이 출력됩니다.

- Dashboards > (리스트에서) Node Exporter for Prometheus Dashboard based on 11074 > 'Resource Details: [grafana.sysdocu.kr]' 을 눌러 아래로 펼칩니다.

 

* 대시보드 레이아웃 제공 : https://grafana.com/grafana/dashboards/

 

 

※ GPU 서버 메트릭 수집

[참고] https://medium.com/@smda1215/nvidia-gpu-metrics-performance-monitor-in-grafana-prometheus-3a4bc7198cf9

 

NVIDIA GPU 서버를 모니터링 할 경우 아래와 같이 셋팅 합니다.

 

1) NVIDIA 드라이버 및 CUDA 설치

 

현재 시스템에서 사용 가능한 NVIDIA 드라이버 버전을 확인합니다.

# apt -y update

# apt -y install ubuntu-drivers-common alsa-utils

# ubuntu-drivers devices
udevadm hwdb is deprecated. Use systemd-hwdb instead.
udevadm hwdb is deprecated. Use systemd-hwdb instead.
udevadm hwdb is deprecated. Use systemd-hwdb instead.
udevadm hwdb is deprecated. Use systemd-hwdb instead.
udevadm hwdb is deprecated. Use systemd-hwdb instead.
udevadm hwdb is deprecated. Use systemd-hwdb instead.
udevadm hwdb is deprecated. Use systemd-hwdb instead.
udevadm hwdb is deprecated. Use systemd-hwdb instead.
== /sys/devices/pci0000:64/0000:64:00.0/0000:65:00.0 ==
modalias : pci:v000010DEd00001E82sv000010DEsd000012B0bc03sc00i00
vendor   : NVIDIA Corporation
model    : TU104 [GeForce RTX 2080]
driver   : nvidia-driver-470 - distro non-free
driver   : nvidia-driver-550 - distro non-free recommended
driver   : nvidia-driver-535 - distro non-free
driver   : nvidia-driver-470-server - distro non-free
driver   : nvidia-driver-535-open - distro non-free
driver   : nvidia-driver-535-server - distro non-free
driver   : nvidia-driver-535-server-open - distro non-free
driver   : nvidia-driver-550-open - distro non-free
driver   : xserver-xorg-video-nouveau - distro free builtin

 

여기에서는 출력된 목록에서 추천 표시된 버전으로 설치해 보겠습니다.

# apt -y install nvidia-driver-550

 

설치가 되었으면 리부팅을 합니다.

# reboot

 

설치를 확인합니다.

(우측 상단 CUDA 버전 확인 필요)

# nvidia-smi

 

이어서 CUDA 를 설치합니다.

아래 URL 에서 미리 체크한 CUDA 버전을 선택하면 설치 방법이 안내 됩니다.

참고로, 마지막 선택 (Install Type) 에서 runfile 을 선택하면 설치가 간단해 집니다.

https://developer.nvidia.com/cuda-toolkit-archive

 

설치 방법을 따라 설치를 하면 됩니다. (Install Type 을 runfile 로 선택하면 설치가 간단해 집니다)

Ubuntu 24.04 버전은 최근에 출시되어 그런지 버전이 나와있지않아 22.04 버전으로 선택하여 설치하였습니다.

# wget https://developer.download.nvidia.com/compute/cuda/12.4.1/local_installers/cuda_12.4.1_550.54.15_linux.run

# sh cuda_12.4.1_550.54.15_linux.run

 

처음 설치 화면이 뜨기까지 시간이 걸릴 수 있으며, 설치 과정은 Continue 선택 > accept 입력 > (미리 설치했으므로) 'Driver' 제외 및 나머지 기본값으로 Install 입니다.

파일 사이즈가 크기 때문에 여기에서도 시간이 다소 소요됩니다.

 

CUDA 설치가 완료되면, ~/.bashrc 파일에 경로를 추가하여 CUDA 바이너리에 접근할 수 있도록 합니다.

# echo 'export PATH=/usr/local/cuda-12.4/bin:$PATH' >> ~/.bashrc

# echo 'export LD_LIBRARY_PATH=/usr/local/cuda-12.4/lib64:$LD_LIBRARY_PATH' >> ~/.bashrc

# source ~/.bashrc

 

설치된 CUDA 버전을 확인합니다.

# nvcc -V

nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2024 NVIDIA Corporation
Built on Thu_Mar_28_02:18:24_PDT_2024
Cuda compilation tools, release 12.4, V12.4.131
Build cuda_12.4.r12.4/compiler.34097967_0

 

2) NVIDIA GPU Exporter 설치

 

# wget https://github.com/utkuozdemir/nvidia_gpu_exporter/releases/download/v1.2.1/nvidia-gpu-exporter_1.2.1_linux_amd64.deb

# dpkg -i nvidia-gpu-exporter_1.2.1_linux_amd64.deb

 

OS 가 다른 경우, 또는 다른 버전의 패키지를 설치할 경우 배포 사이트를 방문해 보세요.

https://github.com/utkuozdemir/nvidia_gpu_exporter/releases

 

설치된 명령어가 확인됩니다.

# ll /usr/bin/nvidia_gpu_exporter 
-rwxr-xr-x 1 root root 10367128 Jun 28 21:45 /usr/bin/nvidia_gpu_exporter*

 

서비스 파일을 아래와 같이 생성합니다.

NVIDIA GPU Exporter 서비스의 기본 포트는 9835 입니다.

# vi /etc/systemd/system/nvidia_gpu_exporter.service

[Unit]
Description=Nvidia GPU Exporter
After=network-online.target

[Service]
Type=simple

User=nvidia_gpu_exporter
Group=nvidia_gpu_exporter

ExecStart=/usr/bin/nvidia_gpu_exporter

SyslogIdentifier=nvidia_gpu_exporter

Restart=always
RestartSec=1

[Install]
WantedBy=multi-user.target

 

변경 사항을 적용, 부팅 가동 설정 및 데몬 시작을 합니다.

# systemctl daemon-reload

# systemctl enable --now nvidia_gpu_exporter.service

 

웹브라우저를 통해 서비스가 잘 동작하는지 확인합니다.

http://grafana.sysdocu.kr:9835/metrics

 

3) 프로메테우스 설정

 

Nvidia GPU 매트릭을 출력할 준비가 되었습니다.

그라파나 대시보드에서 메트릭을 수집할 수 있도록 프로메테우스 설정을 변경 합니다.

# vi /etc/prometheus/prometheus.yml

...

scrape_configs:
  - job_name: 'node_exporter'
    static_configs:
      - targets: ['localhost:9835']
    basic_auth:
      username: 'promadmin'
      password: '12345678'

 

변경된 설정을 적용하기 위해 데몬을 재시작 합니다.

# systemctl restart prometheus

 

4) 그라파나 대시보드 설정

 

그라파나에서 소스데이터와 대시보드를 추가합니다.

그라파나 대시보드에 로그인하여 아래 메뉴를 따라 이동합니다.

- Home > Connections > Data sources

열린 페이지에서 계속 진행

[ Add data source ] 클릭 > [ Prometheus ] 클릭

- Prometheus server URL : http://grafana.sysdocu.kr:9090

- Authentication methods : Basic authentication (선택), User, Password 입력 (prometheus.yml 에서 입력한 promadmin / 12345678)

- TLS settings : Skip TLS certificate validation (체크)

 

페이지 맨 하단의 [Save & test] 버튼을 눌러 이상이 없어야 합니다.

 

아래 메뉴를 따라 이동하여 대시보드 모니터링 스타일을 설정합니다.

- Dashboard > 열린 페이지에서 우측 상단 [New] 를 누르면 Import 가 보입니다. 이를 클릭합니다.

가운데 Grafana.com 의 대시보드 ID 를 넣을 수 있습니다. '14574' 를 입력하고 로드 합니다.

맨 아래 메뉴 'Select a Prometheus data source' 에서 'Prometheus' 선택 후 [Import] 를 누릅니다.

 

마지막으로, 아래 메뉴를 따라 선택하면 선택한 스타일의 대시보드에 데이터 소스값이 출력됩니다.

- Dashboards > (리스트에서) Nvidia GPU Metrics 를 누르면 대시보드가 출력됩니다.

 

* NVIDIA 를 기준으로 하였지만, Tesla 도 되는듯 합니다.

 

반응형

댓글()

RockyLinux 9 에 Prometheus + Grafana 설치하기 (GPU 포함)

리눅스/OS 일반|2024. 9. 3. 16:08
반응형

Prometheus 는 시스템 모니터링 도구로, 서버나 애플리케이션의 성능 데이터를 수집하고 경고를 설정해 문제 발생 시 알림을 주는 역할을 합니다.
Grafana 는 Prometheus 가 수집한 데이터를 시각화해 대시보드로 보여주는 도구로, 다양한 차트와 그래프로 데이터를 쉽게 분석할 수 있게 도와줍니다.
두 도구는 주로 함께 사용되어 실시간 모니터링과 시각화를 제공합니다.

RockyLinux 9 서버에 두개의 도구를 설치하고 사용하는 방법에 대해 설명합니다.

 

 

1. Grafana 설치

 

그라파나 리포지토리를 설정하기 전에 아래 명령을 실행하여 기본 암호화 정책 백엔드를 'SHA1' 로 설정하고 서버를 재부팅하여 변경 사항을 적용합니다.

# update-crypto-policies --set DEFAULT:SHA1

# reboot

 

부팅이 완료되면 리포지토리를 추가합니다.

# vi /etc/yum.repos.d/grafana.repo

[grafana]
name=grafana
baseurl=https://rpm.grafana.com
repo_gpgcheck=1
enabled=1
gpgcheck=1
gpgkey=https://rpm.grafana.com/gpg.key
sslverify=1
sslcacert=/etc/pki/tls/certs/ca-bundle.crt

 

그라파나를 설치합니다.

# dnf -y install grafana

 

설치가 완료되면 변경된 systemd 상태를 다시 불러옵니다.

# systemctl daemon-reload

 

부팅 실행 설정과 동시에 가동해줍니다.

# dnf -y install chkconfig

# systemctl enable --now grafana-server

 

 

2. Grafana 설정

 

# cp -arp /etc/grafana/grafana.ini /etc/grafana/grafana.ini.ori

# vi /etc/grafana/grafana.ini

[server]

# 바인딩 할 IP 주소
http_addr = 127.0.0.1

# 사용할 http 포트
http_port = 3000

# 브라우저에서 grafana 에 접근할 도메인 이름
domain = grafana.sysdocu.kr

 

그라파나 데몬을 재시작하여 적용합니다.

# systemctl restart grafana-server

 

 

3. Nginx 설치

 

Nginx 웹 서버를 설치하고 Grafana 서버의 역 프록시로 구성합니다.

# dnf -y install nginx

 

그라파나 도메인 설정을 추가합니다.

설정 내용중에 SSL 인증서와 키는 미리 생성해놓은 Let's Encrypt SSL 을 이용하였으며, 인증서 발급 과정은 생략하였으니 다음 URL 을 확인하여 진행하시기 바랍니다.

- Let's Encrypt SSL 인증서 생성 :  https://sysdocu.tistory.com/1710

 

# vi /etc/nginx/conf.d/grafana.conf

# Grafana Live WebSocket 연결을 프록시하는 데 필요
map $http_upgrade $connection_upgrade {
  default upgrade;
  '' close;
}

server {
    listen      80;
    server_name grafana.sysdocu.kr;
    rewrite     ^   https://$server_name$request_uri? permanent;
}

server {
  listen      443 ssl http2;
  server_name grafana.sysdocu.kr;

  root /usr/share/nginx/html;
  index index.html index.htm;

  ssl_certificate /etc/nginx/ssl/grafana.sysdocu.kr/fullchain1.pem;
  ssl_certificate_key /etc/nginx/ssl/grafana.sysdocu.kr/privkey1.pem;

  access_log /var/log/nginx/grafana-access.log;
  error_log /var/log/nginx/grafana-error.log;

  location / {
    proxy_set_header Host $http_host;
    proxy_pass http://localhost:3000/;
  }

  # Grafana Live WebSocket 연결 프록시
  location /api/live {
    rewrite  ^/(.*)  /$1 break;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $connection_upgrade;
    proxy_set_header Host $http_host;
    proxy_pass http://localhost:3000/;
  }
}

 

설정에 이상이 없는지 확인합니다.

# nginx -t

 

이상이 없으면 부팅 실행 설정과 동시에 가동해줍니다.

# systemctl enable --now nginx

 

* 참고

방화벽이나 SELinux 활성화시 nginx 구동이 되지 않으므로, 아래와 같이 처리 후 진행하면 됩니다.

# systemctl stop firewalld

# setenforce 0

 

이제 웹브라우저에서 그라파나 대시보드에 접속할 수 있습니다.

주소는 아래와 같고, 기본 관리자 계정은 admin / admin 입니다.

로그인시 비밀번호 변경을 권장하고 있으므로, 바로 변경하여 보안을 강화하세요.

https://grafana.sysdocu.kr

 

 

4. Prometheus & Node Exporter 설치

 

Prometheus 는 시계열 데이터를 수집하고 저장하는 시스템으로, 주요 기능은 모니터링과 알림 기능을 제공하는 것입니다.

Node Exporter는 Prometheus와 함께 사용되는 도구로 CPU 사용률, 메모리 사용량, 디스크 I/O, 네트워크 통계 등과 같은 메트릭 정보를 수집합니다.

 

설치를 위해 아래 내용으로 리포지토리를 추가합니다.

# vi /etc/yum.repos.d/prometheus.repo

[prometheus]
name=prometheus
baseurl=https://packagecloud.io/prometheus-rpm/release/el/$releasever/$basearch
repo_gpgcheck=1
enabled=1
gpgkey=https://packagecloud.io/prometheus-rpm/release/gpgkey
       https://raw.githubusercontent.com/lest/prometheus-rpm/master/RPM-GPG-KEY-prometheus-rpm
gpgcheck=1
metadata_expire=300

 

Prometheus 와 Node Exporter 를 설치합니다.

# dnf -y install prometheus2 node_exporter

 

부팅 가동 설정과 동시에 데몬을 가동합니다.

# systemctl enable --now prometheus

# systemctl enable --now node_exporter

 

프로메테우스는 기본적으로 비밀번호 인증 없이 제공되어 보안상 취약합니다.

그러므로 다음과 같이 basic_auth 를 설정하여 보안을 강화 합니다.

HTTPS 까지 설정하고 싶은 경우 본 매뉴얼 최상단 [출처] 를 확인하세요.

# dnf -y install httpd-tools

# htpasswd -nB promadmin

New password: (신규 패스워드 입력)
Re-type new password: (신규 패스워드 재입력)
promadmin:$2y$05$jq0lO73ur6QiAHyT8SWODuUSS6MgWDqApaXNcRqrL45HsQWra7hoy

 

위에 출력된 값을 활용하여 새로운 프로메테우스 구성 파일을 만듭니다.

# vi /etc/prometheus/web.yml

basic_auth_users:
  promadmin: $2y$05$jq0lO73ur6QiAHyT8SWODuUSS6MgWDqApaXNcRqrL45HsQWra7hoy

 

그다음 아래 파일을 열고 맨 뒤에 --web.config.file=/etc/prometheus/web.yml 옵션을 추가해 줍니다.

# vi /etc/default/prometheus

PROMETHEUS_OPTS='--config.file=/etc/prometheus/prometheus.yml --storage.tsdb.path=/var/lib/prometheus/data --web.console.libraries=/usr/share/prometheus/console_libraries --web.console.templates=/usr/share/prometheus/consoles --web.config.file=/etc/prometheus/web.yml'

 

프로메테우스 설정 파일을 열고 scrape_configs 섹션만 아래와 같이 수정합니다.

설정에 SSL 사용이 가능한데, 사용방법은 본 매뉴얼 최상단 [출처] 에서 확인해 주세요.

# cp -arp /etc/prometheus/prometheus.yml /etc/prometheus/prometheus.yml.ori

# vi /etc/prometheus/prometheus.yml

...

scrape_configs:
  - job_name: 'prometheus'
    static_configs:
      - targets: ['localhost:9090']
    basic_auth:
      username: 'promadmin'
      password: '12345678'
  - job_name: "node_exporter"
    static_configs:
      - targets: ["localhost:9100"]

 

변경된 설정을 적용하기 위해 데몬을 재시작 합니다.

# systemctl restart prometheus
# systemctl restart node_exporter

 

웹브라우저에서 다음 주소를 이용해 시각화 된 메트릭 정보를 확인 할 수 있습니다.

계정은 위에서 htpasswd 명령으로 생성한 것을 이용합니다.

http://grafana.sysdocu.kr:9090

 

 

5. 프로메테우스와 그라파나 연결

 

이제 최종적으로 하려는 작업은, 프로메테우스에서 수집된 메트릭 데이터 (데이터 소스) 를 그라파나로 출력하는 것입니다.

그라파나 대시보드에 로그인하여 아래 메뉴를 따라 이동합니다.

- Home > Connections > Data sources

열린 페이지에서 계속 진행

[ Add data source ] 클릭 > [ Prometheus ] 클릭

- Prometheus server URL : http://grafana.sysdocu.kr:9090

- Authentication methods : Basic authentication (선택), User, Password 입력 (prometheus.yml 에서 입력한 promadmin / 12345678)

- TLS settings : Skip TLS certificate validation (체크)

 

페이지 맨 하단의 [Save & test] 버튼을 눌러 이상이 없어야 합니다.

 

아래 메뉴를 따라 이동하여 대시보드 모니터링 스타일을 설정합니다.

- Dashboard > 열린 페이지에서 우측 상단 [New] 를 누르면 Import 가 보입니다. 이를 클릭합니다.

가운데 Grafana.com 의 대시보드 ID 를 넣을 수 있습니다. '15172' 를 입력하고 로드 합니다.

맨 아래 메뉴 'Select a Prometheus data source' 에서 'Prometheus' 선택 후 [Import] 를 누릅니다.

 

마지막으로, 아래 메뉴를 따라 선택하면 선택한 스타일의 대시보드에 데이터 소스값이 출력됩니다.

- Dashboards > (리스트에서) Node Exporter for Prometheus Dashboard based on 11074 > 'Resource Details: [grafana.sysdocu.kr]' 을 눌러 아래로 펼칩니다.

 

* 대시보드 레이아웃 제공 : https://grafana.com/grafana/dashboards/

 

 

※ GPU 서버 메트릭 수집

[참고] https://medium.com/@smda1215/nvidia-gpu-metrics-performance-monitor-in-grafana-prometheus-3a4bc7198cf9

 

NVIDIA GPU 서버를 모니터링 할 경우 아래와 같이 셋팅 합니다.

 

1) NVIDIA 드라이버 및 CUDA 설치

 

# dnf install -y epel-release
# dnf install -y gcc kernel-devel kernel-headers dkms make
# dnf config-manager --add-repo=http://developer.download.nvidia.com/compute/cuda/repos/rhel9/x86_64/cuda-rhel9.repo
# dnf install -y nvidia-driver nvidia-settings nvidia-driver-libs
# dnf install -y cuda

 

설치를 확인합니다.

# nvidia-smi

 

2) NVIDIA GPU Exporter 설치

 

# rpm -ivh https://github.com/utkuozdemir/nvidia_gpu_exporter/releases/download/v1.2.1/nvidia-gpu-exporter_1.2.1_linux_amd64.rpm

 

OS 가 다른 경우, 또는 다른 버전의 패키지를 설치할 경우 배포 사이트를 방문해 보세요.

https://github.com/utkuozdemir/nvidia_gpu_exporter/releases

 

설치된 명령어가 확인됩니다.

# ll /usr/bin/nvidia_gpu_exporter 
-rwxr-xr-x. 1 root root 10367128  6월 28 17:45 /usr/bin/nvidia_gpu_exporter

 

사용자와 그룹을 다음과 같이 생성합니다.

패키지 설치시 자동으로 생성되는 경우가 있습니다.

# useradd -m -s /bin/false nvidia_gpu_exporter

 

서비스 파일을 아래와 같이 생성합니다.

NVIDIA GPU Exporter 서비스의 기본 포트는 9835 입니다.

# vi /etc/systemd/system/nvidia_gpu_exporter.service

[Unit]
Description=Nvidia GPU Exporter
After=network-online.target

[Service]
Type=simple

User=nvidia_gpu_exporter
Group=nvidia_gpu_exporter

ExecStart=/usr/bin/nvidia_gpu_exporter

SyslogIdentifier=nvidia_gpu_exporter

Restart=always
RestartSec=1

[Install]
WantedBy=multi-user.target

 

서비스를 시작하고 상태를 확인합니다.
# systemctl start nvidia_gpu_exporter.service
# systemctl enable nvidia_gpu_exporter.service
# systemctl status nvidia_gpu_exporter.service

 

웹브라우저를 통해 서비스가 잘 동작하는지 확인합니다.

http://grafana.sysdocu.kr:9835/metrics

 

3) 프로메테우스 설정

 

Nvidia GPU 매트릭을 출력할 준비가 되었습니다.

그라파나 대시보드에서 메트릭을 수집할 수 있도록 프로메테우스 설정을 변경 합니다.

# vi /etc/prometheus/prometheus.yml

...

scrape_configs:
  - job_name: 'node_exporter'
    static_configs:
      - targets: ['localhost:9835']
    basic_auth:
      username: 'promadmin'
      password: '12345678'

 

변경된 설정을 적용하기 위해 데몬을 재시작 합니다.

# systemctl restart prometheus

 

4) 그라파나 대시보드 설정

 

그라파나에서 소스데이터와 대시보드를 추가합니다.

그라파나 대시보드에 로그인하여 아래 메뉴를 따라 이동합니다.

- Home > Connections > Data sources

열린 페이지에서 계속 진행

[ Add data source ] 클릭 > [ Prometheus ] 클릭

- Prometheus server URL : http://grafana.sysdocu.kr:9090

- Authentication methods : Basic authentication (선택), User, Password 입력 (prometheus.yml 에서 입력한 promadmin / 12345678)

- TLS settings : Skip TLS certificate validation (체크)

 

페이지 맨 하단의 [Save & test] 버튼을 눌러 이상이 없어야 합니다.

 

아래 메뉴를 따라 이동하여 대시보드 모니터링 스타일을 설정합니다.

- Dashboard > 열린 페이지에서 우측 상단 [New] 를 누르면 Import 가 보입니다. 이를 클릭합니다.

가운데 Grafana.com 의 대시보드 ID 를 넣을 수 있습니다. '14574' 를 입력하고 로드 합니다.

맨 아래 메뉴 'Select a Prometheus data source' 에서 'Prometheus' 선택 후 [Import] 를 누릅니다.

 

마지막으로, 아래 메뉴를 따라 선택하면 선택한 스타일의 대시보드에 데이터 소스값이 출력됩니다.

- Dashboards > (리스트에서) Nvidia GPU Metrics 를 누르면 대시보드가 출력됩니다.

 

* NVIDIA 를 기준으로 하였지만, Tesla 도 되는듯 합니다.

 

반응형

댓글()

Proxmox 에서 Ubuntu VM 싱글모드 진입, root 패스워드 초기화

리눅스/DaaS|2024. 8. 27. 09:28
반응형

부팅시 Proxmox 로고에서 ESC 키를 누르면 아래와 같은 창이 출력됩니다.

Select boot device:
1. virtio disk
2. ipxe
3. legacy option rom

여기에서 1번을 선택한 후, 바로 ESC 키를 눌러야 OS부팅 선택 창이 출력되지만,

그냥 막 1, ESC 키를 연타로 번갈아 누르는게 편합니다.

 

1) 패스워드를 아는 상태에서 간단한 작업 필요시

Ubuntu 싱글모드 진입을 원할 경우 e 키 > 제일 긴 행의 맨 뒤 splash 글자 뒤에 한 칸 띄우고 single 입력 후 Ctrl+x 로 부팅합니다.

 

2) 패스워드 분실 또는 사용자 환경 로드하지 않음

Ubuntu 싱글모드 진입을 원할 경우 e 키 > 제일 긴 행의 맨 뒤 splash 글자 뒤에 한 칸 띄우고 rw init=/bin/bash 입력 후 Ctrl+x 로 부팅합니다.

필요에 따라 파일시스템 쓰기권한을 부여합니다.

# mount -o rw,remount /

 

반응형

댓글()

Proxmox VM IP 설정 방법 (Private, NAT, VXLAN)

리눅스/DaaS|2024. 8. 6. 09:26
반응형

한 스위치 내의 PVE1 서버에 VM 이 있고, PVE2 서버는 사설IP 만 있다고 가정할때, VM 과 PVE2 이 사설 통신을 할 수 있는지 테스트를 하였습니다.

 

 

1. Private IP (호스트에 사설 대역을 설정하여 사용)

 

이 방법은 같은 대역의 사설IP 를 가진 호스트 (같은 스위치 내) 또는 VM 끼리 통신은 가능하나 VM 의 외부 통신은 불가합니다.

 

PVE1 서버에서 아래와 같이 사설 네트워크를 추가합니다.

# vi /etc/network/interfaces

auto lo
iface lo inet loopback

iface eno1 inet manual

auto vmbr0
        iface vmbr0 inet static
        address 115.68.142.5/27
        gateway 115.68.142.1
        bridge-ports eno2
        bridge-stp off
        bridge-fd 0
        post-up ip addr add 192.168.10.2/24 dev vmbr0  # 같은 네트워크 장치에 사설 IP 를 추가할 수 있습니다.

iface eno2 inet manual


source /etc/network/interfaces.d/*

 

적용합니다.

# systemctl restart networking

 

PVE1 서버와 PVE2 서버가 통신 되는점 확인하였습니다.

# ping 192.168.10.3 -c 1
PING 192.168.10.3 (192.168.10.3) 56(84) bytes of data.
64 bytes from 192.168.10.3: icmp_seq=1 ttl=64 time=0.546 ms

--- 192.168.10.3 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.546/0.546/0.546/0.000 ms

 

VM 에서도 같은 대역의 사설 IP 를 설정하면 호스트와 통신이 가능해 집니다.

 

데이터센터 > pve1 > 1001 (VM ID) > 하드웨어 > 네트워크 디바이스 (net0) 에서 bridge 를 vmbr0 으로 설정

데이터센터 > pve1 > 1001 (VM ID) > Cloud-init 에서 IP 구성 (net0) 을 ip=192.168.10.101/24 로만 셋팅 (게이트웨이 없음)

 

VM 내부에서 PVE2 로 통신되는 점 확인했습니다.

# ping 192.168.10.3 -c 1
PING 192.168.10.3 (192.168.10.3) 56(84) bytes of data.
64 bytes from 192.168.10.3: icmp_seq=1 ttl=64 time=0.525 ms

--- 192.168.10.3 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.525/0.525/0.525/0.000 ms

 

 

2. NAT 구성 (VM 외부 네트워크 연결)

 

이 방법은 한 호스트 내의 VM 에만 적용되며, 외부 네트워크 연결이 가능하지만, 다른 노드의 VM 끼리는 통신이 되지 않습니다.

 

외부 네트워크 연결을 위해 공인 IP 를 셋팅하는 손쉬운 방법도 있지만 호스트의 공인 IP 를 통해서 외부 네트워크 통신을 하려면, PVE 호스트에 마스커레이드와 NAT 설정이 되어 있어야 합니다.

시각적으로 잘 보여지기 위해 아래와 같이 구성하면 좋습니다.

# vi /etc/network/interfaces

auto lo
iface lo inet loopback

iface eno2 inet manual

auto vmbr0
iface vmbr0 inet static
        address 115.68.142.5/27
        gateway 115.68.142.1
        bridge-ports eno2
        bridge-stp off
        bridge-fd 0

auto vmbr1
iface vmbr1 inet static
        address 192.168.10.1/24
        bridge-ports none
        bridge-stp off
        bridge-fd 0

        # NAT 설정
        post-up echo 1 > /proc/sys/net/ipv4/ip_forward
        post-up iptables -t nat -A POSTROUTING -s '192.168.10.0/24' -o vmbr0 -j MASQUERADE
        post-down iptables -t nat -D POSTROUTING -s '192.168.10.0/24' -o vmbr0 -j MASQUERADE

        # Port Forwarding
        post-up iptables -t nat -A PREROUTING -i vmbr0 -p tcp --dport 3389 -j DNAT --to 192.168.10.100:3389
        post-down iptables -t nat -D PREROUTING -i vmbr0 -p tcp --dport 3389 -j DNAT --to 192.168.10.100:3389

iface eno1 inet manual

source /etc/network/interfaces.d/*

 

적용합니다.

# systemctl restart networking

 

중요한 것은, iptables 방화벽 사용중이라면 FORWARD 룰이 ACCEPT 되어 있어야 NAT 가 원활히 동작한다는 것입니다.

# iptables -nL |grep -i forward
Chain FORWARD (policy ACCEPT)

 

VM 이나 LXC 에서 사설IP 만 사용할 경우 Gateway 는 셋팅하지 않았었지만, NAT 를 이용한 외부망 통신을 위해서는 Gateway 까지 셋팅해 주어야 합니다.

아래는 셋팅 예시 입니다.

네트워크 셋팅 후 리부팅을 해야 적용이 되는 경우가 있으니 참고하세요.

- 브릿지 : vmbr1

- IPv4/CIDR : 192.168.10.100/24

- 게이트웨이(IPv4) : 192.168.10.1 

 

* 관리방법 개선하기

위와 같이 사용할 경우 VM 을 추가하고 포트 포워딩 할때마다 networking 을 재시작 해주어야 하며, 이때 Proxmox 에서 브릿지를 사용하는 모든 VM 의 네트워크가 끊어져, 네트워크 설정을 다시 적용 (간단한 값을 변경) 하여 네트워크가 활성화 되도록 해야 합니다.

VM 연결이 끊어지는 것도 문제지만, VM 의 개수가 많을 경우 더욱 문제가 되므로 네트워크 재시작 없이 iptables 룰 설정만으로 적용하도록 하면 됩니다.

아래는 interfaces 와 rules.v4 (iptables) 파일의 실제 사용 사례입니다.

 

# vi /etc/sysctl.conf

net.ipv4.ip_forward=1

 

# sysctl -p

 

# vi /etc/network/interfaces

auto lo
iface lo inet loopback

iface enp4s0 inet manual

auto vmbr0
iface vmbr0 inet static
        address 192.168.20.12/24
        gateway 192.168.20.1
        bridge-ports enp4s0
        bridge-stp off
        bridge-fd 0

auto vmbr1
iface vmbr1 inet static
        address 10.0.0.1/24
        bridge-ports none
        bridge-stp off
        bridge-fd 0

source /etc/network/interfaces.d/*

 

# vi /etc/iptables/rules.v4

*filter
:INPUT DROP [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]

# 루프백, ICMP, 기존 연결 허용
-A INPUT -i lo -j ACCEPT
-A OUTPUT -o lo -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type any -j ACCEPT
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# 접근 허용
-A INPUT -p tcp -s 115.68.87.200 --dport 22 -j ACCEPT -m comment --comment "가산 사무실 IP : 관리자"
-A INPUT -p tcp -s 115.68.87.200 --dport 8006 -j ACCEPT -m comment --comment "가산 사무실 IP : 관리자"
-A INPUT -p tcp -s 115.68.87.200 --dport 3401:3420 -j ACCEPT -m comment --comment "가산 사무실 IP : 이용자 RDP"
-A INPUT -p tcp -s 211.55.113.180 --dport 3401:3420 -j ACCEPT -m comment --comment "판교 사무실 IP : 이용자 RDP"

# 나머지 차단
-A INPUT -j DROP

COMMIT

*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]

# Port Forwarding
-A PREROUTING -i vmbr0 -p tcp --dport 3401 -j DNAT --to 10.0.0.101:3389

# NAT 설정
-A POSTROUTING -s 10.0.0.0/24 -o vmbr0 -j MASQUERADE

COMMIT

 

이제 VM 생성시 포워딩 룰을 추가해야 한다면, iptables 설정 파일에 적용하고 iptables 만 재시작 해주어도 VM 에 영향을 주지 않습니다.

그리고 PREROUTING 과 POSTROUTING 의 순서가 중요합니다.

위와 같이 사용하지 않고 순서를 바꿀 경우, 없는 VM IP 룰이 셋팅되었을때 모든 포트 포워딩이 동작하지 않는것이 확인되었습니다.

꼭 위와 같이 순서를 지켜주세요.

 

 

3. VXLAN (다른 노드의 VM 을 같은 대역으로 구성하여 통신)

 

이 방법은 NAT 구성된 여러 노드의 VM 에 또다른 디바이스 장치를 추가하여 서로 통신할 수 있게 합니다.

이 방법을 사용하면 같은 네트워크 대역을 사용하므로, 노드간 VM 을 마이그레이션 해도 IP 변경없이 사용이 가능해 집니다.

 

[ 작업 요약 ]

VM 에 네트워크 장치를 두개 추가하여 사용합니다.

- 한개는 '2번' 과 동일한 NAT 구성된 네트워크 (외부 통신용)

- 한개는 VXLAN 로 구성된 네트워크 (Private 네트워크 / 다른 노드의 VM 간 통신용)

 

1) VXLAN 생성

웹 UI 에서 아래 절차를 따라 VXLAN 을 생성합니다.

- 메뉴 : 데이터 센터 > SDN > 영역 > '추가' 버튼 클릭 > VXLAN 을 선택 합니다.

 

아래는 입력 내용 입니다.

- ID : LAN (적절한 이름 사용)

- 피어 주소 목록 : 192.168.20.12,192.168.20.13 (구성을 원하는 노드를 선택하여 입력 가능)

 

2) VNets 생성

웹 UI 에서 아래 절차를 따라 VNets 를 생성합니다.

- 메뉴 : 데이터 센터 > SDN > VNets > '생성' 버튼을 클릭합니다.

 

아래는 입력 내용 입니다.

- 이름 : LANvnet1 (적절한 이름 사용)

- 영역 : LAN (위에서 생성한 영역 이름)

- 태그 : 2000 (새로운 값 입력)

 

생성된 VNets 를 클릭하면 분할된 오른쪽 창에서 '서브넷' 추가 설정이 가능합니다.

'생성' 버튼을 눌러 서브넷을 생성합니다.

- 서브넷 : 10.0.10.0/24

 

3) VM 네트워크 추가

웹 UI 에서 아래 절차를 따라 VM 에 네트워크 장치를 추가합니다.

- 메뉴 : 데이터센터 > PVE 노드 > VM 선택 > 하드웨어 > '추가' 버튼을 눌러 '네트워크 디바이스' 를 추가합니다.

추가할때 브릿지는 위에서 생성한 'LANvnet1' 로 합니다.

 

VM 에 로그인하여 추가된 네트워크 장치에 VNets 대역의 한 IP 로 셋팅합니다.

아래는 셋팅 예시입니다.

- IP : 10.0.10.101/24

- 게이트웨이 : (없음)

 

이렇게 셋팅하면, VM 에서는 각각 외부 통신이 가능하며, VXLAN 을 사용하는 다른 노드의 VM 끼리도 통신이 가능합니다.

 

※ 참고 : VM 방화벽 사용

VM 레벨의 방화벽을 설정할 경우, 기본 룰이 inbound > DROP , outbound > ALLOW 입니다. 하지만 VM 네트워크 디바이스에 방화벽 사용 체크를 하는 순간 외부 네트워크가 단절되는 현상이 발생합니다. 이때 호스트 노드에서 아래 명령으로 해결이 가능합니다.

 

(CLI 에서 사용시)

# iptables -t raw -I PREROUTING -i fwbr+ -j CT --zone 1

 

이 명령은 인터페이스를 통해 들어오는 패킷에 대해, 커넥션 트래킹 (Connection Tracking) 을 활성화하고, 해당 패킷을 zone 1 로 구분하여 처리하는 규칙을 raw 테이블의 PREROUTING 체인에 추가합니다. 주로 Proxmox 와 같은 가상화 플랫폼에서 가상 네트워크 인터페이스에 대해 커넥션 트래킹을 설정하고, 방화벽 규칙을 적용할 때 사용됩니다.

 

(iptables 룰셋 파일 사용시)

# vi /etc/iptables/rules.v4

...

*raw
:PREROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]

-A PREROUTING -i fwbr+ -j CT --zone 1

COMMIT

 

기존 방화벽 룰 *filter 또는 *nat 와 같이 하단에 *raw 를 추가하고 해당 룰을 입력해 줍니다.

설명을 하자면,

*raw : raw 테이블 사용

:PREROUTING ACCEPT [0:0] : PREROUTING 체인이 기본 ACCEPT 상태로 시작

-A PREROUTING -i fwbr+ -j CT --zone 1 : 실제 명령어를 변환한 부분으로, fwbr+ 인터페이스에서 들어오는 패킷을 zone 1 로 설정하는 커넥션 트래킹 규칙

COMMIT : 변경 사항을 적용

 

설정한 규칙을 적용합니다.

# systemctl restart iptables

 

적용된 룰을 확인합니다.

# iptables -t raw -L

 

반응형

댓글()

Incus (LXC 리눅스 컨테이너 관리자) 설치 및 설정

리눅스/DaaS|2024. 8. 2. 08:49
반응형

Incus 는 LXD 의 포크 (fork) 로, LXD 와 유사한 기능을 제공합니다. Incus 는 LXD 와 동일한 기능을 제공하지만, Incus 프로젝트의 유지보수자 및 사용자 커뮤니티에 의해 별도로 관리됩니다. Incus 를 설치하고 사용하는 방법은 다음과 같습니다.

* 아래 내용은 공식 Document 를 참고하여 재작성 하였습니다.

https://linuxcontainers.org/incus/docs/main/

 

 

1. Incus 설치

 

Incus 는 apt 패키지를 통해 쉽게 설치할 수 있습니다.

# apt -y update
# apt -y upgrade

# apt -y install incus incus-tools incus-migrate

 

컨테이너가 아닌 VM 을 생성할 경우 아래 패키지가 추가로 필요합니다.
# apt -y install qemu-kvm libvirt-clients libvirt-daemon-system bridge-utils virt-manager

 

 

2. Incus 초기화

 

Incus 설치 후, incus admin init 명령을 사용하여 초기화를 진행합니다. 초기화 과정에서 저장소, 네트워크 및 기타 환경 설정을 구성합니다.

테스트 당시 모든 항목을 기본값 (그냥 엔터) 으로 사용하였습니다.

# incus admin init

Would you like to use clustering? (yes/no) [default=no]: 
Do you want to configure a new storage pool? (yes/no) [default=yes]: 
Name of the new storage pool [default=default]: 
Name of the storage backend to use (lvm, lvmcluster, btrfs, dir) [default=btrfs]: 
Create a new BTRFS pool? (yes/no) [default=yes]: 
Would you like to use an existing empty block device (e.g. a disk or partition)? (yes/no) [default=no]: 
Size in GiB of the new loop device (1GiB minimum) [default=5GiB]: 
Would you like to create a new local network bridge? (yes/no) [default=yes]: 
What should the new bridge be called? [default=incusbr0]: 
What IPv4 address should be used? (CIDR subnet notation, “auto” or “none”) [default=auto]: 
What IPv6 address should be used? (CIDR subnet notation, “auto” or “none”) [default=auto]: 
Would you like the server to be available over the network? (yes/no) [default=no]: 
Would you like stale cached images to be updated automatically? (yes/no) [default=yes]: 
Would you like a YAML "init" preseed to be printed? (yes/no) [default=no]: 

 

 

3. 스토리지 생성

 

이미지나 컨테이너를 저장할 스토리지가 있어야 하는데, 하드를 추가하여 특정파티션을 스토리지화 하거나 외부 장치를 이용하는 방법이 있습니다.

여기에서는 ZFS 파일시스템 형식의 파일을 만들고 LXC 를 생성해 보도록 하겠습니다.

ZFS 형식으로 생성하기위해 관련 패키지를 설치합니다.

# apt -y install zfsutils-linux

 

2GiB 크기의 빈 파일을 생성합니다. 이 파일은 ZFS 풀을 만들기 위한 디스크 이미지 파일로 사용됩니다.

# truncate -s 2GiB /var/lib/incus/disks/pool1.img

 

앞서 만든 디스크 이미지를 기반으로 pool1 이라는 이름의 ZFS 풀을 생성합니다.

# zpool create pool1 /var/lib/incus/disks/pool1.img

 

Incus 에서 pool1 이라는 이름으로 ZFS 스토리지 풀을 생성하고, ZFS 풀 pool1 을 사용하도록 연결합니다.

# incus storage create pool1 zfs source=pool1

 

(관련 명령)

스토리지 풀 리스트 보기

# incus storage list
+---------+--------+----------------------------------+-------------+---------+---------+
|  NAME   | DRIVER |              SOURCE              | DESCRIPTION | USED BY |  STATE  |
+---------+--------+----------------------------------+-------------+---------+---------+
| default | btrfs  | /var/lib/incus/disks/default.img |             | 1       | CREATED |
+---------+--------+----------------------------------+-------------+---------+---------+
| pool1   | zfs    | pool1                            |             | 0       | CREATED |
+---------+--------+----------------------------------+-------------+---------+---------+

 

스토리지 풀 상세 보기

# incus storage show pool1
config:
  source: pool1
  volatile.initial_source: pool1
  zfs.pool_name: pool1
description: ""
name: pool1
driver: zfs
used_by: []
status: Created
locations:
- none

 

스토리지 풀 리사이즈

# incus storage set pool1 size=3GiB

 

* 스토리지 풀에 대한 고찰

스토리지 풀 한개에 여러개의 LXC 디스크를 생성하거나, ISO OS 이미지를 저장할 수도 있습니다.

스토리지 풀 한개에 여러개의 LXC 를 사용하는 중, 용량을 변경하는 방법을 확인하지 못하였기 때문에 이부분은 추가로 작성하기로 하고, 한개의 풀에 한개의 LXC 를 생성하는 방법만 기술하겠습니다.

 

* 참고1 : Btrfs 스토리지 풀 및 VM 생성

# incus storage create pool1 btrfs size=5GB

# incus image list images: | grep -i Ubuntu | grep VIRTUAL-MACHINE    // 설치 가능한 VM OS 확인

# incus launch images:ubuntu/noble/desktop sysdocu1 --config limits.cpu=2 --config limits.memory=2048MiB -s pool1 --vm

 

* 참고2 : Cluster 가 구성된 상태에서 풀 생성하기

모든 클러스터 멤버에 걸쳐 새 스토리지 풀을 정의하고 구성합니다.

Cluster 멤버가 node1, node2 이렇게 있을때 두군데 볼륨을 생성해야 합니다.

# incus storage create --target node1 newpool1 zfs

# incus storage create --target node2 newpool1 zfs

# incus storage create newpool1 zfs

 

참고로 네트워크를 먼저 만들고 VM 또는 LXC 생성시 네트워크 옵션을 사용하는 것이, 경고나 추가 안내글 없이 생성되어 좋습니다.

 

 

4. LXC 생성

 

다음은 Incus 를 사용하여 컨테이너를 관리하는 예제입니다.

 

1) 컨테이너 이미지 가져오기

Incus 이미지를 목록에서 확인합니다.

(전체 이미지 출력)

# incus image list images:

(같은 버전은 최신본만 출력)

# incus image list images: |grep arm64 |grep --color=never '^| [a-z].*'

 

이미지를 아래와 같이 다운로드 할 수 있습니다.

# incus image copy images:ubuntu/24.04 local: --alias ubuntu-24.04

 

다운로드 받은 이미지를 확인합니다.

# incus image list
+--------------+--------------+--------+-------------------------------------+--------------+-----------+-----------+----------------------+
|    ALIAS     | FINGERPRINT  | PUBLIC |             DESCRIPTION             | ARCHITECTURE |   TYPE    |   SIZE    |     UPLOAD DATE      |
+--------------+--------------+--------+-------------------------------------+--------------+-----------+-----------+----------------------+
| ubuntu-24.04 | e11d95790cc9 | no     | Ubuntu noble amd64 (20240731_07:42) | x86_64       | CONTAINER | 123.68MiB | 2024/08/02 15:06 KST |
+--------------+--------------+--------+-------------------------------------+--------------+-----------+-----------+----------------------+

 

이미지는 호스트에 한 번만 받아놓으면 컨테이너 생성시마다 활용할 수 있습니다.

 

2-1) 컨테이너 생성 및 시작 : 스토리지풀 한개에 LXC 한개 생성하는 방법

가져온 이미지를 사용하여 pool1 스토리지 풀에 컨테이너를 생성하고 시작합니다.

생성 노드 지정, VM 타입, 디스크 용량 지정 등 다양한 타입으로 생성 가능하므로 공식 URL을 참고해 주세요.

(https://linuxcontainers.org/incus/docs/main/howto/instances_create/)

# incus launch ubuntu-24.04 sysdocu-lxc --config limits.cpu=1 --config limits.memory=512MiB -s pool1

 

* 참고로 네트워크 브릿지를 먼저 생성했다면 --network vlan10 과 같이 옵션을 사용하여 네트워크 그룹에 할당 할 수 있습니다.

 

실행 중인 컨테이너의 상태를 확인합니다.

# incus list

+-----------------+---------+----------------------+-----------------------------------------------+-----------+-----------+
|      NAME       |  STATE  |         IPV4         |                     IPV6                      |   TYPE    | SNAPSHOTS |
+-----------------+---------+----------------------+-----------------------------------------------+-----------+-----------+
| sysdocu-lxc     | RUNNING | 10.53.166.120 (eth0) | fd42:9307:e6bd:b0e9:216:3eff:fe05:8991 (eth0) | CONTAINER | 0         |
+-----------------+---------+----------------------+-----------------------------------------------+-----------+-----------+

 

[ 잠깐 : 서비스 제공시 incus 흔적 지우기 ] ===========

(컨테어너 내에서)

mv /etc/sudoers.d/90-incus /etc/sudoers.d/90-user

umount /dev/incus

umount /dev/.incus-mounts

rmdir /dev/incus

rmdir /dev/.incus-mounts

==========================================

 

실행 중인 컨테이너에 명령을 내리거나 쉘 로그인이 가능합니다.

# incus start sysdocu-lxc    // LXC 시작

# incus stop sysdocu-lxc    // LXC 중지

# incus exec sysdocu-lxc -- bash       // 쉘 로그인

# incus exec sysdocu-lxc -- nproc      // CPU 개수 확인

# incus exec sysdocu-lxc -- free -m    // 메모리 사용량 확인

# incus exec sysdocu-lxc -- df -h        // 파티션 용량 확인

Filesystem                    Size  Used Avail Use% Mounted on
pool1/containers/sysdocu-lxc  1.8G  308M  1.5G  18% /
none                          492K  4.0K  488K   1% /dev
tmpfs                         100K     0  100K   0% /dev/incus
tmpfs                         100K     0  100K   0% /dev/.incus-mounts
tmpfs                         2.0G     0  2.0G   0% /dev/shm
tmpfs                         784M  112K  784M   1% /run
tmpfs                         5.0M     0  5.0M   0% /run/lock

 

2-2) 컨테이너 생성 및 시작 : 스토리지풀 한개에 LXC 여러개 생성하는 방법
아래는 default 풀에 2G 크기의 LXC 를 생성하는 예제입니다.

# mount /var/lib/incus/disks/default.img /mnt

# btrfs filesystem resize 2G /mnt
# umount /mnt

# incus launch ubuntu-24.04 sysdocu-default --config limits.cpu=1 --config limits.memory=512MiB -s default

 

※ 참고

파일시스템 형식에 따라 출력되는 장치명이 아래와 같습니다.

 

(Zfs 일때 : containers 라고 출력)

# incus exec sysdocu-lxc -- df -h | grep /$
pool1/containers/sysdocu-lxc  9.2G  3.9G  5.4G  42% /

 

(Btrfs 일때 : 컨테이너 용량 표기 / container 글씨 없음 / 하지만 컨테이너 추가 생성시 loop1, ... 이름으로 생성 / df -Th 명령시 btrfs 파티션으로 표기)

# incus exec sysdocu-default -- df -h | grep /$
/dev/loop0      3.0G  550M  2.0G  22% /

 

(dir 일때 : 호스트 전체 용량이 출력)

# incus exec sysdocu4 -- df -h | grep /$
/dev/vda1        24G   11G   13G  47% /

 

(LVM 일때 : containers_name 형식으로 출력)

# incus exec sysdocu5 -- df -h | grep /$
/dev/pool5/containers_sysdocu5  9.8G  543M  8.8G   6% /

 

 

3) 컨테이너 관리 명령

컨테이너가 실행되는 동안 필요한 리소스 구성을 업데이트할 수도 있습니다. (디스크 제외)

# incus config set sysdocu-lxc limits.memory=1GiB

 

구성이 적용되었는지 확인합니다.

# incus config show sysdocu-lxc

 

컨테이너를 중지, 시작, 재부팅 및 삭제할 수 있습니다.

# incus stop sysdocu-lxc

# incus start sysdocu-lxc

# incus restart sysdocu-lxc

# incus delete sysdocu-lxc --force    // 실행중이라는 메세지가 출력될때는 중지 후 삭제하거나 --force 옵션 사용

 

컨테이너 내 파일을 복사해 오기

# incus file pull sysdocu-lxc/etc/hosts .

 

컨테이너로 파일을 복사해 넣기

# incus file push hosts sysdocu-lxc/etc/

 

 

5. 디스크 확장 및 볼륨 추가

 

1) 디스크 확장

pool1 스토리지 풀을 사용하는 모든 컨테이너를 중지합니다.

# incus stop sysdocu-lxc

 

스토리지 풀 이미지 파일 크기를 확장합니다.

기존 2G 였으므로 1G 를 추가해 3G 로 변경해 보겠습니다.

(+ 없이 그냥 3G 로 해도 됩니다)

# truncate -s +1G /var/lib/incus/disks/pool1.img

 

ZFS 풀에서 크기를 반영합니다.

# zpool set autoexpand=on pool1

# zpool online -e pool1 /var/lib/incus/disks/pool1.img

 

컨테이너를 시작합니다.

# incus start sysdocu-lxc

 

변경된 용량을 확인합니다.

# incus exec sysdocu-lxc -- df -h

Filesystem                    Size  Used Avail Use% Mounted on
pool1/containers/sysdocu-lxc  2.8G  254M  2.6G  10% /
none                          492K  4.0K  488K   1% /dev
tmpfs                         100K     0  100K   0% /dev/incus
tmpfs                         100K     0  100K   0% /dev/.incus-mounts
tmpfs                         2.0G     0  2.0G   0% /dev/shm
tmpfs                         784M  116K  784M   1% /run
tmpfs                         5.0M     0  5.0M   0% /run/lock

 

2) 볼륨 추가하기

순서는 풀을 생성합니다.

# incus storage create my-pool zfs size=1GB

 

그 안에 볼륨을 생성합니다.

# incus storage volume create my-pool my-volume

 

컨테이너에 연결합니다.

컨테이너내 디렉토리는 생성해 두지 않아도 됩니다.

# incus storage volume attach my-pool my-volume sysdocu-lxc /data

 

마운트된 것을 확인합니다.

# incus exec sysdocu-lxc -- df -h
Filesystem                        Size  Used Avail Use% Mounted on
pool1/containers/sysdocu-lxc      3.8G  255M  3.6G   7% /
none                              492K  4.0K  488K   1% /dev
tmpfs                             100K     0  100K   0% /dev/incus
tmpfs                             100K     0  100K   0% /dev/.incus-mounts
tmpfs                             2.0G     0  2.0G   0% /dev/shm
tmpfs                             784M  112K  784M   1% /run
tmpfs                             5.0M     0  5.0M   0% /run/lock
my-pool/custom/default_my-volume  768M  128K  768M   1% /data

 

연결 해제 방법

# incus storage volume detach my-pool my-volume sysdocu-lxc

 

 

6. 네트워크 설정

 

아래는 vlan 설정을 통하여 각각의 그룹 내 컨테이너 끼리만 통신이 가능하게 하는 예제입니다.

- vlan10 브릿지 사용 컨테이너 : sysdocu1, sysdocu2

- vlan20 브릿지 사용 컨테이너 : sysdocu3, sysdocu4

 

1) 네트워크 브리지 생성

기본 네트워크 브리지를 생성합니다.

# incus network create vlan10

# incus network create vlan20

 

컨테이너에 네트워크 브리지를 연결합니다.

# incus network attach vlan10 sysdocu1 eth0
# incus network attach vlan10 sysdocu2 eth0
# incus network attach vlan20 sysdocu3 eth0
# incus network attach vlan20 sysdocu4 eth0

 

연결 전 네트워크 IP

# incus list
+----------+---------+-----------------------+-----------------------------------------------+-----------+-----------+
|   NAME   |  STATE  |         IPV4          |                     IPV6                      |   TYPE    | SNAPSHOTS |
+----------+---------+-----------------------+-----------------------------------------------+-----------+-----------+
| sysdocu1 | RUNNING | 10.219.126.53 (eth0)  | fd42:c68c:ea28:a8b7:216:3eff:fecc:5c4a (eth0) | CONTAINER | 0         |
+----------+---------+-----------------------+-----------------------------------------------+-----------+-----------+
| sysdocu2 | RUNNING | 10.219.126.246 (eth0) | fd42:c68c:ea28:a8b7:216:3eff:fea2:5e9e (eth0) | CONTAINER | 0         |
+----------+---------+-----------------------+-----------------------------------------------+-----------+-----------+
| sysdocu3 | RUNNING | 10.219.126.159 (eth0) | fd42:c68c:ea28:a8b7:216:3eff:febc:9ea4 (eth0) | CONTAINER | 0         |
+----------+---------+-----------------------+-----------------------------------------------+-----------+-----------+
| sysdocu4 | RUNNING | 10.219.126.243 (eth0) | fd42:c68c:ea28:a8b7:216:3eff:fe3f:6571 (eth0) | CONTAINER | 0         |
+----------+---------+-----------------------+-----------------------------------------------+-----------+-----------+

 

연결 후 네트워크 IP

그룹별 새로운 사설 IP 로 셋팅 된 것이 확인됩니다.

# incus list
+----------+---------+-----------------------+-----------------------------------------------+-----------+-----------+
|   NAME   |  STATE  |         IPV4          |                     IPV6                      |   TYPE    | SNAPSHOTS |
+----------+---------+-----------------------+-----------------------------------------------+-----------+-----------+
| sysdocu1 | RUNNING | 10.143.217.53 (eth0)  | fd42:bf49:3da2:3054:216:3eff:fecc:5c4a (eth0) | CONTAINER | 0         |
+----------+---------+-----------------------+-----------------------------------------------+-----------+-----------+
| sysdocu2 | RUNNING | 10.143.217.246 (eth0) | fd42:bf49:3da2:3054:216:3eff:fea2:5e9e (eth0) | CONTAINER | 0         |
+----------+---------+-----------------------+-----------------------------------------------+-----------+-----------+
| sysdocu3 | RUNNING | 10.107.13.159 (eth0)  | fd42:fa98:efb:f314:216:3eff:febc:9ea4 (eth0)  | CONTAINER | 0         |
+----------+---------+-----------------------+-----------------------------------------------+-----------+-----------+
| sysdocu4 | RUNNING | 10.107.13.243 (eth0)  | fd42:fa98:efb:f314:216:3eff:fe3f:6571 (eth0)  | CONTAINER | 0         |
+----------+---------+-----------------------+-----------------------------------------------+-----------+-----------+

 

2) 브릿지 간 통신 차단

이제 iptables 를 이용해야 합니다.

forward 기본 정책을 DROP 으로 설정합니다.
# iptables -P FORWARD DROP

vlan10 내 통신을 허용합니다.
# iptables -A FORWARD -i vlan10 -o vlan10 -j ACCEPT
# iptables -A FORWARD -i vlan20 -o vlan20 -j ACCEPT

 

추가되는 브릿지마다 한 줄씩 추가해주면 됩니다.

 

3) 브릿지 외부 통신 허용 (필요한 경우에 사용. 미사용시 Private 구성 가능)

테스트 환경에서는 ens3 가 외부 네트워크와 연결된 인터페이스입니다.

따라서 NAT 설정에서 ens3 를 사용해야 합니다.

 

아래와 같이 NAT 설정 및 외부 트래픽을 허용합니다.

# iptables -t nat -A POSTROUTING -o ens3 -j MASQUERADE


외부에서 들어오는 응답 트래픽을 허용합니다.

# iptables -A FORWARD -i ens3 -m state --state ESTABLISHED,RELATED -j ACCEPT


외부로 나가는 트래픽을 허용합니다.

# iptables -A FORWARD -i vlan10 -o ens3 -j ACCEPT

# iptables -A FORWARD -i vlan20 -o ens3 -j ACCEPT

 

추가되는 브릿지마다 한 줄씩 추가해주면 됩니다.

 

설정된 룰 상태를 출력합니다.
# iptables -L -v -n

 

sysdocu1 에서 sysdocu2 와 외부 네트워크는 통신이 되지만, 다른 브릿지의 sysdocu3, sysdocu4 컨테이너와 통신이 되지 않는 것을 확인할 수 있습니다.

 

 

7. 백업 및 복원

 

인스턴스의 스냅샷을 생성하여 인스턴스를 이전 상태로 쉽게 복원할 수 있습니다.

 

1) 스냅샷 생성

backup1 이라는 스냅샷을 생성합니다.

# incus snapshot create sysdocu-lxc backup1

 

스냅샷이 생성되었는지 확인합니다.

# incus list first     // 맨 우측에 스냅샷 개수가 출력됩니다.

# incus info first    // 맨 하단에 스냅샷 정보가 출력됩니다.

 

2) 스냅샷으로 복원

컨테이너를 스냅샷 상태로 복원합니다.

# incus snapshot restore sysdocu-lxc backup1

 

3) 스냅샷 삭제

# incus snapshot delete sysdocu-lxc backup1

 

 

8. 클러스터 구성

 

호스트 여러대를 묶어 노드간 컨테이너 이동을 용이하게 하거나 서비스 확장이 가능한 방법입니다.

 

첫번째 노드에서 아래 명령을 실행합니다.
incus 사용중이여도 괜찮습니다.
# incus admin init
Would you like to use clustering? (yes/no) [default=no]: yes
What IP address or DNS name should be used to reach this server? [default=10.101.0.29]: 
Are you joining an existing cluster? (yes/no) [default=no]: 
What member name should be used to identify this server in the cluster? [default=localhost]: node1
Do you want to configure a new local storage pool? (yes/no) [default=yes]: 
Name of the storage backend to use (dir, lvm, btrfs) [default=btrfs]: 
Create a new BTRFS pool? (yes/no) [default=yes]: 
Would you like to use an existing empty block device (e.g. a disk or partition)? (yes/no) [default=no]: 
Size in GiB of the new loop device (1GiB minimum) [default=5GiB]: 
Do you want to configure a new remote storage pool? (yes/no) [default=no]: 
Would you like to use an existing bridge or host interface? (yes/no) [default=no]: 
Would you like stale cached images to be updated automatically? (yes/no) [default=yes]: 
Would you like a YAML "init" preseed to be printed? (yes/no) [default=no]: 

 

두번째 노드를 받아들이기 위한 토큰을 생성합니다. 노드명은 node2 라고 임의로 정했습니다.

# incus cluster add node2
Member node2 join token:
eyJzZXJ2ZXJfbmFtZSI6Im5vZGUyIiwiZmluZ2VycHJpbnQiOiJiNzNhZGUwMDk5ZWZhM2NiOGRjNmExMGNhNGFjMTk0ZWU2MDFmOGZjNTQyZDEwNmYyMTU3YTI1NjVlMmQwMjE2IiwiYWRkcmVzc2VzIjpbIjEwLjEwMS4wLjI5Ojg0NDMiXSwic2VjcmV0IjoiNzdkZWVjMjI3YTI3MzI3ZGM1Y2YxNzQ3YmEwZTE3Y2EyOTk1YzNiMWUxYmYwYmVmOGI3NmJhNmRlOGRiNDgxOCIsImV4cGlyZXNfYXQiOiIyMDI0LTA4LTA3VDEyOjAyOjI0LjM1OTM2MjY3MiswOTowMCJ9

 

두번째 노드에서 아래 명령을 실행합니다.

설정 도중에 첫번째 노드에서 확인한 토큰을 입력해야 합니다.

# incus admin init
Would you like to use clustering? (yes/no) [default=no]: yes
What IP address or DNS name should be used to reach this server? [default=10.101.0.3]: 
Are you joining an existing cluster? (yes/no) [default=no]: yes
Please provide join token: eyJzZXJ2ZXJfbmFtZSI6Im5vZGUyIiwiZmluZ2VycHJpbnQiOiJiNzNhZGUwMDk5ZWZhM2NiOGRjNmExMGNhNGFjMTk0ZWU2MDFmOGZjNTQyZDEwNmYyMTU3YTI1NjVlMmQwMjE2IiwiYWRkcmVzc2VzIjpbIjEwLjEwMS4wLjI5Ojg0NDMiXSwic2VjcmV0IjoiNzdkZWVjMjI3YTI3MzI3ZGM1Y2YxNzQ3YmEwZTE3Y2EyOTk1YzNiMWUxYmYwYmVmOGI3NmJhNmRlOGRiNDgxOCIsImV4cGlyZXNfYXQiOiIyMDI0LTA4LTA3VDEyOjAyOjI0LjM1OTM2MjY3MiswOTowMCJ9
All existing data is lost when joining a cluster, continue? (yes/no) [default=no] yes
Choose "size" property for storage pool "default": 
Choose "source" property for storage pool "default": 
Choose "size" property for storage pool "local": 
Choose "source" property for storage pool "local": 
Would you like a YAML "init" preseed to be printed? (yes/no) [default=no]: 

 

이렇게 하면 두 번째 노드가 첫 번째 노드가 포함된 클러스터에 참여하게 됩니다.

이 과정을 반복하여 추가 노드를 클러스터에 참여시킬 수 있습니다.

클러스터 가입 정보는 어느 노드에서도 동일하게 아래 명령으로 확인이 됩니다.

# incus cluster list
+---------------+--------------------------+------------------+--------------+----------------+-------------+--------+-------------------+
|     NAME      |           URL            |      ROLES       | ARCHITECTURE | FAILURE DOMAIN | DESCRIPTION | STATE  |      MESSAGE      |
+---------------+--------------------------+------------------+--------------+----------------+-------------+--------+-------------------+
| node1         | https://10.101.0.29:8443 | database-leader  | x86_64       | default        |             | ONLINE | Fully operational |
|               |                          | database         |              |                |             |        |                   |
+---------------+--------------------------+------------------+--------------+----------------+-------------+--------+-------------------+
| node2         | https://10.101.0.3:8443  | database-standby | x86_64       | default        |             | ONLINE | Fully operational |
+---------------+--------------------------+------------------+--------------+----------------+-------------+--------+-------------------+

 

 

9. 마이그레이션

 

마이그레이션을 수행하려면 CRIU (Checkpoint/Restore In Userspace) 도구가 필요합니다.
CRIU 는 컨테이너의 상태를 저장하고 복원하여 실행 중인 컨테이너를 마이그레이션할 수 있도록 합니다.

CRIU 패키지는 컨테이너를 보내고 받는 노드에 설치가 되어 있어야 합니다.
CRIU 패키지를 제공하는 외부 PPA 를 추가합니다.
# add-apt-repository ppa:criu/ppa
# apt -y update

PPA를 통해 CRIU를 설치합니다.
# apt -y install criu

 

클러스터 구성을 하였다면 컨테이너 리스트 확인시 노드 정보가 추가되어 출력됩니다.

# incus list
+----------+---------+----------------------+-----------------------------------------------+-----------+-----------+---------------+
|   NAME   |  STATE  |         IPV4         |                     IPV6                      |   TYPE    | SNAPSHOTS | LOCATION |
+----------+---------+----------------------+-----------------------------------------------+-----------+-----------+---------------+
| sysdocu1 | RUNNING | 10.194.49.116 (eth0) | fd42:b6f1:bf2c:f766:216:3eff:fe43:ba13 (eth0) | CONTAINER | 0         | node1    |
+----------+---------+----------------------+-----------------------------------------------+-----------+-----------+---------------+
| sysdocu2 | RUNNING | 10.194.49.80 (eth0)  | fd42:b6f1:bf2c:f766:216:3eff:fe56:96f0 (eth0) | CONTAINER | 0        | node1    |
+----------+---------+----------------------+-----------------------------------------------+-----------+-----------+---------------+
| sysdocu3 | RUNNING | 10.91.111.49 (eth0)  | fd42:cdfb:ea77:7cde:216:3eff:fec9:8466 (eth0) | CONTAINER | 0        | node1    |
+----------+---------+----------------------+-----------------------------------------------+-----------+-----------+---------------+
| sysdocu4 | RUNNING | 10.91.111.235 (eth0) | fd42:cdfb:ea77:7cde:216:3eff:fe09:db03 (eth0) | CONTAINER | 0        | node1    |
+----------+---------+----------------------+-----------------------------------------------+-----------+-----------+---------------+

 

sysdocu1 컨테이너를 node1 에서 node2 로 변경해 보겠습니다.

# incus stop sysdocu1
# incus move sysdocu1 --target node2
# incus start sysdocu1

 

변경된 상태를 확인합니다.

# incus list |grep sysdocu1
| sysdocu1 | RUNNING | 10.194.49.116 (eth0) | fd42:b6f1:bf2c:f766:216:3eff:fe43:ba13 (eth0) | CONTAINER | 0        | node2    |

 

* 옮긴 컨테이너는 sysdocu2 랑 통신이 되지 않음. iptables 가 하나의 노드에만 적용되기 때문인 것 같은데, 확인해 봐야 함.

* 현재까지의 해결책 : 모든 노드에 동일한 iptables 룰셋을 적용하고, 같은 네트워크를 사용하는 컨테이너끼리 한 노드에 모아 두어야 함. 

* 확인할 것 : apt -y install openvswitch-switch 을 통하여 iptables 를 활용하지 않고 SDN 기능을 제공할 수 있을 것으로 보임.

 

 

10-1. 웹 UI 설치 (lxconsole) - 사용해보니 이게 좋아 보임

- VM 으로 생성시 Graphic console 사용 가능

 

참고 : https://github.com/PenningLabs/lxconsole/tree/main

 

# git clone https://github.com/PenningLabs/lxconsole.git

# cd lxconsole

# apt -y install python3-pip python3.12-venv

 

가상 환경 생성, 활성화 및 관련된 python 패키지 설치

# python3 -m venv myenv    // 가상화 만드는 명령이므로 한번만 하면 됩니다.

# source myenv/bin/activate    // 가상화로 전환

(myenv) root@kuru80-256844:~/lxconsole# pip install -r requirements.txt

(myenv) root@kuru80-256844:~/lxconsole# python3 run.py
 * Serving Flask app 'lxconsole'
 * Debug mode: off
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
 * Running on all addresses (0.0.0.0)
 * Running on http://127.0.0.1:5000
 * Running on http://10.101.0.20:5000
Press CTRL+C to quit

 

위 내용은 개발용이니 프로덕션에 사용하려면 WSGI 서버를 사용하라는 말입니다.

CTRL+C 를 눌러 취소하고, 아래 명령을 실행하여 WSGI 서버를 실행합니다.

(myenv) root@kuru80-256844:~/lxconsole# pip install uwsgi    // 한번만 설치 해두면 됨

(myenv) root@kuru80-256844:~/lxconsole# uwsgi --http 0.0.0.0:5000 --module run:app --processes 4 --threads 2 --logto /root/5000_access.log &    // 백그라운드로 실행

(myenv) root@kuru80-256844:~/lxconsole# deactivate    // 백그라운드 프로세스는 그대로 두고 가상화 종료

 

※ 참고 ==========================

여기까지의 작업을 반복하지 않도록 시스템 부팅시 자동으로 lxconsole 이 실행되게 합니다.
# vi /root/start_lxconsole.sh

#!/bin/bash

cd /root/lxconsole
source myenv/bin/activate
uwsgi --http 0.0.0.0:5000 --module run:app --processes 4 --threads 2 --logto /root/5000_access.log &
deactivate


실행 권한을 부여합니다.
# chmod 700 /root/start_lxconsole.sh

부팅 시 자동으로 스크립트가 실행되도록 systemd 서비스를 만듭니다.
# vi /etc/systemd/system/lxconsole.service

[Unit]
Description=lxconsole uWSGI service
After=network.target

[Service]
ExecStart=/bin/bash /root/start_lxconsole.sh
Restart=always
User=root
WorkingDirectory=/root/lxconsole
Environment="PATH=/root/lxconsole/myenv/bin"
Type=forking

[Install]
WantedBy=multi-user.target

 

* 백그라운드 데몬이 있으므로 Type=forking 사용하였음.

 

systemd 서비스 파일을 활성화하고 부팅 시 실행되도록 설정합니다.
# systemctl daemon-reload
# systemctl enable lxconsole
# systemctl start lxconsole
================================

 

계속 이어서 진행합니다.

데몬을 실행 했으면, 아래 주소와 같이 5000 번 포트를 통해 웹 UI 에 접근할 수 있습니다.

http://115.68.249.148:5000

 

처음 접속시 관리자 ID / PW 를 생성하고 로그인 하도록 되어 있습니다.

 

처음에 관리할 서버를 추가해야 합니다.

우측 상단의 [+Server] 버튼 클릭 합니다.

빈칸을 채우기 전에, 위를 살펴보면 here 링크가 보입니다. 이것을 누르면 incus 서버에 접근 인증을 해야한다고 인증 키값을 출력해주는데, 내용을 복사해서 lxconsole.crt 파일로 생성하고, 아래 명령으로 적용하면 서버 리스트에 node1 이 출력됩니다.

# incus config trust add-certificate lxconsole.crt

# incus config set core.https_address=[::]:8443

 

이후 서버 추가 메뉴로 돌아가 아래 내용을 입력 합니다.

Before adding an LXD/Incus server, it must first trust your client certificate.
Click here for instructions on trusting certificates.
- Host Addr (필수) : 115.68.249.148
- Port (필수) : 8443
- Proxy : (입력 안함)
- SSL Verify: (선택 안함. 기본 False)

 

노드 이름을 누르면 대시보드 출력과 함께 다양한 설정 메뉴가 제공되며, 이와 같이 다른 노드도 추가를 할 수 있습니다. 

이밖에 Python 가상환경이 아닌, Docker 로 실행하는 방법을 원할 경우 참고 URL 을 확인해 주세요.

 

 

10-2. 웹 UI 설치 (Zabbly)

 

참고 : https://github.com/zabbly/incus?tab=readme-ov-file#installation

 

리포지토리 키를 확인합니다.

# curl -fsSL https://pkgs.zabbly.com/key.asc | gpg --show-keys --fingerprint

 

다음 디렉토리를 생성합니다.

# mkdir -p /etc/apt/keyrings/


키를 로컬에 저장합니다.

# curl -fsSL https://pkgs.zabbly.com/key.asc -o /etc/apt/keyrings/zabbly.asc


다음 명령으로 6.0 LTS 리포지토리를 추가합니다.

# sh -c 'cat <<EOF > /etc/apt/sources.list.d/zabbly-incus-lts-6.0.sources

Enabled: yes

Types: deb

URIs: https://pkgs.zabbly.com/incus/lts-6.0

Suites: $(. /etc/os-release && echo ${VERSION_CODENAME})

Components: main

Architectures: $(dpkg --print-architecture)

Signed-By: /etc/apt/keyrings/zabbly.asc

EOF'


리포지토리 목록을 업데이트 하고 incus-ui-canonical 을 설치합니다.

incus-ui-canonical 은 LXD UI 의 리브랜딩 버전입니다.

# apt-get update

# apt-get install incus-ui-canonical

아래 주소로 접근합니다.

https://<서버 IP>:8443/

 

접속하면 새 인증서를 만들고 설정하는 단계가 나옵니다.

절차에 따라 인증서를 설정하고 브라우저로 재연결하면 됩니다.

 

 

10-3. 웹 UI 설치 (lxd-UI)

- VM 으로 생성시 Graphic console 사용 가능

 

참고 : https://github.com/canonical/lxd-ui

 

# snap install lxd

# snap refresh --channel=latest/stable lxd

# lxc config set core.https_address :8443    // 포트는 변경해도 됨

 

그리고 브라우저를 통해 SSL 접근하면 됩니다.

https://115.68.249.148:8443

 

페이지 접근 후, 가운데 녹색버튼을 눌러 인증서를 생성합니다.

크롬 브라우저에서 인증서를 등록 후, 다시 접근하면 자동 로그인되며, 인스턴스를 생성할 수 있게 됩니다.

 

 

 

 

 

 

 

반응형

댓글()

Proxmox 에서 SDN (영역 및 VNets) 설정하여 네트워크 분리하기

리눅스/DaaS|2024. 7. 31. 10:05
반응형

웹 UI 에서 데이터센터 > SDN > '영역' 과 'VNets' 설정을 적절히 하여 네트워크를 분리할 수 있습니다.

VNets 생성시 영역을 선택하도록 되어 있으므로, 아래와 같이 영역을 미리 만들고 계획에 맞게 분리하면 됩니다.

 

 

1. 영역 생성

 

영역은 zone 과 같은 의미 입니다.

 

1) 웹 UI 에서 설정할 경우

 

- 메뉴 : 데이터센터 > SDN > 영역 > 추가

 

생성 유형은 아래와 같습니다. 저는 모든 그룹을 VXLAN 으로 설정하겠습니다.

- Simple : 소규모 네트워크 또는 기본적인 네트워크 설정이 필요한 경우

- VLAN : 논리적인 네트워크 분리가 필요하거나, 네트워크 세그먼트 별로 트래픽을 격리해야 하는 경우

- QinQ : 서비스 프로바이더 환경에서 고객 VLAN 태그를 보존하면서 추가적인 VLAN 태그가 필요한 경우

- VXLAN : 대규모 데이터센터에서 네트워크를 확장하거나, 멀티 테넌트 환경에서 네트워크 격리가 필요한 경우

- EVPN : 대규모 네트워크에서 다중 테넌트 지원, 확장성, 유연성을 제공해야 하는 경우

 

여기에서는 서비스 목적에 맞는 영역으로 2개를 생성하였습니다.

ID : 8자리 이하로 만들어야 합니다. 

Bridge 는 호스트에서 ifconfig 명령으로 확인된 통신할 브릿지를 입력하면 됩니다.

- 기업 사용자 / 유형 : VLAN / ID : company / Bridge : vmbr0 / 나머지 기본

- 개인 사용자 / 유형 : VLAN / ID : personal / Bridge : vmbr0 / 나머지 기본

 

2) CLI 에서 설정할 경우

SDN 영역을 생성합니다.

# pvesh create /cluster/sdn/zones -zone company -type vlan -bridge vmbr0 -ipam pve

# pvesh create /cluster/sdn/zones -zone personal -type vlan -bridge vmbr0 -ipam pve

 

mtu 옵션이 없으면 자동 설정되지만, 값을 지정하고 싶을 경우 다음과 같은 옵션을 추가합니다.

-mtu 1450 

 

생성된 SDN 영역 리스트를 출력합니다.

# pvesh ls /cluster/sdn/zones
-rw-d        company
-rw-d        personal

 

 

2. VNets 생성

 

기업의 경우 '경영지원본부', '개발팀' 등과 같이 부서 용도에 맞게 VNet 을 할당 하면 되고, 개별 VM 사용자의 경우 계정별로 VNet 를 생성해서 할당 할 예정입니다.

 

1) 웹 UI 에서 설정할 경우

 

- 메뉴 : 데이터센터 > SDN > VNets > 생성

 

여기에서는 개별 사용자 zone 에 vnet 을 생성하였습니다.

태그 : 없으면 생성이 되지 않고, 숫자로만 입력이 가능하므로 이름과 동일한 값으로 입력해 보겠습니다.

- 이름 : vnet1 / 영역 : personal / 태그 : 1

- 이름 : vnet2 / 영역 : personal / 태그 : 2

 

2) CLI 에서 설정할 경우

VNet 을 생성합니다.

# pvesh create /cluster/sdn/vnets --vnet vnet1 --zone personal --tag 1

# pvesh create /cluster/sdn/vnets --vnet vnet2 --zone personal --tag 2

 

생성된 VNets 리스트를 출력합니다.

# pvesh ls /cluster/sdn/vnets
-rw-d        vnet1
-rw-d        vnet2

 

 

3. VM 생성

 

Ubuntu 24.04 cloud image 를 다운로드 합니다.

# cd /var/lib/vz/template/iso

# wget https://cloud-images.ubuntu.com/noble/current/noble-server-cloudimg-amd64.img

 

이미지에 qemu-guest-agent 를 설치하고 패키지 목록을 업데이트 합니다.

# virt-customize -a /var/lib/vz/template/iso/noble-server-cloudimg-amd64.img --install qemu-guest-agent

# virt-customize -a /var/lib/vz/template/iso/noble-server-cloudimg-amd64.img --update

 

---------- 여기까지는 한 번만 해두면 됩니다 ----------

 

VM 을 생성하고 cloud image 를 VM 에 추가합니다.

# qm create 1001 --name ubuntu-1001 --cores 1 --memory 1024 --net0 virtio,bridge=vmbr0

# qm importdisk 1001 /var/lib/vz/template/iso/noble-server-cloudimg-amd64.img local-lvm

 

디스크를 virtio0 디스크로 설정하고 부팅하도록 설정합니다.

# qm set 1001 --virtio0 local-lvm:vm-1001-disk-0

# qm set 1001 --boot c --bootdisk virtio0

 

시리얼 콘솔과 VGA를 설정합니다.

# qm set 1001 --serial0 socket --vga serial0

 

QEMU 게스트 에이전트를 활성화합니다.

# qm set 1001 --agent enabled=1

 

디스크의 사이즈를 설정합니다. 현재 이미지 용량 (3.5G) 보다 10G 더 증가됩니다.

# qm resize 1001 virtio0 +10G

 

cloud-init 사용을 위해 드라이브를 추가합니다.

# qm set 1001 --ide2 local-lvm:cloudinit

 

(명령어로 처리 하려면)

# qm set 1001 --ciuser root --cipassword 12345678 --nameserver 8.8.8.8 --ipconfig0 "ip=192.168.10.101/24,gw=192.168.10.1"

 

(파일을 생성하여 처리 하려면)

네트워크 설정 및 cloud-init.yml 파일을 작성하고 적용합니다.

# qm set 1001 --ipconfig0 ip=192.168.10.101/24,gw=192.168.10.1

 

# mkdir /var/lib/vz/snippets

# vi /var/lib/vz/snippets/cloud-init.yml

#cloud-config
hostname: ubuntu-vm1
users:
  - name: root
chpasswd:
  list: |
    root:12345678
  expire: False
packages:
  - cloud-guest-utils
ssh_pwauth: true
runcmd:
  - 'sed -i "s/^#PermitRootLogin .*/PermitRootLogin yes/" /etc/ssh/sshd_config'
  - 'sed -i "s/^#PasswordAuthentication .*/PasswordAuthentication yes/" /etc/ssh/sshd_config'
  - 'systemctl restart ssh'
  - growpart /dev/vda 1
  - resize2fs /dev/vda1

 

# qm set 1001 --cicustom "user=local:snippets/cloud-init.yml"

 

 

4. VM 에 VNet 설정 (같은 vlan 태그끼리만 통신 / 외부 네트워크 x)

 

1) 웹 UI 에서 설정할 경우

- 메뉴 : 데이터센터 > 하드웨어 > 네트워크 디바이스 > '수정' 누르고, VLAN 태그를 1로 설정

 

그리고 1001 VM 을 시작합니다.

 

2) CLI 에서 설정할 경우

VM 에 VNet 을 연결할때 tag 값으로 설정해야 합니다.

# qm set 1001 --net0 virtio,bridge=vmbr0,tag=1


VM 을 시작합니다.

# qm start 1001

 

 

※ 참고

- tag 가 같은 VM 끼리만 통신이 가능합니다.

- 예제와 같이 사설 IP 를 셋팅하면, 외부 통신은 불가능합니다. 사설 IP 라 할지라도 외부 통신이 되게 하려면 공인 IP 추가하거나 NAT 를 사용해야 합니다.

VM 에 두번째 네트워크 인터페이스를 추가하고 IP 정보를 셋팅합니다.

# qm set 1001 --net1 virtio,bridge=vmbr0

# qm set 1001 --ipconfig1 ip=115.68.142.7/27,gw=115.68.142.1

 

Cloud-Init 설정은 일반적으로 VM이 처음 부팅될 때 적용되지만, 네트워크 설정과 같은 일부 변경 사항은 VM이 재부팅 되어야만 반영됩니다.

VM 을 리부팅하여 적용합니다.

VM 내에서 리부팅 하려면, reboot 명령 말고 init 0 을 사용해서 서버를 완전히 껐다가 켜야 합니다.

# qm reboot 1001

 

 

5. 방화벽 사용 (모든 VM 끼리 통신 차단 / 외부 네트워크 o)

 

다른 방법이 있는지 모르겠지만, 웹 UI 에서 제공하는 방화벽 만으로 처리가 가능하다는 것을 알았습니다.

방화벽 설정을하면 다양한 룰 적용이 가능하며, 이렇게 적용한 룰은 iptables 에 바로 반영이 됩니다.

아래 예제는 모든 VM 끼리 통신을 차단하면서 외부 네트워크는 연결이 되도록 설정한 방법입니다.

(Vnet 아님)

 

1) 방화벽 활성화 설정
데이터센터 레벨 / 노드 레벨 / VM 레벨 세군데 모두 '방화벽' 메뉴가 있습니다. 이곳으로 이동하여 옵션의  방화벽을 '예' 로 바꾸어 활성화 합니다.
추가로 VM > 하드웨어 > 네트워크 디바이스에서도 '방화벽' 옵션을 체크하여 활성화 합니다.

2) 규칙 설정
PVE 웹UI 에서 특정 VM 을 선택합니다.
방화벽 메뉴에서 '추가' 버튼을 눌러 새 규칙을 추가합니다.

아래 규칙을 통해 들어오는 모든 트래픽을 차단합니다.
- 방향 : in
- 작업 : DROP
- 소스 : 0.0.0.0/0
- 대상 : 10.0.0.101/32    // 현재 VM IP
- 프로토콜 : tcp

 

외부에서 VM 특정 포트로 접근을 한다면 호스트를 거쳐오기 때문에 호스트 IP 및 목적지 포트를 허용해 주어야 합니다.

- 방향 : in
- 작업 : ACCEPT
- 소스 : 10.0.0.1/32        // 호스트 IP
- 대상 : 10.0.0.101/32    // 현재 VM IP
- 프로토콜 : tcp

- 목적지 포트 : 3389

 

 

6. 퍼포먼스 확인 (따라할 필요 x)

 

테스트 환경 노드 1대가 8 Core / 16 GB 메모리를 사용중입니다.

개별 VM 사용자가 1개의 VM 만 사용시, VM 개수만큼 VNet 가 생성되므로, 여기에서는 퍼포먼스 확인을 위해 VM 100개와  VNet 100개를 생성해 보았습니다.

 

1) VNets 생성

스크립트를 이용해 100개의 VNet 을 생성합니다. (기존 VNets 는 지워주세요)

# vi make_vnets.sh

#!/bin/bash

for i in `seq 1 100`; do
    pvesh create /cluster/sdn/vnets --vnet vnet${i} --zone personal --tag ${i}
done

 

# sh make_vnets.sh

 

그다음 VM 생성 스크립트를 이용해 local-lvm 스토리지에 100개의 VM 을 생성합니다. 생성할때 먼저 만들어진 VNet 을 할당하는 방식입니다.

서버 자원이 부족할 수 있기 때문에 VM 의 CPU 는 공유 형태로 생성합니다.

- VM ( CPU : 1 Core / Memory : 1GB ) * 100개

 

2) VM 생성

스크립트를 이용해 100개의 VM 을 생성합니다. (기존 VM 은 지워주세요)

# vi make_vm.sh

#!/bin/bash

for i in `seq 1 100`; do
  id=$((1000 + i))
  ip=$((100 + i))

  qm create ${id} --name ubuntu-${id} --cores 1 --memory 1024 --net0 virtio,bridge=vmbr0
  qm importdisk ${id} /var/lib/vz/template/iso/noble-server-cloudimg-amd64.img local-lvm
  qm set ${id} --virtio0 local-lvm:vm-${id}-disk-0
  qm set ${id} --boot c --bootdisk virtio0
  qm set ${id} --serial0 socket --vga serial0
  qm set ${id} --agent enabled=1
  qm set ${id} --ide2 local-lvm:cloudinit
  qm set ${id} --ciuser root --cipassword 12345678 --nameserver 8.8.8.8 --ipconfig0 "ip=192.168.10.${ip}/24,gw=192.168.10.1"
  qm set ${id} --net0 virtio,bridge=vmbr0,tag=${i}
  qm start ${id}
done

 

# sh make_vm.sh

 

* 결과

- CPU 와 메모리의 합산이 물리적인 사양을 넘어설 경우 공유 형태로 사용이 되어집니다.

- 100개의 VM 을 생성하였지만 켜지지 않는 VM 이 있었습니다. 일부러 부팅을 시도하면 켜지긴 하지만 모두 켜놓으면 다시 꺼지는 VM 이 있습니다. 꺼져있는 VM 을 삭제하니 60개의 VM 만 남아 있었고, VM 에서 명령을 수행할때 느린 느낌은 없었습니다.

 

3) LXC 생성

이번에는 LXC (리눅스 컨테이너) 를 여러개 생성해 보겠습니다.

사용가능한 LXC 리스트를 업데이트 하고 원하는 OS 를 출력합니다. (여기에서는 Ubuntu)

# pveam update

# pveam available | grep ubuntu
system          ubuntu-20.04-standard_20.04-1_amd64.tar.gz
system          ubuntu-22.04-standard_22.04-1_amd64.tar.zst
system          ubuntu-23.04-standard_23.04-1_amd64.tar.zst
system          ubuntu-23.10-standard_23.10-1_amd64.tar.zst
system          ubuntu-24.04-standard_24.04-2_amd64.tar.zst

 

원하는 버전의 파일을 다운로드 합니다.

# pveam download local ubuntu-22.04-standard_22.04-1_amd64.tar.zst

 

스크립트를 이용해 100개의 LXC 를 생성합니다. (기존 VM 은 지워주세요)

# vi make_lxc.sh

#!/bin/bash

for i in `seq 1 100`; do
  id=$((1000 + i))
  ip=$((100 + i))

  pct create ${id} local:vztmpl/ubuntu-22.04-standard_22.04-1_amd64.tar.zst \
  -hostname ubuntu-${i} \
  -cores 1 \
  -memory 1024 \
  -rootfs local-lvm:2 \
  -net0 name=eth0,bridge=vmbr0,ip=192.168.10.${ip}/24,gw=192.168.10.1,tag=${i} \
  -password 12345678 \
  -onboot 1

  pct start ${id}
done

 

# sh make_lxc.sh

 

* 참고

VNet 을 설정하면 같은 tag 끼리만 통신할 수 있습니다.

# pct set 1001 -net0 name=eth0,bridge=vmbr0,ip=192.168.10.101/24,gw=192.168.10.1,tag=1

 

공인 IP 를 추가하려면 아래 명령을 실행합니다.

VM 에 두번째 네트워크 인터페이스를 추가하고 IP 정보를 셋팅합니다.

# pct set 1001 -net1 name=eth1,bridge=vmbr0

# pct set 1001 -net1 name=eth1,bridge=vmbr0,ip=115.68.142.7/27,gw=115.68.142.1

 

LXC 는 리부팅 없이 바로 네트워크 사용이 가능합니다.

 

* 결과

- CPU 와 메모리의 합산이 물리적인 사양을 넘어설 경우 공유 형태로 사용이 되어집니다.

- 스크립트로 100개 생성 후, 추가로 50개를 더 생성하여 총 150개의 LXC 를 생성하였지만 모두 잘 생성되고 실행되었습니다. 한개의 LXC 에서 외부 네트워크 연결 후 패키지 설치 테스트 등을 해봐도 느리다는 느낌은 없었습니다.

 

반응형

댓글()

Kubernetes Namespace 또는 Pod 의 리소스 및 볼륨 백업하기 (Velero)

리눅스/DaaS|2024. 7. 22. 15:18
반응형

쿠버네티스 환경에서는 백업 및 복원을 위해 다양한 도구를 사용할 수 있습니다. 대표적인 도구로는 Velero, Kopia 가 있습니다. 이것은 쿠버네티스 클러스터의 백업, 복원, 마이그레이션을 위한 오픈 소스 도구입니다.

백업 파일을 저장하기 위해서는 S3 호환 스토리지 (예: AWS S3, MinIO 등) 가 필요한데, 여기서는 MinIO 를 예로 들어 설명합니다.

 

 

1. Velero 클라이언트 설치

 

Velero 클라이언트를 설치하려면 Velero GitHub 릴리즈 페이지에서 최신 버전을 다운로드하고 설치합니다.

 

1) 최신 버전 확인 및 다운로드

# export VELERO_VERSION=$(curl -s https://api.github.com/repos/vmware-tanzu/velero/releases/latest | jq -r .tag_name)

 

2) Velero 다운로드

# wget https://github.com/vmware-tanzu/velero/releases/download/${VELERO_VERSION}/velero-${VELERO_VERSION}-linux-amd64.tar.gz

 

3) 압축 해제 및 이동

# tar -xvf velero-${VELERO_VERSION}-linux-amd64.tar.gz

# mv velero-${VELERO_VERSION}-linux-amd64/velero /usr/local/bin/

 

4) 설치 확인

# velero version

Client:
Version: v1.14.0
Git commit: 2fc6300f2239f250b40b0488c35feae59520f2d3
<error getting server version: no matches for kind "ServerStatusRequest" in version "velero.io/v1">

 

아래에서 서버 컴포넌트를 설치할 예정이므로, 출력된 에러는 무시해도 됩니다.

 

 

2. Velero 서버 컴포넌트 설치

 

Velero 는 Kubernetes 리소스 설정 및 볼륨 데이터 백업이 가능하지만, 볼륨에 포함되지 않은 컨테이너 내에 추가 생성된 파일은 백업이 되지 않습니다.

Velero 서버 컴포넌트 사용시 S3 호환 스토리지 (예: AWS S3, MinIO 등) 가 필요한데, 여기서는 MinIO 를 예로 들어 설명합니다.

MinIO 설치 방법은 별도 포스팅을 참고해 주세요.

(https://sysdocu.tistory.com/1942)

 

1) MinIO 자격 증명 파일 생성

Velero 가 MinIO 에 접근할 수 있도록 자격 증명 파일을 생성합니다. credentials-velero 라는 파일을 다음과 같이 작성합니다.

설정에 aws 라는 문구가 있어도 무시해도 됩니다. S3 를 기준으로 만들어졌으나 MinIO 스토리지도 호환됩니다.

# vi credentials-velero.ini

[default]
aws_access_key_id = minioadmin
aws_secret_access_key = minioadmin

 

(어디에서든)

MinIO 버킷을 생성 합니다.

# wget https://dl.min.io/client/mc/release/linux-amd64/mc

# chmod +x mc

# mv mc /usr/local/bin/

# mc alias set sysdocu http://115.68.249.52:9000 minioadmin minioadmin

# mc mb sysdocu/mybucket

 

2) Velero 서버 설치

(마스터 노드에서)

MinIO 버킷과 서버 IP, Port 를 이용하여 Velero 서버를 설치합니다.

# velero install \
    --provider aws \
    --plugins velero/velero-plugin-for-aws:v1.10.0 \
    --bucket mybucket \
    --secret-file ./credentials-velero.ini \
    --backup-location-config region=minio,s3ForcePathStyle="true",s3Url=http://115.68.249.52:9000 \
    --snapshot-location-config region=minio \
    --use-node-agent \
    --privileged-node-agent \
    --uploader-type=kopia

 

provider 가 aws 인 이유는 MinIO 는 S3 호환 스토리지이기 때문입니다.

맨 아래 세개 옵션은 Kopia 형식으로 백업이 가능하다고 하고 옵션은 존재하지만, 실제로 해보니 컨테이너 내 임시파일까지는 백업이 되지 않습니다.

추후 방법 확인시 업데이트 하겠습니다.

 

3) 설치 확인

# kubectl get pods -n velero
NAME                      READY   STATUS    RESTARTS   AGE
velero-6d798fd6f9-7drfh   1/1     Running   0          29s

 

서버 버전도 잘 표시 됩니다.

# velero version
Client:
Version: v1.14.0
Git commit: 2fc6300f2239f250b40b0488c35feae59520f2d3
Server:
Version: v1.14.0

 

 

3. Velero 백업 및 복원

 

Velero 를 설치한 후에는 백업 및 복원 작업을 수행할 수 있습니다.


1) 백업 생성

형식) velero backup create <backup-name> --include-namespaces <namespace-name>

# velero backup create sysdocu-full-backup --include-namespaces sysdocu

 

위 명령어는 지정된 네임스페이스 내의 모든 리소스를 백업합니다.

이 명령어를 실행하면 해당 네임스페이스에 있는 모든 Pod, Service, Secret, ConfigMap, PersistentVolumeClaim 등의 Kubernetes 리소스가 백업됩니다.

 

특정 Pod 하나에 관련된 리소스만 백업하려면 --selector 옵션만 추가하여 다음과 같이 명령을 실행합니다.

형식) velero backup create <backup-name> --include-namespaces <namespace-name> --selector <selector-value>

# velero backup create nginx-backup --include-namespaces sysdocu --selector app=nginx

 

참고로, selector 가 없는 경우 아래와 같이 Pod 에 selector 를 추가할 수 있습니다.

# kubectl label pod nginx-deployment-7c79c4bf97-7wj9r -n sysdocu app=nginx

 

velero 는 볼륨 데이터도 백업이 가능하지만, 볼륨에 포함되지 않은 컨테이너 내에 추가 생성된 파일은 백업이 되지 않습니다.

 

2) 백업 목록 조회

# velero backup get

 

3) 백업 복원

# velero restore create --from-backup <backup-name>

 

백업본을 다른 이름의 네임스페이스로 복원할 수 있습니다. (컨테이너 이전에 사용하면 좋을듯)
# velero restore create --from-backup <backup_name> --namespace-mappings <old-namespace>:<new-namespace>

 

4) 백업 삭제

잘못된 백업 파일이나 오래된 백업 파일의 경우 다음과 같이 삭제 할 수 있습니다.

# velero backup delete <backup-name>

 

※ 참고 : Velero 제거

Velero 설치를 취소하려면 Velero 관련 리소스를 삭제하기만 하면 됩니다.

# kubectl delete namespace velero

 

 

 

 

 

 

 

 

 

========== 아래는 미검증 작성 자료 ==========

 

 

4. Kopia 백업 툴 설치 (임시 파일도 백업 가능)

 

이번에는 Pod 파일시스템 영역의 변경된 파일 백업 기능을 지원하며, 다량의 파일 백업시 진가 (속도) 를 발휘하는 Kopia 백업 툴을 설치해 보도록 하겠습니다.

 

1) Kopia 설치하기

# curl -s https://kopia.io/signing-key | gpg --dearmor > kopia.gpg

# install -o root -g root -m 644 kopia.gpg /usr/share/keyrings/

# echo "deb [signed-by=/usr/share/keyrings/kopia.gpg] https://packages.kopia.io/apt/ stable main" | sudo tee /etc/apt/sources.list.d/kopia.list > /dev/null

# apt -y update

# apt -y install kopia

# apt -y install kopia-ui    # 어디에 사용하는지 확인 필요

 

설치 버전을 확인합니다.

# kopia --version
0.17.0 build: 89c8eb47af2e1d5c1d14fe299a0cf7eaac095abf from: kopia/kopia

 

2) Kopia 저장소 초기화

# kopia repository create s3 \
    --bucket=mybucket \
    --endpoint=http://115.68.249.52:9000 \
    --access-key=minioadmin \
    --secret-access-key=minioadmin \
    --region=minio \
    --config-file=/root/kopia-repo.config

 

3) 

 

 

5. Kanister 백업 툴 (임시 파일도 백업 가능)

 

Helm 으로 쉽게 설치하고 사용할 수 있습니다.

 

1) Helm 설치

# wget https://get.helm.sh/helm-v3.12.0-linux-amd64.tar.gz

# tar xvzf helm-v3.12.0-linux-amd64.tar.gz

# mv linux-amd64/helm /usr/local/bin/

 

2) Kanister 설치

# helm repo add kanister https://charts.kanister.io

# helm repo update

# helm install my-kanister --namespace kanister --create-namespace kanister/kanister-operator

 

3) Kanister 프로필 생성

백업 데이터를 저장할 스토리지 위치를 정의하는 Profile 을 생성합니다.

여기에서는 MinIO 로 구성한 서버의 Profile 을 생성하겠습니다.

# vi minio-secret.yaml

apiVersion: v1
kind: Secret
metadata:
  name: minio-secret
  namespace: kanister
type: Opaque
stringData:
  aws_access_key_id: minioadmin
  aws_secret_access_key: minioadmin

 

# kubectl apply -f minio-secret.yaml

# vi minio-profile.yaml

apiVersion: cr.kanister.io/v1alpha1
kind: Profile
metadata:
  name: minio-profile
  namespace: kanister
spec:
  location:
    type: s3Compliant
    bucket: mybucket
    endpoint: 115.68.249.52:9000
    prefix: sysdocu/mybucket
  secret:
    name: minio-secret
    namespace: kanister

 

# kubectl apply -f minio-profile.yaml

 

 

반응형

댓글()

Kubernetes 에서 네임스페이스 네트워크 격리 및 특정 포트 허용하기 (Calico)

리눅스/DaaS|2024. 7. 22. 15:05
반응형

Kubernetes 에서 네임스페이스 내의 Pod 끼리 통신을 허용하고 모든 외부의 접근은 차단 시킬 수 있습니다. 또한 특정 서비스 접근이 필요한 경우 포트를 허용하여 접근하게 할 수 있습니다.

아래 웹페이지 내용을 참고하여 재작성하였습니다.

- 출처 : https://www.qovery.com/blog/basic-network-isolation-in-kubernetes/

 

 

1. 애플리케이션 생성

 

애플리케이션을 배포하고 외부에서 접근하기 위한 네트워크 설정 예제 입니다.

애플리케이션에 도메인 연결 필요시 다른 포스팅을 참고해 주세요.

(https://sysdocu.tistory.com/1851 , '5) Ingress 생성' 부분)

 

1) Namespace

애플리케이션을 생성하고 배포할 작업공간을 생성합니다.

# vi namespace.yaml

apiVersion: v1
kind: Namespace
metadata:
  name: sysdocu
  labels:
    role: sysdocu

 

# kubectl apply -f namespace.yaml

 

2) Deployment 생성

Deployment 를 사용하면 Pod 생성 및 여러가지 옵션을 추가하여 다양한 구성이 가능합니다.

Deployment yaml 파일을 작성합니다.

# vi deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  namespace: sysdocu
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx:latest
          ports:
            - containerPort: 80

 

작성한 yaml 파일을 적용하여 생성합니다.

# kubectl apply -f deployment.yaml

 

3) Service 생성

네트워크 접근이 가능하도록 Service 를 생성해 줍니다.

테스트 목적이긴 하지만 외부 네트워크에서 접근이 되도록 해보겠습니다.

Service yaml 파일을 작성합니다.

# vi service.yaml

apiVersion: v1
kind: Service
metadata:
  name: nginx
  namespace: sysdocu
spec:
  selector:
    app: nginx
  type: NodePort
  ports:
    - protocol: TCP
      nodePort: 30080  # 외부 트래픽이 접근하는 노드의 포트 (범위 : 30000~32767)
      port: 80                # 클러스터 내에서 서비스가 노출되는 서비스 포트
      targetPort: 80      # Pod 의 컨테이너가 리스닝하는 포트

 

* 참고

Service 에서 생성할 type 은 ClusterIP, NodePort, LoadBalancer 가 있습니다.

- ClusterIP : 클러스터 내부 통신만 가능한 IP

- NodePort : worker 노드의 IP 와 지정한 포트 (30000~32767 로 제한) 를 이용해 Pod 에 연결 가능

- LoadBalancer : 별도의 공인 IP 가 할당되고, 포트를 마음대로 사용 가능 (베어메탈 환경에서는 MetalLB 를 설치 필요)

 

작성한 yaml 파일을 적용하여 생성합니다.

# kubectl apply -f service.yaml

 

외부 네트워크에서 애플리케이션에 접근되는지 확인합니다.

접근할 IP 는 Pod 가 위치하는 worker 노드인데, 아래 명령으로 확인 가능합니다.

# kubectl get pod -o wide

NAME                                READY   STATUS    RESTARTS   AGE     IP            NODE      NOMINATED NODE   READINESS GATES
nginx-deployment-694db9fb84-b5h2r   1/1     Running   0          7m22s   10.101.1.66   worker2   <none>           <none>

 

worker2 노드인것을 확인하였으며, 외부에서 worker2 노드의 공인 IP 와 위에서 설정한 포트 30080 으로 접근시 nginx 초기페이지가 출력되는것이 확인됩니다. 예제에서는 worker2 노드의 공인 IP 로 연결하였지만 실제로는 꼭 worker2 노드의 공인 IP 로 할 필요는 없습니다. NodePort 의 경우 master 또는 어떤 worker 노드로 연결하던 설정한 Pod 로 연결됩니다.

# curl 115.68.142.4:30080

 

 

2. 네트워크 정책 설정

 

Kubernetes 는 네트워크 방화벽처럼 작동하는 네트워크 트래픽을 허용/거부할 수 있는 네트워크 정책 (NetworkPolicy) 이라는 리소스를 제공합니다. 기본적으로 이 리소스를 사용하려면 먼저 이를 구현하는 Kubernetes Networking 플러그인 (Calico) 을 추가해야 합니다. 아래 URL 을 참고하세요.

(https://sysdocu.tistory.com/1851 , '4. Calico 설치' 부분)

 

아래 예제에서는 sysdocu 네임스페이스를 다른 모든 네임스페이스와 분리하되, sysdocu 네임스페이스 내에 배포된 모든 Pod 가 서로 연결 할 수 있도록 구성합니다.

 

1) 들어오는 모든 트래픽 차단

sysdocu 네임스페이스에 들어오는 트래픽을 차단하는 것은 다음과 같습니다.

# vi drop.yaml

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: no-inbound-traffic
  namespace: sysdocu
spec:
  policyTypes:
  - Ingress
  podSelector:
    matchLabels: {}

 

policyTypes : Ingress 는 들어오는 트래픽만 선택합니다. 참고로 나가는 트래픽 제어는 Egress 으로 변경하거나 추가하면 됩니다.

podSelector/matchLabels : 내용을 비우면 네임스페이스 내의 모든 Pod 에 규칙을 적용합니다. 입력 규칙이 정의되지 않았으므로 모든 것이 차단됩니다.

 

# kubectl apply -f drop.yaml

 

2) 동일한 네임스페이스 내의 Pod 간 트래픽 허용

sysdocu 네임스페이스 내의 모든 Pod 가 서로 통신할 수 있도록 하려면 네트워크 정책 규칙을 추가합니다.

# vi same.yaml

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-same-namespace-traffic
  namespace: sysdocu
spec:
  policyTypes:
  - Ingress
  podSelector:
    matchLabels: {}
  ingress:
  - from:
    - namespaceSelector:
        matchLabels:
          role: sysdocu

 

# kubectl apply -f same.yaml

 

3) 외부에서 들어오는 특정 포트 트래픽 허용

위에서 미리 만들어 둔 웹 애플리케이션 nginx 가 Pod 에서 80 포트로 서비스 되고 있습니다. 이를 공개적으로 액세스할 수 있도록 하려면 다음과 같은 규칙을 하나 더 추가해야 합니다.

# vi allow.yaml

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-port-80
  namespace: sysdocu
spec:
  policyTypes:
  - Ingress
  podSelector:
    matchLabels:
      app: nginx
  ingress:
  - ports:
    - port: 80

 

# kubectl apply -f allow.yaml

 

주의할 것은, 노드의 포트 (30080) 가 아니고, Pod 의 포트 (80) 입니다.

이렇게 모든 Pod 를 선택하는 대신, sysdocu 네임스페이스의 레이블 app: nginx 가 있는 Pod 만 선택합니다. 그런 다음 규칙을 적용하면 누구나 웹 애플리케이션의 포트 80 번에 연결할 수 있습니다.

물론 외부에서 접근하기 때문에 NodePort 30080 으로 접근해야 합니다.

 

외부 네트워크 PC 에서 테스트 하는 방법입니다.

# curl 115.68.142.4:30080

 

4) 나가는 트래픽 모두 차단 (선택 사항)

네트워크 정책을 사용하여 트래픽이 나가는 것을 방지할 수도 있습니다.

차단 전에 테스트를 위해 telnet 패키지를 먼저 설치합니다.

Pod 이름은 먼저 확인해 주세요.

# kubectl exec -it nginx-deployment-7c79c4bf97-7wj9r -n sysdocu -- apt -y install telnet

 

구글 DNS 를 제외하고 모든 트래픽을 차단하는 설정입니다.

# vi drop.yaml

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: disable-outbound-traffic
  namespace: sysdocu
spec:
  policyTypes:
  - Egress
  podSelector:
    matchLabels: {}
  egress:
  - to:
    - ipBlock:
        cidr: 8.8.8.8/32
    - ipBlock:
        cidr: 8.8.4.4/32
    ports:
    - protocol: UDP
      port: 53
    - protocol: TCP
      port: 53

 

# kubectl apply -f allow.yaml

 

Pod 쉘에 로그인하여 명령을 통해 확인해보면 됩니다.

# kubectl exec -it nginx-deployment-7c79c4bf97-7wj9r -n sysdocu -- bash

# telnet 164.124.101.2 53

# telnet 8.8.8.8 53

# apt update

 

반응형

댓글()

Proxmox VM 에서 NVIDIA GPU 장치 사용하기 (CUDA, cuDNN, TensorFlow 설치 포함)

리눅스/OS 일반|2024. 7. 16. 16:10
반응형

여기에서는 Proxmox VE 8.2.4 환경에서 테스트 하였으며, VM OS 는 Ubuntu 24.04 입니다.

 


1. Proxmox VE 호스트 서버에서 설정

 

grub 파일을 수정하고 업데이트 합니다.

아래에서 AMD CPU 는 amd_iommu=on 으로, INTEL CPU 는 intel_iommu=on 으로 입력하고 나머지는 동일하게 설정해 줍니다.

# vi /etc/default/grub

GRUB_CMDLINE_LINUX_DEFAULT="quiet amd_iommu=on amd_iommu=pt pcie_acs_override=downstream,multifunction nofb video=efifb:off vga=off"

 

수정한 내용을 적용합니다.

# update-grub

 

VFIO (Virtual Function I/O) 관련 커널 모듈을 /etc/modules 파일에 추가하여 시스템이 부팅될 때마다 해당 모듈

이 자동으로 로드되도록 설정합니다.

# echo "vfio" >> /etc/modules

# echo "vfio_iommu_type1" >> /etc/modules

# echo "vfio_pci" >> /etc/modules

# echo "vfio_virqfd" >> /etc/modules

 

Proxmox VE 호스트 서버에서 GPU 를 인식하지 않도록 blacklist 에 등록합니다.

echo "blacklist nouveau" >> /etc/modprobe.d/blacklist.conf

echo "blacklist nvidia" >> /etc/modprobe.d/blacklist.conf

echo "blacklist radeon" >> /etc/modprobe.d/blacklist.conf

 

VFIO 정보를 등록해 줍니다.

먼저 NVIDIA 관련 장치 정보를 출력합니다.

# lspci -nn | grep -i nvidia
65:00.0 VGA compatible controller [0300]: NVIDIA Corporation TU104 [GeForce RTX 2080] [10de:1e82] (rev a1)
65:00.1 Audio device [0403]: NVIDIA Corporation TU104 HD Audio Controller [10de:10f8] (rev a1)
65:00.2 USB controller [0c03]: NVIDIA Corporation TU104 USB 3.1 Host Controller [10de:1ad8] (rev a1)
65:00.3 Serial bus controller [0c80]: NVIDIA Corporation TU104 USB Type-C UCSI Controller [10de:1ad9] (rev a1)

 

위 출력 결과를 이용해 설정 파일을 만듭니다.

여기에서는 VM 이 사용할 예정이므로 USB 는 제외하고 GPU 와 Audio Controller 만 추가하겠습니다.

# echo "options vfio-pci ids=10de:1e82,10de:10f8 disable_vga=1" > /etc/modprobe.d/vfio.conf

 

initramfs 를 업데이트하고 재부팅 합니다.

# update-initramfs -u

update-initramfs: Generating /boot/initrd.img-6.8.4-2-pve

Running hook script 'zz-proxmox-boot'..

Re-executing '/etc/kernel/postinst.d/zz-proxmox-boot' in new private mount namespace..

No /etc/kernel/proxmox-boot-uuids found, skipping ESP sync.

 

# reboot

 


2. VM 에서 설정

 

1) PCI 드라이버 추가

Proxmox VE 웹 UI 에서 VM 설정을 진행합니다.

- 메뉴 : 하드웨어 > 추가 > 'PCI 디바이스' 를 선택합니다.

0000:65:00.0 / 1 / NVIDIA Corporation / TU104 [GeForce TRX 2080] 

이런 형태의 장치입니다. 선택하고 추가한 후에 VM 을 시작합니다.

 

부팅이 되었으면 로그인하여 장치가 보이는 것을 확인합니다.

# lspci |grep -i nvidia
00:10.0 VGA compatible controller: NVIDIA Corporation TU104 [GeForce RTX 2080] (rev a1)

 

2) NVIDIA 드라이버 설치

현재 시스템에서 사용 가능한 NVIDIA 드라이버 버전을 확인합니다.

# apt -y update

# apt -y install ubuntu-drivers-common alsa-utils

# ubuntu-drivers devices

udevadm hwdb is deprecated. Use systemd-hwdb instead.

udevadm hwdb is deprecated. Use systemd-hwdb instead.

udevadm hwdb is deprecated. Use systemd-hwdb instead.

udevadm hwdb is deprecated. Use systemd-hwdb instead.

udevadm hwdb is deprecated. Use systemd-hwdb instead.

udevadm hwdb is deprecated. Use systemd-hwdb instead.

== /sys/devices/pci0000:00/0000:00:10.0 ==

modalias : pci:v000010DEd00001E82sv000010DEsd000012B0bc03sc00i00

vendor   : NVIDIA Corporation

model    : TU104 [GeForce RTX 2080]

driver   : nvidia-driver-535-open - distro non-free

driver   : nvidia-driver-470-server - distro non-free

driver   : nvidia-driver-535 - distro non-free recommended

driver   : nvidia-driver-535-server-open - distro non-free

driver   : nvidia-driver-470 - distro non-free

driver   : nvidia-driver-535-server - distro non-free

driver   : xserver-xorg-video-nouveau - distro free builtin

 

여기에서는 출력된 목록에서 추천 표시된 버전으로 설치해 보겠습니다.

# apt -y install nvidia-driver-535

설치가 되었으면 리부팅을 합니다.
# reboot

부팅 후 아래 명령으로 설치 여부와 NVIDIA 드라이버 버전에 맞는 CUDA 버전을 확인합니다.

(표시된 CUDA 버전은 설치되어 있는 버전이 아니고, 드라이버에 맞는 추천 버전이란 뜻입니다)

# nvidia-smi
Wed Jul 17 07:56:39 2024       
+---------------------------------------------------------------------------------------+
NVIDIA-SMI 535.183.01             Driver Version: 535.183.01   CUDA Version: 12.2     |
|-----------------------------------------+----------------------+----------------------+
| GPU  Name                 Persistence-M | Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp   Perf          Pwr:Usage/Cap |         Memory-Usage | GPU-Util  Compute M. |
|                                         |                      |               MIG M. |
|=========================================+======================+======================|
|   0  NVIDIA GeForce RTX 2080        Off | 00000000:00:10.0 Off |                  N/A |
| 28%   52C    P8              19W / 215W |      1MiB /  8192MiB |      0%      Default |
|                                         |                      |                  N/A |
+-----------------------------------------+----------------------+----------------------+
                                                                                         
+---------------------------------------------------------------------------------------+
| Processes:                                                                            |
|  GPU   GI   CI        PID   Type   Process name                            GPU Memory |
|        ID   ID                                                             Usage      |
|=======================================================================================|
|  No running processes found                                                           |
+---------------------------------------------------------------------------------------+

 

NVIDIA 커널 모듈도 로드가 잘 되었는지 확인합니다.

# lsmod | grep nvidia
nvidia_uvm           1789952  0
nvidia_drm             90112  0
nvidia_modeset       1314816  1 nvidia_drm
video                  73728  1 nvidia_modeset
nvidia              56827904  2 nvidia_uvm,nvidia_modeset

 

이제 위에서 확인된 CUDA 12.2 를 설치할 차례 입니다.

 

3) CUDA Toolkit 설치

NVIDIA 의 CUDA Toolkit 을 설치합니다.

CUDA Toolkit 에는 TensorFlow 가 GPU 에서 실행되는 데 필요한 모든 라이브러리가 포함되어 있습니다.

아래는 검색을 통해 찾은 URL 인데, 12.2 버전과 드라이버 535 버전이 맞으므로 다운로드를 하였습니다.

# wget https://developer.download.nvidia.com/compute/cuda/12.2.2/local_installers/cuda_12.2.2_535.104.05_linux.run

# chmod +x cuda_12.2.2_535.104.05_linux.run

# ./cuda_12.2.2_535.104.05_linux.run

 

처음 설치 화면이 뜨기까지 시간이 걸릴 수 있으며, 설치 과정은 Continue 선택 > accept 입력 > (미리 설치했으므로) 'Driver' 제외 및 나머지 기본값으로 Install 입니다.

파일 사이즈가 크기 때문에 여기에서도 시간이 다소 소요됩니다.

 

CUDA 설치가 완료되면, ~/.bashrc 파일에 경로를 추가하여 CUDA 바이너리에 접근할 수 있도록 합니다.

# echo 'export PATH=/usr/local/cuda-12.2/bin:$PATH' >> ~/.bashrc

# echo 'export LD_LIBRARY_PATH=/usr/local/cuda-12.2/lib64:$LD_LIBRARY_PATH' >> ~/.bashrc

# source ~/.bashrc

 

설치된 CUDA 버전을 확인합니다.

# nvcc -V

nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2023 NVIDIA Corporation
Built on Tue_Aug_15_22:02:13_PDT_2023
Cuda compilation tools, release 12.2, V12.2.140
Build cuda_12.2.r12.2/compiler.33191640_0

 

4) cuDNN 설치

cuDNN 은 NVIDIA 의 GPU 가속 라이브러리로, TensorFlow 와 같은 딥러닝 프레임워크의 성능을 높이는 데 사용됩니다.

- 로그인하여 버전별 다운로드 가능 : https://developer.nvidia.com/rdp/cudnn-archive

- 구버전은 로그인 없이 다운로드 가능 : https://developer.download.nvidia.com/compute/redist/cudnn/

작업 PC 에서 파일을 다운로드 받아 서버에 업로드 하고 설치를 이어갑니다.

# dpkg -i cudnn-local-repo-ubuntu2204-8.9.7.29_1.0-1_amd64.deb

 

설치가 되고 출력 내용에 키를 설치하라고 나옵니다. 명령을 따라 실행합니다.

# sudo cp /var/cudnn-local-repo-ubuntu2204-8.9.7.29/cudnn-local-08A7D361-keyring.gpg /usr/share/keyrings/

# apt -y update
# apt -y install libcudnn8=8.9.7.29-1+cuda12.2
# apt -y install libcudnn8-samples=8.9.7.29-1+cuda12.2

 

설치된 버전을 확인합니다.

# cat /usr/include/cudnn_version.h |grep CUDNN_MAJOR -A 2

#define CUDNN_MAJOR 8

#define CUDNN_MINOR 9

#define CUDNN_PATCHLEVEL 7

 

5) Anaconda 설치

Anaconda 는 데이터 과학 및 머신 러닝을 위한 종합적인 Python 배포판으로, TensorFlow 와 같은 패키지를 손쉽게 설치하고 관리할 수 있습니다.
# wget https://repo.anaconda.com/archive/Anaconda3-2024.06-1-Linux-x86_64.sh
# chmod +x Anaconda3-2024.06-1-Linux-x86_64.sh 
# ./Anaconda3-2024.06-1-Linux-x86_64.sh 

설치 과정에서 ENTER 누르고 > accept 입력 > yes 입력 > yes 입력하면 설치됩니다.
추가된 명령을 사용하기 위해 환경설정을 다시 로드 합니다.
# source /root/.bashrc

버전을 확인합니다.
(base) root@test:~# python --version
Python 3.12.4

(base) root@test:~# conda --version
conda 24.5.0

sysdocu 라는 가상 환경을 생성합니다.

(base) root@test:~# conda create -n sysdocu

 

가상 환경 목록을 확인합니다.

(base) root@test:~# conda env list

 

생성된 가상 환경을 활성화 합니다.

(base) root@test:~# conda activate sysdocu

 

참고로 비활성화 하는 명령은 다음과 같습니다. (필요시 사용)

(sysdocu) root@test:~# conda deactivate

 

6) TensorFlow 설치

Anaconda 가상 환경에서 TensorFlow 설치를 이어갑니다.

(sysdocu) root@test:~# conda install tensorflow

 

현재 가상 환경에 설치된 패키지 목록을 확인합니다.

(sysdocu) root@test:~# conda list

 

 

3. 동작 테스트

 

코드를 실행할때 INFO 정보가 출력되는데, 결과와 같이 출력되어 보기에 좋지 않습니다.

우선, 기본적으로 오류가 아닐경우 출력하지 않도록 설정해 줍니다.

(0 = 모든 로그, 1 = 정보 로그, 2 = 경고 로그, 3 = 오류 로그)

(sysdocu) root@test:~#  export TF_CPP_MIN_LOG_LEVEL=3

 

1) 버전 출력 테스트

가상 환경 내에 TensorFlow 설치가 완료되면, 가상 환경 내에서 Python 을 실행하고, 아래 명령을 순차적으로 입력하면 버전이 출력되는데, 이와 같이 TensorFlow 가 정상적으로 설치 되었는지 확인 할 수 있습니다.

(sysdocu) root@test:~# python

>>> import tensorflow as tf

print(tf.__version__)

2.12.0

 

2) 행렬 곱셈 테스트

이번에는 파일을 만들어서 실행해 보겠습니다.
(sysdocu) root@test:~# vi test.py

import tensorflow as tf

# 두 개의 상수 행렬 정의
matrix1 = tf.constant([[3, 3]])
matrix2 = tf.constant([[2], [2]])

# 행렬 곱셈 수행
product = tf.matmul(matrix1, matrix2)

# 결과 출력
print("Matrix 1:")
print(matrix1.numpy())
print("Matrix 2:")
print(matrix2.numpy())
print("Product:")
print(product.numpy())

 

(sysdocu) root@test:~# python test.py

Matrix 1:
[[3 3]]
Matrix 2:
[[2]
 [2]]
Product:
[[12]]

 

3) XOR 게이트 학습 테스트

아래 예제 파일을 만들어서 실행해 봅니다.

이 예제는 TensorFlow 를 사용하여 신경망을 구축하고 학습시키는 과정을 포함하고 있습니다.
(sysdocu) root@test:~# vi test2.py

import tensorflow as tf
import numpy as np

# XOR 데이터셋 정의
X = np.array([[0, 0], [0, 1], [1, 0], [1, 1]], dtype=np.float32)
y = np.array([[0], [1], [1], [0]], dtype=np.float32)

# 신경망 모델 정의
model = tf.keras.Sequential([
    tf.keras.layers.Dense(2, input_dim=2, activation='sigmoid'),
    tf.keras.layers.Dense(1, activation='sigmoid')
])

# 모델 컴파일
model.compile(loss='mean_squared_error',
              optimizer=tf.keras.optimizers.SGD(learning_rate=0.1),
              metrics=['binary_accuracy'])

# 모델 학습
model.fit(X, y, epochs=1000, verbose=0)

# 결과 예측
predictions = model.predict(X)
print("Predictions:")
print(predictions)

 

(sysdocu) root@test:~# python test2.py
1/1 [==============================] - 0s 128ms/step
Predictions:
[[0.50881463]
 [0.48036876]
 [0.5206941 ]
 [0.49291846]]

 

이렇게 결과가 잘 출력 된 것으로 보아 TensorFlow 가 잘 설치되었음을 알 수 있습니다.

 

반응형

댓글()

VMware 가상서버 이미지를 Proxmox 로 이전하기

리눅스/OS 일반|2024. 7. 4. 13:48
반응형

VMware 가상서버 이미지를 Proxmox 로 이전하는 방법입니다.

 

 

1. 이미지 복사

 

WMware 에서 생성한 가상 서버 이름이 test 라고 하면 C:\Users\Administrator\Documents\Virtual Machines\test 디렉토리 내에 가상 서버 이미지 파일이 존재하게 됩니다.

이미지 저장경로에 있는 test.vmdk 파일을 Proxmox 서버로 복사합니다.

 

 

2. 이미지를 복원

 

Proxmox 에서 사용할 VM 을 생성합니다. 생성시 HDD 는 없어도 됩니다.

가져온 이미지로 생성할 것이니까요.

형식) qm importdisk <생성한 가상서버 ID> <가져온 이미지 파일> <스토리지 이름> -format qcow2

# qm importdisk 222 test.vmdk hostdisk -format qcow2

 

생성된 디스크 속성에서 형식을 virtio0 으로 변경하고 옵션 메뉴에서 부팅순서를 우선 부팅으로 잡아줍니다.

VM 을 시작하면 됩니다.

 

반응형

댓글()