[카테고리:] DevOps

  • Nginx Container로 proxy 변경해서 Load balancer 구성하기

    Nginx Container로 proxy 변경해서 Load balancer 구성하기

    Host nginx reverse proxy

    sudo apt update
    sudo apt -y install nginx
    sudo nginx -v
    
    docker run -dit -e SERVER_PORT=5001 -p 5001:5001 -h alb-node01 -u root --name=alb-node01 dbgurum/nginxlb:1.0
    docker run -dit -e SERVER_PORT=5002 -p 5002:5002 -h alb-node02 -u root --name=alb-node02 dbgurum/nginxlb:1.0
    docker run -dit -e SERVER_PORT=5003 -p 5003:5003 -h alb-node03 -u root --name=alb-node03 dbgurum/nginxlb:1.0

    Host nginx reverse proxy 구성

    ~$ sudo mv /etc/nginx/nginx.conf /etc/nginx/nginx.conf.org
    ~$ sudo vi /etc/nginx/nginx.conf
    events { worker_connections 1024; }
    http {
    	# List of application servers
        upstream backend-alb {
        	server 127.0.0.1:5001;
            server 127.0.0.1:5002;
            server 127.0.0.1:5003;
        }
        # Configuration for the server
        server {
        	# Running port
            listen 80 default_server;
            # Proxying the connections
            location / {
            	proxy_pass	http://backend-alb;
            }
        }
    }
    ~$ sudo systemctl restart nginx.service
    ~$ sudo systemctl status nginx.service

    nginx container reverse proxy 구성

    docker run -d -p 8001:80 --name=proxy-container nginx:1.25.0-alpine
    ~$ vi nginx.conf
    events { worker_connections 1024; }
    http {
    	upstream backend-alb {
        	server 192.168.56.101:5001;
    	    server 192.168.56.101:5002;
        	server 192.168.56.101:5003;
        }
        server {
        	listen 80 default_server;
    	    location / {
        		proxy_pass	http://backend-alb;
            }
        }
    }
    ~$ docker cp nginx.conf proxy-container:/etc/nginx/nginx.conf
    ~$ sudo netstat -nlp | grep 8001
    docker restart proxy-container
    docker ps | grep proxy
    curl localhost:8001
  • Docker Network 관리: 효과적인 Proxy Server 사용법

    Docker Network 관리: 효과적인 Proxy Server 사용법

    Docker Network 관리: Proxy Server 가이드

    Proxy

    • 요청자와 응답자 간의 중계역할. 즉, 통신을 대리 수행하는 서버를 proxy server라고 함
    • Proxy server의 위치에 따라 forward proxy, reverse proxy로 구분

    forward Proxy

    Reverse Proxy

    nginx

    • 기본 구성 값으로 “웹 서버”를 실행함. 동일 계열 점유율이 높음
    • 추가 구성으로 “Reverse Proxy”구현이 가능
    • kubenetes의 ingress controller로 “nginx ingress controller” 선택 가능
    • API 트래픽 처리를 고급 HTTP 처리 기능으로 사용 가능한 “API Gateway” 구성이 가능
    • MSA 트래픽 처리를 위한 MicroGateway로 사용 가능
    • 설정은 (linux기준) /etc/nginx 하위에 nginx.conf 변경을 통해 구성

    nginx Reverse Proxy

    • 클라이언트 요청이 80 포트로 들어오면 준비해둔 애플리케이션 서버의 주소로 각 서버로 트래픽을 분배
    • 기본 분배 방식(LoadBalancing)은 round-robin 방식으로 처리.
    • 요청이 적은 서버로 분배하는 least_conn 방식
    • IP당 서버를 분배하는 ip_hash 등 여러가지 부하 분산 알고리즘을 사용할 수 있음

    HAproxy

    • 하드웨어 기반의 L4/L7 스위치를 대체하기 위한 오픈 소스 소프트웨어 솔루션.
    • TCP 및 HTTP 기반 애플리케이션을 위한 고가용성, load-balancing 및 프록시 기능을 제공하는 매우 빠르고 안정적인 무료 Reverse Proxy다.
    • 주요 기능.
      1) SSL 지원
      2) Load Balancing
      3) Active health check
      4) KeepAlived (proxy 이중화)

    HAproxy, L4

    • OSI 7 계층 중 layer 4 IP를 이용한 트래픽 전달이 특징.
    • Haproxy L4 구성 시, IP와 Port를 기반으로 사용자 요청 트래픽을 전달하도록 구성
    • 요청에 대한 처리는 웹서버로 구성된 web1~3에 round-robin방식으로 부하 분산 됨

    HAproxy, L7

    • OSI 7 계층 중 Layer 은 HTTP 기반의 URI를 이용한 트래픽 전달이 특징.
    • 동일한 도메인의 하위에 존재하는 여러 웹 애플리케이션 서버를 사용할 수 있음.
    • example.com/item or example.com/basket 으로 연결
    • 사용자의 요청과 설정에 따른 부하 분산
  • NVIDIA GPU로 Docker 컨테이너 실행하기

    NVIDIA GPU로 Docker 컨테이너 실행하기

    NVIDIA GPU로 Docker 컨테이너 실행하기

    먼저 docker를 설치 한다. 블로그에 도커 설치 관련 블로그가 있다. 참고하면 된다. 도커가 설치가 되면. nvidia-gpu를 사용하기 위해서 nvidia 드라이버를 서버에 설치 해야 한다.

    nvidia 드라이버 설치 방법

    ## NVIDIA 드라이버의 최신 버전을 얻기 위해 NVIDIA PPA를 추가.
    sudo add-apt-repository ppa:graphics-drivers/ppa
    sudo apt-get update
    
    ## 설치 가능한 최신 드라이버를 확인하고 설치.
    ubuntu-drivers devices
    ## 특정 버전 설치.
    sudo apt-get install nvidia-driver-XXX
    ## 드라이버 설치가 완료되면, 시스템을 재부팅하여 드라이버를 활성화.
    sudo reboot
    ## 재부팅 후, 드라이버가 제대로 설치되었는지 확인하려면 다음 명령어.
    nvidia-smi

    버전 선택 시 참고

    서버에 nvidia-smi가 잘 떴다면,

    이제, docker-container에서 GPU를 사용할 수 있도록 nvidia-docker2를 설치해야 한다.

    ## GPG키와 저장소 추가.
    
    distribution=$(. /etc/os-release;echo $ID$VERSION_ID) \
       && curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add - \
       && curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
    ## nvidia-docker 설치.
    $ sudo apt-get update
    $ sudo apt-get install -y nvidia-docker2
    ## 컨테이너 생성 후 확인해보기.
    docker run --rm --gpus all ubuntu:18.04 nvidia-smi
  • Docker 명령어 자동완성 설정하기

    Docker 명령어 자동완성 설정하기

    Docker 명령어 자동완성 설정하기

    zsh plugin 설정

    vi ~/.zshrc
    
    ---
    plugins = ( docker docker-compose )
    ---
    # 편집완료 후 적용.
    zsh
  • Docker 자동 설치를 위한 Shell Script 사용법

    Docker 자동 설치를 위한 Shell Script 사용법

    docker에서 제공하는 shellscript로 docker engine 설치

    # docker 에서 제공하는 shell script를 이용한 자동 설치.
    
    curl -fsSL https://get.docker.com -o get-docker.sh
    # shell script 내용 확인 후 변경 가능.
    sudo vi get-docker.sh
    # 실행 권한 부여
    chmod +x get-docker.sh
    # 설치.
    sudo sh get-docker.sh

    만약 Docker가 설치가 안된다면..

    Base.repo를 바꿔보자

    [base]
    name=CentOS-$releasever - Base
    baseurl=http://vault.centos.org/7.9.2009/os/$basearch/
    gpgcheck=1
    gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
    [updates]
    name=CentOS-$releasever - Updates
    baseurl=http://vault.centos.org/7.9.2009/updates/$basearch/
    gpgcheck=1
    gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
    [extras]
    name=CentOS-$releasever - Extras
    baseurl=http://vault.centos.org/7.9.2009/extras/$basearch/
    gpgcheck=1
    gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
    [centosplus]
    name=CentOS-$releasever - Plus
    baseurl=http://vault.centos.org/7.9.2009/centosplus/$basearch/
    gpgcheck=1
    enabled=0
    gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
    [contrib]
    name=CentOS-$releasever - Contrib
    baseurl=http://vault.centos.org/7.9.2009/contrib/$basearch/
    gpgcheck=1
    enabled=0
    gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
  • 컨테이너와 VM 가상화 이해하기

    컨테이너와 VM 가상화 이해하기

    가상화(virtualization)

    – 일반적으로 서버 스토리지, 네트워크, 애플리케이션 등을 가상화 하여 하드웨어 리소스를 효율적으로 사용하는데 그 목적이 있고, 이를 통해 기업은 효율적인 자원 활용, 자동화된 IT 관리, 빠른 재해 복구 등의 장점을 갖을 수 있음.

    – 물리적 하드웨어 유지 관리 대신 소프트웨어적으로 추상화된 가상화를 통해 제한된 부분을 쉽게 관리하고 유지할 수 있음.

    – 하이퍼바이저 기반의 가상머신(VM, Virtual Machine)

    컨테이너 가상화 vs VM 가상화

    – 두가지 가상화 모두 실행하고자 하는 애플리케이션 프로세스 및 종속 요소와 소스 등을 패키지, 즉 이미지화 하여 HostOS와 격리된 환경을 제공.

    – 다만, VM 가상화는 실제 호스트 운영체제와 같이 별도의 GuestOS를 두고 원하는 애플리케이션을 설치하는 **하드웨어 수준의 가상화 구현.**

    – 컨테이너 가상화는 VM 가상화에 비해 경량이면서 호스트 운영체제의 커널을 공유하는 운영체제(OS)수준의 가상화 구현.

    – 따라서, 컨테이너 가상화는 원하는 애플리케이션 환경을 빠르게 번들링하여 패키지함.

    애플리케이션 배포 방식 비교

    컨테이너화 기술

    – 리눅스 컨테이너 기술은 LXC(Linux Container)를 이용한 시스템 컨테이너화로 시작
    – OS 수준의 가상화 도구.
    – cgroup, namespace 등의 커널 기술을 공유하여 컨테이너에 제공

    – 이후 애플리케이션 컨테이너 기반의 Docker 출시가 되었고, 초기 Docker 버전은 LXC를 활용해 컨테이너를 생성.

    – 지속된 컨테이너 엔진의 발전으로 Docker는 containerd, runC 를 이용하는 방식으로 변경.
    – 커널 기술의 공유를 통해 컨테이너 생성을 지원하는 runC
    – 생성된 컨테이너의 라이프사이클 관리를 지원하는 containerd
    – 사용자 환경에서의 명령을 전달하는 dockerd

    Dockerd 기능

  • Docker와 컨테이너의 중요성: 빠르고 경량화된 배포

    Docker와 컨테이너의 중요성: 빠르고 경량화된 배포

    컨테이너 기술

    • 컨테이너는 애플리케이션을 언제든 실행 가능하도록 필요한 모든 요소를(소스 코드, 구성 요소, 종속성 등) 하나의 런타임 환경으로 패키징한 논리적 공간.
    • 이러한 패키징 기술을 Docker에서는 Dockerfile build를 통해 구현

    애플리케이션과 종목 항목을 하나로 묶어, 실행하게 해주는 운영 시스템을 가상화한 경량의 격리된 프로세스라고 볼 수 있음

    • mircoVM 이라고도 함.
    • 운영체제 수준의 가상화 제공.
    • 독립성을 갖기 때문에 다른 컨테이너에 영향을 주는 않는 statless 환경 제공.(VM과 같음)

    컨테이너 기술이란

    • 이 기술은 개인 데스크탑 뿐 아니라 기업 내의 온프레미스 서버에서 AWS와 같은 퍼블릭 클라우드까지 언제 어디서든 빠르고 효율적으로 배포 가능. 확장성 또한 가지고 있음.
    • 이를 통해 서버구성, OS 설치, 네트워크, 개발 도구 구성 등의 반복적이고 불편한 작업에 시간을 낭비하지 않고 개발자는 애플리케이션 개발 그 자체에 집중할 수 있음.

    컨테이너의 특징

    • 컨테이너는 우리가 개발한 최소한의 image를 통해 실행되므로 경량.
      – 컨테이너 이미지 생성의 Best pratice 중 하나는 이미지 경량화 다.
    • 일반 서버 환경에서의 애플리케이션 실행과 달리 언제든 프로세스 수준의 속도로 빠르게 실행(run) 할 수 있고, 한번에 여러 개의 컨테이너를 동시에 실행 가능.
      – Docker에서는 Docker compose 기술을 통해 구현.
    • 개인 환경이던 클라우드 환경이던 어떤 OS, 어떤 환경에서도 동작 가능한 이식성을 보유하고 있음.
    • 컨테이너 자체 애플리케이션 환경에 대한 관리만 요구되므로, 지속적 서버관리 비용을 절감 할 수 있음.
    • 개발팀과 운영팀의 업무 분리로 각자의 업무와 세븐화된 관리에 집중할 수 있음. 즉, 컨테이너는 DevOps workflow 구성에 최적. ===> CI/CD 업무

    컨테이너는 어떤 타입으로 생성

    • 컨테이너 패키징 메커니즘 시스템 / 애플리케이션 / 라우터 컨테이너
    • 시스템(or OS) 컨테이너
      – 호스트 OS 위에 Ubuntu와 같은 배포판 리눅스 image를 통해 배포되는 컨테이너.
    • 또다른 VM의 형태이고, 내부에 다양한 애플리케이션 및 라이브러리 도구를 설치, 실행 가능.
    • 대표적으로 LXC, LXD, OpenVZ, Linux VServer, BSD jails 등이 있음.
    • 애플리케이션 컨테이너(Docker의 주역할.)
      – 단일 애플리케이션 실행을 위해 해당 서비스를 패키징하고 실행하도록 설계된 컨테이너.
    • 3-tier 애플리케이션과 같은 경우 각 tier (frontend-backend-DB)를 개별 컨테이너로 실행하여 연결.
    • 대표적으로 Docker container runtime, Rocket 등이 있음

    Docker는 무엇

    • 여러 계층의 Application을 container로 분리, 연결하여 실행하는 **MSA(MicroService Architecture) 프로젝트에 유용함
    • Application의 Infra(runtime)는 Image를 통해 제공하고 Public or Private 하게 공유 가능
    • Github와 유사한 방식(open share)으로 Docker hub에서 제공 함.
    • 이렇게 제공된 image를 기반으로 Application 서비스를 제공, 이를 통해 컨테이너화(containerization) 할 수 있음

  • Docker로 CentOS7 환경 구축하기

    Docker로 CentOS7 환경 구축하기

    Docker 셋팅

    Docker Desktop 설치

    Docker centOS7 image 다운

    • docker hub 에서 다운로드 받으면 됨

    해당 이미지를 이용해서 docker container 제작해 centOS7 환경 구축

    docker run --privileged -it -d --name centos_test --hostname centos_test centos:7.9.2009 /usr/sbin/init

    -ddetached mode 흔히 말하는 백그라운드 모드-p호스트와 컨테이너의 포트를 연결 (포워딩)-v호스트와 컨테이너의 디렉토리를 연결 (마운트)-e컨테이너 내에서 사용할 환경변수 설정–name컨테이너 이름 설정–rm프로세스 종료시 컨테이너 자동 제거-it터미널 입력을 위한 옵션–link컨테이너 연결 [컨테이너명:별칭]

    docker 실행

    docker exec -it centos_test /bin/bash

    yum 안될 때

    yum command를 찾지 못할 때..

    yum update

    net-tools, vim, wget 설치

    yum install net-tools vim wget

    npm, nodejs 설치되지만, 버전이 맞지 않아 pm2를 설치 오류가 생김

    해결법

    nvm(node Version Manager)를 설치

    먼저 wget을 설치해주어야 함

    yum install wget
    
    ---
    # nvm 다운로드 및 설치.
    wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.2/install.sh | bash
    # 설치가 완료되면 .bashrc 파일에 아래 설정이 추가 되어짐.
    # .bashrc export NVM_DIR="$HOME/.nvm"
    [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm 
    [ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion" 
    # This loads nvm bash_completion
    # nvm 설정 적용.
    source ~/.bashrc
    # nvm 설치 버전 확인.
    nvm --version
    
    ---
    
    nvm use systemnode -v
    npm uninstall -g a_module

    기본 사용법

    nvm list 
    #or 
    nvm ls
    • 특정 버전 사용
    nvm use <version> 
    # ex) nvm use 16.17.0
    • 버전 추가 및 삭제
    # 버전 추가 
    nvm install <version> 
    # ex) nvm install 16.17.0 
    # 16.x.x 의 마지막 버전 추가 
    nvm install <major version> 
    # ex) nvm install 16 
    # 버전 삭제 
    nvm uninstall <version> 
    # ex) nvm uninstall 16.17.0
    • 기본 버전 설정
    nvm alias default <version> 
    # ex) nvm alias default 16.17.0

    node.js 설치

    nvm 저장소에 지원하는 node 버전을 확인해 봄

    # 지원하는 node 버전 확인. 
    nvm ls-remote
    
    # LTS 버전으로 설치.
    nvm install --lts
    
    # 정상적으로 설치 되어졌는지 확인.
    node -v 
    npm -v

    pm2 설치

    npm install pm2 -g
    • -g : global 설치

    AWS EC2 서버 접속

    해당 container에 키파일 저장
    키파일이 있는 폴더에 디렉토리를 변경해준다

    pm2-logrotate 설치

    pm2 install pm2-logrotate

  • Firewalld 방화벽 설정 가이드

    Firewalld 방화벽 설정 가이드

    📌 Firewalld 상태 확인 및 관리

    sudo systemctl status firewalld
    • active (running)이면 동작 중
    • inactive (dead)이면 정지 상태

    📌 Firewalld 시작 및 종료

    sudo systemctl start firewalld   # 방화벽 시작
    sudo systemctl stop firewalld    # 방화벽 정지
    sudo systemctl restart firewalld # 방화벽 재시작
    sudo systemctl enable firewalld  # 부팅 시 자동 시작 설정
    sudo systemctl disable firewalld # 부팅 시 자동 시작 해제

    📌 방화벽 규칙 설정 및 관리

    sudo firewall-cmd --list-all
    • 현재 활성화된 방화벽 영역(zone)과 적용된 규칙을 확인할 수 있음.

    📌 방화벽 영역(Zone) 확인

    sudo firewall-cmd --get-active-zones

    📌 방화벽 영역(Zone) 디폴트 존 변경

    # 디폴트 존 변경.
    sudo firewall-cmd --set-default-zone=block
    
    # 특정 인터페이스 block 존에 바인딩.
    sudo firewall-cmd --zone=block --change-interface="인터페이스이름"
    
    # 변경 사항 영구 적용.
    sudo firewall-cmd --runtime-to-permanent

    📌 특정 포트 허용

    sudo firewall-cmd --zone=public --add-port=8080/tcp --permanent
    • — zone=public: public 영역에 적용
    • — add-port=8080/tcp: 8080 포트의 TCP 트래픽 허용
    • — permanent: 영구 적용 (재부팅해도 유지됨)

    📌 즉시 적용하려면 방화벽 다시 로드

    sudo firewall-cmd --reload

    📌 특정 서비스 허용

    Firewalld는 서비스 단위로 접근을 제어할 수 있음. 예를 들어, SSH(22번 포트)를 허용하려면:

    sudo firewall-cmd --zone=public --add-service=ssh --permanent
    sudo firewall-cmd --reload

    서비스 목록 확인

    sudo firewall-cmd --get-services

    포트 차단

    sudo firewall-cmd --zone=public --remove-port=8080/tcp --permanent
    sudo firewall-cmd --reload

    서비스 차단

    sudo firewall-cmd --zone=public --remove-service=http --permanent
    sudo firewall-cmd --reload

    ➡️ Example

    Block 존 ➡️ ipv4로 내가 열고 싶은 IP/32, Port, TCP 열려면..

    sudo firewall-cmd --zone=block --add-rich-rule='rule family="ipv4" source address="IP/32" port port="port번호" protocol="tcp" accept' --permanent
  • Ubuntu 22.04에서 수동 IP 설정하기

    Ubuntu 22.04에서 수동 IP 설정하기

    📌 NetworkManager에서 고정 IP 설정

    nmcli device show <인터페이스 이름>

    📌 NetworkManager를 사용하여 수동 IP 설정

    sudo nmcli connection modify <Wired connection 1> ipv4.method manual ipv4.addresses <사용할 IP/mask> ipv4.gateway <게이트웨이 IP> ipv4.dns <DNS IP> autoconnect yes

    📌 변경사항 적용

    sudo nmcli connection down enp5s0 && sudo nmcli connection up enp5s0
    sudo systemctl restart NetworkManager

    ✅ 확인 사항

    ☁️ IP 설정 확인

    ip a show <네트워크 인터페이스 이름>

    ☁️ 라우팅 정보 확인

    ip route

    ☁️ DNS 확인

    nmcli device show enp5s0 | grep DNS

    ☁️ 인터넷 연결 테스트

    curl https://google.com
    ping -c 4 google.com
    ping -c 4 8.8.8.8