Private Service 구축 (2)

TAEWOO HA·2023년 7월 23일
0

Docker

목록 보기
5/7

실습 준비

MINIO 로 Storage Service 구축하기
S3 like Service 인 MINIO 구축하기
Private Registry Service 구축하기
NEXUS3 with S3
HABOR Registry

STORAGE SERVER

CEPH Storage Server
Machine 1
디스크가 많은 시스템
Docker 에 Block 장치를 직접 Bypass 하여 사용하도록 할 예정

PRIVATE REGISTRY SERVICE

Nexus3 or Harbor Registry 구축
Machine 2
minio 의 오브젝트 Storage의 활용
대안: NFS 서버를 사용

Minio

MINIO 가상 머신 실행

$env:VAGRANT_EXPERIMENTAL="disks"
vagrant up minio

  • 윈도우 파워쉘 기준
  • sda : 40 GB

  • sdb : 10 MB

  • extra 1 : sdc 25GB

  • extra 2 : sdd 25GB

  • /dev/h => IDE , /dev/s:sata,scsi

  • sda1,2,3 => 파티션

DISK FORMAT

sudo mkfs.xfs /dev/sdc -L DISK1

  • xfs : 오버레이가 가능 , 중첩
  • 레이블 => 디스크1
    sudo mkfs.xfs /dev/sdd -L DISK2

마운트 하기

sudo vim /etc/fstab
LABEL=DISK1 /mnt/disk1 xfs defaults,noatime 0 2
LABEL=DISK2 /mnt/disk2 xfs defaults,noatime 0 2

  • 장치 , 마운트 포인트, 파일 시스템 타입 , 옵션 , 부팅시 처리(체크) , 에러시 패스or정지?

sudo mkdir -p /mnt/disk1 /mnt/disk2
sudo mount -a => sudo mount /mnt/disk1 /mnt/disk2

MOUNT 확인 lsblk

MINIO 실행 : 단독모드

docker run -d --name minio \
-p 9000-9001:9000-9001 \
-v /mnt/disk1:/data1 \
-v /mnt/disk2:/data2 \
-e MINIO_ROOT_USER=admin \
-e MINIO_ROOT_PASSWORD=secret%1 \
minio/minio \
server /data1 /data2 --console-address ":9001"

docker run -d --name minio -p 9000-9001:9000-9001 -v /mnt/disk1:/data1 -v /mnt/disk2:/data2 -e MINIO_ROOT_USER=admin -e MINIO_ROOT_PASSWORD=secret%1 minio/minio server /data1 /data2 --console-address ":9001"

  • server : cli , /data1 /data2 : 참여할 파티션이 있는 디렉토리 지정
  • ACCESS KEY , SECRET KEY

로그 확인

버킷 만들기

MINIO

  • Minimal Object Storage

오픈 소스
GO 언어로 구현
AWS S3 호환

Minio Server : 오브젝트 스토리지 서버
Minio Client : mc CLI, 파일 업로드, 관리 등의 기능 제공
Minio Library : 개발자용 라이브러리, Go, Java, Python 등 SDK 제공

MINIO 동작 방식

FS (File System) 방식
백엔드를 파일 시스템 사용
각기 다른 HW 볼륨에 연결된 경로들을 묶어 사용

ES (Erase Coding)방식
데이터를 EC 코덱이라는 알고리즘으로인코딩
복제 수행, 데이터 손실시 복구하는 기법
RAID의 패리티 디스크 복구 개념

  • DATA => n등분 => 인코딩 => n+k개 => 디코딩 => 원본복구
  • 백업이 목적이 아닌 동작중인 시스템을 복원하기 위함

MINIO 운영 방식

단독 모드(Standalone)
단일 노드 – 단일 디스크 -- FS 모드
주로 개발과 테스트용
하나의 서버에서 하나의 디스크만

EC 모드(Standalone)
단일 노드 – 멀티 디스크
디스크 4개이상 2의 배수로 구성

분산 모드(Distributed)
멀티 노드
디스크를 제공하는 노드가 다수
각 노드는 minio 서비스 수행
이를 통합할 수 있는 로드밸런서를 앞 단에 두어 사용

분산 모드 EC 모드(Distributed)
멀티 노드 – 멀티 디스크
각각의 노드가 EC 모드
노드간 분산 형태는 동일

PRIVATE REGISTRY

NEXUS3 S3기반 구축
Nexus3 의 Blob Store 를 MinIO 를 사용하도록 설정하기

  • Nexus => blob이 나눠져 있고 레포지포리가 나누어져 있음
  • blob은 각각의 레포지토리의 레지스트리 등이 공유할수 있는 영역
  • blob : 보통 같은 서비스끼리 분류함

볼륨 생성 후 실행

docker volume create nexus-data

docker run -d -p 8081:8081 -p 5000-5001:5000 --name nexus \
-e INSTALL4J_ADD_VM_PARAMS="-Xms1024m -Xmx1024m -XX:MaxDirectMemorySize=512m" \
-v nexus-data:/nexus-data sonatype/nexus3

nexus3 Blob store

  • Docker bearer을 + 해줘야함 . 아니면 docker login

Node

  • Node => Nexus => Docker hub
  • storage 네트워크와 통신용 네트워크를 구분 해야함.

  • daemon.json 파일 수정

우분투 이미지 Pull test

  • minio

Harbor 구축

GPG키 준비
sudo gpg --keyserver hkps://keyserver.ubuntu.com --receive-keys 644FF454C0B4115C

CURL을 사용하여 다운로드

curl -LO https://github.com/goharbor/harbor/releases/download/v2.8.2/harbor-online-installer-v2.8.2.tgz

tar xvzf harbor-online-installer-v2.8.2.tgz

CA 인증서 처리

openssl genrsa -out ca.key 4096

  • 공개키 : 다른 사람이 읽는 것

  • 비공개키 : 열람 금지

  • 인증서 : 제 3자가 공증

  • 4kb정도 되는 rsa key를 만든다.

  • 이 키에 대응하는 인증서를 만들어야한다. => self-sign ca 인증서

SELF-SIGN CA 인증서

openssl req -x509 -new -nodes -sha512 -days 3650 \
-subj "/C=KR/O=grepp/OU=docker/CN=192.168.34.105" \
-key ca.key \
-out ca.crt

  • subj : 대상 , key : ca.key , out:

서버 인증 키 생성

openssl genrsa -out habor.local.key 4096

  • 구조적으로 CA인증서와 비슷
  • habor.local은 내가 만든 CA로 서명
    => 서명 요청을 생성해야함

서버 인증서 서명 요청 생성

openssl req -sha512 -new \
-subj "/C=KR/O=grepp/OU=docker/CN=habor.local" \
-key habor.local.key \
-out habor.local.csr

서명 정보 명세

cat > v3.ext <<-EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment,
dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names
[alt_names]
DNS.1=habor.local
DNS.2=habor
DNS.3=192.168.34.105
EOF

자체 서버 서명 수행

openssl x509 -req -sha512 -days 3650 \
-extfile v3.ext \
-CA ca.crt -CAkey ca.key -CAcreateserial \
-in habor.local.csr \
-out habor.local.crt

인증서 /DATA로 옮기기

sudo mkdir -p /data/cert
sudo cp habor.local.key habor.local.crt /data/cert

CRT 를 인증서 체인으로 만들기

openssl x509 -inform PEM -in habor.local.crt -out habor.local.cert

다음 파일들은 NODE 에 복사해야 함

복사할 파일
ca.crt
habor.local.cert
habor.local.key
복사할 위치 (Habor에 접근하는 모든 Docker 노드)
/etc/docker/certs.d/habor.local/

HABOR 노드에도 복사 해둔다.

sudo mkdir -p /etc/docker/certs.d/habor.local/
sudo cp ca.crt /etc/docker/certs.d/habor.local/
sudo cp habor.local.cert /etc/docker/certs.d/habor.local/
sudo cp habor.local.key /etc/docker/certs.d/habor.local/

설정하기 YML 수정

habor.yml.tmpl 을 참고하여 작성
cd habor
cp habor.yml.tmpl habor.yml

hostname: harbor.local

# http related config
http:
  # port for http, default is 80. If https enabled, this port will redirect to https port
  port: 80

# https related config
https:
  # https port for harbor, default is 443
  port: 443
  # The path of cert and key files for nginx
  certificate: /data/cert/habor.local.crt
  private_key: /data/cert/habor.local.key

# # Uncomment following will enable tls communication between all harbor components
# internal_tls:
#   # set enabled to true means internal tls is enabled
#   enabled: true
#   # put your cert and key files on dir
#   dir: /etc/harbor/tls/internal

# Uncomment external_url if you want to enable external proxy
# And when it enabled the hostname will no longer used
# external_url: https://reg.mydomain.com:8433

# The initial password of Harbor admin
# It only works in first time to install harbor
# Remember Change the admin password from UI after launching Harbor.
harbor_admin_password: Harbor12345

# Harbor DB configuration
database:
  # The password for the root user of Harbor DB. Change this before any production use.
  password: root123
  

PREPARE 수행

./prepare (이미지 pull해줌)

HABOR 실행

서비스 확인: 80번 포트 사용 확인

sudo docker compose ps

NEXUS에서 HABOR를 가리키도록 설정

  • NEXUS => create docker(proxy)

0개의 댓글