Nginx Proxy Manager : docker-compose.yaml

Nginx Proxy Manager가 무엇인지는 링크를 참조.

docker-compose.yaml

version: '3'
services:
  app:
    image: 'jc21/nginx-proxy-manager:latest'
    ports:
      - '80:80'                  # 일반 http 용 port
      - '81:81'                  # 관리 페이지 용 port
      - '443:443'                # https 서비스 용 port
    environment:
      DB_MYSQL_HOST: "db" 
      DB_MYSQL_PORT: 3306
      DB_MYSQL_USER: "npm" 
      DB_MYSQL_PASSWORD: "npm" 
      DB_MYSQL_NAME: "npm" 
    volumes:
      - ./data:/data
      - ./letsencrypt:/etc/letsencrypt
  db:
    image: 'jc21/mariadb-aria:latest'
    environment:
      MYSQL_ROOT_PASSWORD: 'npm'
      MYSQL_DATABASE: 'npm'
      MYSQL_USER: 'npm'
      MYSQL_PASSWORD: 'npm'
    volumes:
      - ./data/mysql:/var/lib/mysql
#      - ./etc/my.cnf.d:/etc/my.cnf.d       mariadb(mysql을 사용할 때도 동일) 설정을 변경하고자 할 때 생성하고 설정 파일을 넣는다.

디렉토리 생성

docker-compose.yaml 파일이 존재하는 디렉토리에 아래와 같이 세 개의 디렉토리를 생성한다.


mkdir ./data
mkdir ./letsencrypt
mkdir -p ./data/mysql
mkdir -p ./etc/my.cnf.d

HAproxy 를 이용한 로드밸런싱 고가용성 구성

개요

HAProxy는 여러 서버에 대해 요청을 확산시키는 TCP 및 HTTP 기반 애플리케이션들을 위해 고가용성 로드밸런서와 리버스 프록시를 제공하는 자유-오픈 소스 소프트웨어이다. C 프로그래밍 언어로 개발되어 있으며 빠르고 효율적인 것으로 유명하다.
공식 사이트 참조

설정에 따라 Server #A와 #B로 번갈아가며 연결해준다.

haproxy를 통해 부하를 분산하는 등의 용도로 서비스 효율을 높일 수 있다.

설치

여기에서 다운 받아도 되며, yum epel-release에 포함되어 있으므로 epel-release 리포지터리 추가 후 yum 이나 dnf 명령 등을 통해 설치할 수 있다.

sudo dnf install -y haproxy
마지막 메타자료 만료확인 7:58:42 이전인: 2022년 07월 28일 (목) 오전 12시 23분 23 초.
종속성이 해결되었습니다.
================================================================================
 꾸러미          구조           버전                    레포지터리         크기
================================================================================
설치 중:
 haproxy         x86_64         1.8.27-4.el8            appstream         1.4 M

연결 요약
================================================================================
설치  1 꾸러미

총계 내려받기 크기: 1.4 M
설치된 크기 : 4.2 M
...중략...
설치되었습니다:
  haproxy-1.8.27-4.el8.x86_64                                                                                                                   
완료되었습니다!

서비스가 구동 될 모든 서버에 설치해준다.
자동으로 서비스가 구동될 수있도록 서비스를 등록 해준다.

sudo systemctl enable haproxy.service
 또는
sudo service haproxy start

설정

기본적으로 /etc/haproxy/haproxy.cfg 가 존재한다.

global
    log         127.0.0.1 local2
    chroot      /var/lib/haproxy
    pidfile     /var/run/haproxy.pid
    maxconn     4000
    user        haproxy
    group       haproxy
    daemon

    # turn on stats unix socket
    stats socket /var/lib/haproxy/stats

#---------------------------------------------------------------------
# common defaults that all the 'listen' and 'backend' sections will
# use if not designated in their block
#---------------------------------------------------------------------
defaults
    mode                    http
    log                     global
    option                  httplog
    option                  dontlognull
    option http-server-close
    option forwardfor       except 127.0.0.0/8
    option                  redispatch
    retries                 3
    timeout http-request    10s
    timeout queue           1m
    timeout connect         10s
    timeout client          1m
    timeout server          1m
    timeout http-keep-alive 10s
    timeout check           10s
    maxconn                 3000

#---------------------------------------------------------------------
# status web 설정
# haproxy 서비스 상태, 백엔드 서비스의 상태 등을 웹을 통해 확인할 수 있다.
# 필수는 아니다.
#---------------------------------------------------------------------
listen hastats
    mode http
    bind *:8088
    stats enable
    stats show-legends
    stats uri /hastat
# 서버 주소가 192.168.0.1이라면  http://192.168.0.1/hastat으로 접속한다.
    stats auth admin:admin
#  hastats 웹에 접속 시 인증으로 제한하려면 계정과 패스워드를 지정한다.

#---------------------------------------------------------------------
# 프론트 엔드 설정
# 프론트 엔드에서 설정한 포트로 연결이 들어올 경우 백엔드로 보낸다
#---------------------------------------------------------------------
# 외부에서 haproxy를 통해 연결을 시도할 때 사용하는 포트
frontend  kubeproxy
    bind *:16443
    default_backend kubeproxy
    mode tcp

#---------------------------------------------------------------------
# 백엔드 설정
# 프론트엔드에서  defaultbackend 타겟으로 설정 된 백엔드 정보
#---------------------------------------------------------------------
backend kubeproxy
    balance     roundrobin
# Balance Option
# Roundrobin : 순차적으로 분배
# static-rr : 서버에 부여된 가중치에 따라서 분배
# leastconn : 접속수가 가장 적은 서버로 분배
# source : 운영중인 서버의 가중치를 나눠서 접속자 IP 해싱(hashing)해서 분배
# uri : 접속하는 URI를 해싱해서 운영중인 서버의 가중치를 나눠서 분배 (URI의 길이 또는 depth로 해싱)
# url_param : HTTP GET 요청에 대해서 특정 패턴이 있는지 여부 확인 후 조건에 맞는 서버로 분배 (조건 없는 경우 round_robin으로 처리)
# hdr : HTTP 헤더에서 hdr(<name>)으로 지정된 조건이 있는 경우에 대해서만 분배 (조건없는 경우 round robin 으로 처리)
# rdp-cookie : TCP 요청에 대한 RDP 쿠키에 따른 분배
    mode tcp
    option tcp-check
    option tcplog
# 외부에서 16443 포트로 연결을 시도하면 아래의 서버에 순차적으로 연결해준다.
    server  storage01 192.168.0.1:6443 check
    server  storage02 192.168.0.2:6443 check
    server  storage03 192.168.0.3:6443 check

frontend web-console
        bind *:18080
        default_backend web-console
        mode tcp
backend web-console
        balance roundrobin
        mode    tcp
        option  tcp-check
        option  tcplog
        server  storage01       192.168.1.1:8080       check
        server  storage02       192.168.1.2:8080       check
        server  storage03       192.168.1.3:8080       check

백엔드로 동작할 모든 서버에 동일한 설정 파일을 넣어준다.

확인

haproxy 웹 서비스를 통해 정보 확인이 가능한다.

백엔드 서비스에 문제가있다면 붉은색으로 표시된다.

Kubernetes #2-2. 사전작업 – docker 설정 (offline, 폐쇄망)

[Kubernetes #1. 사전작업 (offline, 폐쇄망)]
[Kubernetes #2-2. 사전작업 – 컨테이너 런타임 (offline, 폐쇄망)]
[Kubernetes #2-2. 사전작업 – docker 설정 (offline, 폐쇄망)]
[Kubernetes #3. Kubernetes 바이너리 설치 (offline, 폐쇄망)]
[Kubernetes #4. Kubernetes 클러스터 구축 – image pull (offline, 폐쇄망)]
[Kubernetes #4-2. Kubernetes 클러스터 구축 – 단일 마스터노드 생성 (offline, 폐쇄망)]
[Kubernetes #4-3. Kubernetes 클러스터 구축 – worker node join (offline, 폐쇄망)]

망분리 환경에서 proxy등을 통한 외부 연결이 가능하거나, 망 내부적으로 proxy를 통해 통신하는 경우 proxy 설정이 필요하다.
linux OS 레벨에서는 .bash_profile 등에 proxy 변수를 등록하는 것으로 처리가 가능하지만 docker 런타임은 별도로 proxy 정보를 정의해 줘야 한다

이 포스트의 작업은 쿠버네티스 클러스터에 포함하는 모든 노드에서 수행해야 한다.

     

Docker Proxy 설정

서비스 설정 (docker login 등의 작업 에 사용된다.)

[haedong@haedong:~:]$ sudo /lib/systemd/system/docker.service
전략...
# [service] 섹션에 아래 추가
Environment="HTTP_PROXY=http://120.121.122.123:8080" 
Environment="HTTPS_PROXY=https://120.121.122.123:8080" 
Environment="NO_PROXY=.haedong.net,localhost,127.0.0.1/8,192.168.0.0/16,.local" 
[haedong@haedong:~:]$ sudo systemctl daemon-reload
[haedong@haedong:~:]$ sudo systemctl restart docker.service

컨테이너 설행 시 변수로 전달

[haedong@haedong:~]$ docker run \
-e http_proxy=http://120.121.122.123:8080 \
-e https_proxy https://120.121.122.123:8080 \
-e no_proxy .haedong.net,localhost,127.0.0.1/8,192.168.0.0/16,.local \
CONTAINER_NAME

이미지 빌드 시 포함

ENV PATH /home/haedong/bin:$PATH
ENV LD_LIBRARY_PATH /lib:/lib64:$LD_LIBRARY_PATH
...중략...
# 아래 내용 추가
ENV http_proxy http://120.121.122.123:8080
ENV https_proxy https://120.121.122.123:8080
ENV no_proxy .haedong.net,localhost,127.0.0.1/8,192.168.0.0/16,.local

     

Docker root directory 변경

pull 한 image나 컨테이너 임시 데이터 등이 저장되는 디렉토리이다. 기본 값은 /var/lib/docker 인데, /var directory가 포함된 파티션의 크기가 작거나 하는 경우 disk full 로 인해 문제를 야기할 수 있다.

현재 docker root 확인

docker info | grep "Docker Root Dir" 

 Docker Root Dir: /var/lib/docker

#docker volume inspect my-vol

준비

docker root dirctory로 사용할 디스크를 확정하고 파티션 생성, 마운트 등의 작업을 마친다.
sudo systemctl stop docker.service 명령으로 서비스를 중지하고(시간이 걸릴 수 있다. 프로세스가 완전히 사라졌는지 확인하도록 하자) 이전의 docker 파일들을 대상 디렉토리로 복사한다.

mkdir /data
cp -rp /var/lib/docker /data

     

서비스 수정

sudo vi /usr/lib/systemd/system/docker.service
# Service 섹션에 ExecStart= 로 시작하는 줄을 수정한다.
# ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --data-root=/data
sudo systemctl daemon-reload
sudo systemctl restart docker.service

     

cgroup driver 변경

현재 상태 확인

sudo docker info | grep cgroup
 Cgroup Driver: cgroupfs

서비스 수정

sudo vi /etc/systemd/system/docker.service

# ExecStart 로 시작하는 줄에  --exec-opt native.cgroupdriver=systemd 추가
# ExecStart=/usr/bin/dockerd -g /home/data/ -H fd:// --containerd=/run/containerd/containerd.sock
ExecStart=/usr/bin/dockerd -g /home/data/ -H fd:// --containerd=/run/containerd/containerd.sock --exec-opt native.cgroupdriver=systemd
sudo systemctl daemon-reload
sudo systemctl restart docker.service