doc

Blackeichi·2023년 7월 14일
0

RabbitMQ 포트정보

4369 - epmd, RabbitMQ 노드 및 CLI 도구에서 사용
5672, 5671 - AMQP 0-9-1과 1.0 클라이언트가 사용하는 포트(TLS 적용에 따라 포트 변경
25672 - 노드 및 CLI도구 통신에 사용되며 동적 범위에서 할당(기본적으로 단일 포트로 제한되며 AMPQ포트 + 20000으로 기본 할당)
35672~35682 - 노드와의 통신을 위해 CLI 도구에서 사용되는 포트
61613, 61614 : TLS가 있거나 없는 STOMP 클라이언트 (STOMP 플러그인이 활성화 된 경우에만 해당)
1883, 8883 : (MQTT 플러그인이 사용 가능한 경우 TLS가없는 MQTT 클라이언트
15674 : STOMP-over-WebSockets 클라이언트 (웹 STOMP 플러그인이 사용 가능한 경우에만)
15675 : WebTockets-over-WebSockets 클라이언트 (Web MQTT 플러그인이 사용 가능한 경우에만)


depends_op:
	postgres-db:
    	condition: service_healthy

condition: 종속성이 충족된 것으로 간주되는 조건
service_started: is an equivalent of the short syntax described above
service_healthy: 종속 서비스를 시작하기 전에 종속성이 "정상"(상태 점검으로 표시됨)으로 예상됨을 지정합니다
service_completed_successfully: 종속 서비스를 시작하기 전에 종속성이 성공적으로 완료될 것으로 예상됨을 지정합니다.


가용성이란 서버와 네트워크, 프로그램 등의 정보 시스템이 정상적으로 사용 가능한 정도를 말한다.

쿠버네티스(Kubernetes)에서 멀티 노드(multi-node)를 사용하는 이유는 여러 가지가 있습니다. 주요 이유는 다음과 같습니다:

확장성: 멀티 노드 환경은 애플리케이션 및 서비스를 수평으로 확장할 수 있는 기능을 제공합니다. 단일 노드 환경에서는 하드웨어의 한계로 인해 애플리케이션의 성능과 처리량을 제한할 수 있지만, 멀티 노드 환경에서는 더 많은 노드를 추가함으로써 애플리케이션의 부하를 분산시킬 수 있습니다.

고가용성: 멀티 노드 환경은 고가용성을 제공할 수 있습니다. 단일 노드 환경에서는 노드의 장애 또는 유지 보수로 인해 애플리케이션의 가용성이 저하될 수 있지만, 멀티 노드 환경에서는 여러 노드가 동작하므로 하나의 노드가 장애가 발생하더라도 다른 노드가 작업을 처리할 수 있습니다.

분산 컴퓨팅: 멀티 노드 환경은 분산 컴퓨팅을 지원합니다. 여러 노드가 클러스터로 구성되어 작업을 분산 처리할 수 있으며, 병렬 처리를 통해 애플리케이션의 성능을 향상시킬 수 있습니다.

리소스 분할: 멀티 노드 환경에서는 리소스를 노드 간에 분할하여 사용할 수 있습니다. 이는 각 노드가 독립적으로 작업을 수행하고, 리소스를 효율적으로 활용할 수 있음을 의미합니다.

로드 밸런싱: 멀티 노드 환경에서는 로드 밸런싱 기능을 통해 애플리케이션의 부하를 균등하게 분산시킬 수 있습니다. 이는 트래픽이 많은 경우에도 애플리케이션의 성능과 응답 시간을 향상시킬 수 있습니다.

이러한 이유로 쿠버네티스에서 멀티 노드 환경을 채택하여 확장성, 고가용성, 분산 컴퓨팅 등 다양한 이점을 얻을 수 있습니다.


쿠버네티스를 온프레미스 환경에서 구동하기 위해 다음 단계를 따를 수 있습니다:

하드웨어 및 네트워크 구성: 쿠버네티스 클러스터를 구성하기 위해 필요한 서버(노드)를 준비하고, 각 노드 간의 네트워크 연결을 설정해야 합니다. 노드는 적어도 하나의 마스터 노드와 워커 노드로 구성되어야 하며, 각 노드는 적절한 CPU, 메모리, 디스크 등의 리소스를 가지고 있어야 합니다.

운영 체제 설치: 각 노드에 운영 체제를 설치해야 합니다. 쿠버네티스는 다양한 운영 체제에서 실행될 수 있지만, 주로 Linux 기반의 배포판인 Ubuntu, CentOS, Red Hat 등이 많이 사용됩니다.

도커(Docker) 설치: 쿠버네티스는 컨테이너 기반의 가상화 기술인 도커를 기반으로 동작합니다. 각 노드에 도커를 설치해야 합니다. 도커 설치 방법은 도커 공식 문서를 참조하면 도움이 됩니다.

쿠버네티스 설치: 온프레미스 환경에서 쿠버네티스를 설치하기 위해서는 쿠버네티스 배포 도구를 사용할 수 있습니다. 대표적인 배포 도구로는 kubeadm, kops, kubespray 등이 있습니다. 선택한 배포 도구의 문서를 따라 설치 및 설정을 진행하면 됩니다.

네트워크 설정: 쿠버네티스 클러스터의 노드 간 통신을 위해 네트워크 설정이 필요합니다. 각 노드의 IP 주소와 포트를 적절히 설정하고, 필요에 따라 네트워크 플러그인을 설치하여 컨테이너 간 통신을 관리할 수 있습니다. 대표적인 네트워크 플러그인으로는 Calico, Flannel, Weave 등이 있습니다.

클러스터 초기화: 마스터 노드에서 클러스터 초기화를 수행해야 합니다. 이 단계에서는 쿠버네티스 마스터 컴포넌트들이 설치되고, 클러스터 설정 파일이 생성됩니다. 초기화된 클러스터에 워커 노드를 추가할 수 있습니다.

애플리케이션 배포: 클러스터가 구성되면 쿠버네티스를 통해 애플리케이션을 배포할 수 있습니다. Pod, Deployment, Service 등의 쿠버네티스 리소스를 사용하여 애플리케이션을 정의하고, 쿠버네티스가 애플리케이션의 관리와 실행을 담당하도록 설정할 수 있습니다.

이러한 단계를 따르면 온프레미스 환경에서 쿠버네티스 클러스터를 구성하고 실행할 수 있습니다. 다만, 클러스터의 규모와 환경에 따라 추가적인 구성 및 설정이 필요할 수 있으므로, 관련 문서 및 가이드를 참고하는 것이 좋습니다.


Minikube는 로컬 개발 및 테스트를 위한 경량화된 쿠버네티스 클러스터입니다. 실제 서비스에서 Minikube를 사용하는 것은 권장되지 않습니다. 이는 Minikube가 단일 노드로 구성되어 있어 확장성이 제한되며, 고가용성 및 실제 프로덕션 환경에서 필요한 기능들을 제공하지 않기 때문입니다.

Minikube는 개발 환경에서 동작하는 가상화된 쿠버네티스 클러스터로 사용됩니다. 이를 사용하여 로컬에서 애플리케이션을 테스트하고 디버깅하며, 개발 프로세스를 단순화할 수 있습니다. Minikube는 로컬 머신에서 가상화 기술을 사용하여 쿠버네티스 클러스터를 실행하므로, 실제 서비스 환경과는 차이가 있습니다.

실제 서비스를 위한 쿠버네티스 클러스터는 보다 복잡하고 안정적인 구성을 요구합니다. 이를 위해 여러 노드로 구성된 멀티 노드 클러스터를 사용하고, 고가용성을 위해 마스터 노드의 복제본을 유지하는 등의 조치가 필요합니다. 또한, 네트워크, 보안, 로깅, 모니터링 등의 고급 기능을 제공하는 플러그인이나 추가 도구가 필요할 수 있습니다.

따라서, 실제 서비스를 위해 쿠버네티스를 구성할 때는 Minikube 대신 클라우드 기반의 쿠버네티스 서비스(예: Amazon EKS, Google Kubernetes Engine, Microsoft Azure Kubernetes Service 등)나 온프레미스 환경에서 쿠버네티스 클러스터를 구축하는 것이 적합합니다. 이러한 환경은 고급 기능과 확장성을 제공하며, 실제 서비스 운영에 필요한 요구 사항을 충족시킬 수 있습니다.


쿠버네티스를 클라우드 플랫폼 없이(온프레미스 환경에서) 구현하는 경우에는 몇 가지 단점이 있을 수 있습니다:

자원 및 확장성: 클라우드 플랫폼을 사용하지 않으면 클러스터의 자원 제한과 확장성이 제한될 수 있습니다. 클라우드 플랫폼은 필요에 따라 가상 머신, 스토리지, 네트워크 등의 리소스를 쉽게 확장하고 관리할 수 있는 기능을 제공합니다. 반면, 온프레미스 환경에서는 하드웨어 구매와 설치, 관리, 유지보수 등이 필요하므로 자원의 한계와 확장성에 제약이 생길 수 있습니다.

네트워크 구성: 클라우드 플랫폼은 네트워크 인프라를 자동으로 관리하고, 로드 밸런싱, 서비스 디스커버리, 네트워크 정책 등의 기능을 제공합니다. 온프레미스 환경에서는 네트워크 구성 및 관리를 별도로 처리해야 하며, 복잡성이 증가할 수 있습니다.


네트워크 구성 측면에서 클라우드 플랫폼과 온프레미스 환경의 차이를 좀 더 자세히 설명해드리겠습니다.

클라우드 플랫폼에서는 네트워크 인프라를 제공하는 업체가 가상 네트워크, 로드 밸런싱, 서비스 디스커버리 등의 기능을 자동으로 처리합니다. 일반적으로 클라우드 플랫폼은 가상 사설망(VPC)을 제공하여 가상 네트워크 환경을 구축할 수 있게 합니다. 가상 사설망을 사용하면 서로 다른 가상 머신 또는 컨테이너 그룹 간에 통신할 수 있으며, 인터넷과의 연결도 가능합니다.

또한, 로드 밸런싱 기능을 사용하면 애플리케이션 트래픽을 여러 대의 서버로 분산시킬 수 있습니다. 이는 애플리케이션의 가용성과 확장성을 향상시키고, 트래픽 부하를 분산하여 서비스의 성능을 개선하는 데 도움이 됩니다.

서비스 디스커버리는 쿠버네티스 클러스터 내에서 애플리케이션 간의 통신을 관리하는 기능입니다. 클라우드 플랫폼은 보통 DNS(Domain Name System) 기반의 서비스 디스커버리 기능을 제공하여, 애플리케이션에 동적으로 할당된 IP 주소나 호스트 이름을 사용하여 서비스를 찾고 통신할 수 있도록 합니다.

온프레미스 환경에서는 이러한 네트워크 기능을 수동으로 구성해야 합니다. 가상 사설망 구성, 로드 밸런싱, 서비스 디스커버리 등은 관리자가 네트워크 인프라를 직접 설정하고 구축해야 합니다. 이는 네트워크 구성의 복잡성을 증가시킬 수 있으며, 추가적인 시간과 노력을 필요로 합니다.

온프레미스 환경에서는 가상 사설망을 위해 VLAN(Virtual Local Area Network)이나 VPN(Virtual Private Network)을 구성하고, 로드 밸런싱을 위해 로드 밸런서를 따로 구매하고 설정해야 할 수도 있습니다. 또한, 서비스 디스커버리를 위해서는 별도의 DNS 서버를 설정하고 관리해야 합니다.

따라서, 클라우드 플랫폼을 사용하면 네트워크 인프라 구성과 관리에 대한 부담이 상대적으로 적으며, 클라우드 제공 업체가 제공하는 기능을 활용할 수 있습니다. 반면, 온프레미스 환경에서는 네트워크 구성을 직접 처리해야 하므로 추가 작업과 복잡성이 발생할 수 있습니다.

보안 및 안정성: 클라우드 플랫폼은 보안 그룹, 가상 사설망(VPC), IAM(Identity and Access Management) 등의 보안 기능을 제공하여 애플리케이션과 데이터를 보호합니다. 온프레미스 환경에서는 보안을 위한 추가 작업이 필요하며, 보안 강화 및 안정성 유지에 더 많은 노력과 자원을 투자해야 할 수 있습니다.

관리 및 운영 부담: 클라우드 플랫폼을 사용하면 쿠버네티스 클러스터의 관리와 운영을 클라우드 제공 업체에게 위임할 수 있습니다. 클라우드 업체는 쿠버네티스의 업그레이드, 패치, 백업 등을 자동으로 처리합니다. 온프레미스 환경에서는 이러한 작업을 직접 수행해야 하므로 관리 및 운영 부담이 크게 증가할 수 있습니다.

비용: 클라우드 플랫폼은 사용한 리소스에 대해서만 비용을 지불하면 되기 때문에 초기 투자 비용이 적습니다. 반면, 온프레미스 환경에서는 하드웨어 구매, 전기비, 냉각 비용 등 추가적인 비용이 발생할 수 있습니다.

이러한 단점들을 고려할 때, 클라우드 플랫폼을 사용하는 것이 많은 경우에는 더 효율적이고 편리한 선택일 수 있습니다. 그러나 특정한 요구 사항이나 제약 조건이 있는 경우에는 온프레미스 환경에서 쿠버네티스를 구현할 수도 있습니다.


Docker 컨테이너에서 트래픽 처리 속도가 느린 경우 몇 가지 해결 방법이 있습니다. 다음은 몇 가지 주요한 접근 방법입니다:

자원 할당 조정: 컨테이너가 할당받은 자원(예: CPU, 메모리)이 부족한 경우, 컨테이너의 자원 할당량을 조정하여 성능을 향상시킬 수 있습니다. Docker의 리소스 관리 기능인 cgroups를 사용하여 CPU 및 메모리 제한을 조정할 수 있습니다. 컨테이너에 충분한 자원을 할당하여 트래픽 처리에 필요한 성능을 확보할 수 있습니다.

컨테이너 스케일링: 단일 컨테이너로 처리할 수 없는 대량의 트래픽이 발생하는 경우, 컨테이너를 여러 개 실행하고 트래픽을 분산하여 처리하는 방식으로 스케일링을 수행할 수 있습니다. 이를 위해 Docker Compose 또는 Kubernetes와 같은 오케스트레이션 도구를 사용하여 여러 컨테이너 인스턴스를 생성하고 로드 밸런서를 통해 트래픽을 분산시킬 수 있습니다.

성능 최적화: 컨테이너 내부의 애플리케이션 코드, 네트워크 설정, 데이터베이스 쿼리 등을 최적화하여 성능을 향상시킬 수 있습니다. 애플리케이션의 병목 현상을 찾고 최적화할 수 있는 도구를 사용하여 성능 테스트와 프로파일링을 수행할 수 있습니다.

호스트 시스템 리소스 관리: 호스트 시스템에서 Docker를 실행하는 머신의 자원(예: CPU, 메모리, 디스크)이 충분한지 확인해야 합니다. 호스트 시스템에서 다른 프로세스나 서비스가 많은 자원을 소비하는지 확인하고 필요에 따라 리소스를 조정하여 Docker 컨테이너에 충분한 자원을 확보할 수 있습니다.

네트워크 설정: 트래픽 처리에 문제가 있는 경우, 네트워크 설정을 확인해야 합니다. 네트워크 대역폭, 네트워크 인터페이스, 포트 포워딩 등의 설정을 확인하고 필요한 경우 최적화를 수행해야 합니다.

컨테이너 이미지 최적화: 컨테이너 이미지의 크기와 구성은 컨테이너 시작 시간과 성능에 영향을 줄 수 있습니다. 가능한한 작고 경량화된 이미지를 사용하고, 필요한 패키지만 포함하도록 이미지를 최적화하는 것이 좋습니다.


Docker Compose를 사용하여 컨테이너 스케일링을 수행하려면 docker-compose.yml 파일을 수정해야 합니다. 다음은 Docker Compose를 활용한 컨테이너 스케일링의 기본적인 단계입니다:

docker-compose.yml 파일 열기: Docker Compose 프로젝트의 구성 파일인 docker-compose.yml을 편집기로 엽니다.

서비스 정의 수정: 스케일링을 적용할 서비스 정의를 찾습니다. 해당 서비스의 scale 속성을 사용하여 컨테이너 인스턴스의 수를 지정할 수 있습니다. 예를 들어, web 서비스를 두 개의 인스턴스로 확장하려면 다음과 같이 설정합니다:

yaml
Copy code
services:
web:
image: your-image
ports:
- "8080:80"
scale: 2
컨테이너 스케일링 실행: 터미널 또는 명령 프롬프트에서 docker-compose up -d 명령을 실행하여 스케일링을 적용합니다. 이 명령은 docker-compose.yml 파일의 변경 내용을 기반으로 컨테이너를 생성하고 실행합니다.

스케일링 확인: docker-compose ps 명령을 사용하여 실행 중인 컨테이너 인스턴스의 수를 확인할 수 있습니다. 예를 들어, web 서비스의 인스턴스 수를 확인하려면 다음 명령을 실행합니다:

bash
Copy code
docker-compose ps
결과에서 web 서비스의 인스턴스 수를 확인할 수 있습니다.

이와 같이 Docker Compose를 사용하여 컨테이너 스케일링을 수행할 수 있습니다. 컨테이너 인스턴스 수를 늘리면 해당 서비스의 작업량을 처리하기 위해 추가 컨테이너가 실행됩니다. 로드 밸런싱을 적용하고 트래픽을 분산시키는 것은 도커 스웜이나 쿠버네티스와 같은 컨테이너 오케스트레이션 플랫폼을 사용하여 수행할 수 있습니다.
Docker Compose로 컨테이너 스케일링을 한 후, 도커 스웜을 사용하여 로드 밸런싱을 수행하려면 다음의 단계를 따를 수 있습니다:

Docker Compose 파일 작성: 먼저, Docker Compose 파일(docker-compose.yml)에 로드 밸런서를 위한 서비스 정의를 추가해야 합니다. 이 서비스는 로드 밸런서로 작동하는 프록시 서비스로, 모든 백엔드 서비스로의 요청을 분산시킵니다. 예를 들어, Nginx를 사용하는 경우, 다음과 같이 정의할 수 있습니다:
yaml
Copy code
version: '3.9'

services:
proxy:
image: nginx
ports:
- "80:80"

# 로드 밸런서 설정 등 추가 구성

Docker Compose 실행: Docker Compose를 사용하여 스케일링하고자 하는 백엔드 서비스와 로드 밸런서 서비스를 함께 실행합니다. 다음 명령을 실행하여 컨테이너를 배포합니다:
bash
Copy code
docker-compose up -d


Docker Swarm은 일반적으로 여러 개의 노드로 구성된 클러스터에서 작동하는 컨테이너 오케스트레이션 도구입니다. 여러 노드를 가진 클러스터에서 Docker Swarm을 사용하면 컨테이너들의 로드밸런싱을 구현할 수 있습니다.

그러나 단일 노드에서 Docker Swarm을 실행하는 경우, 로드밸런싱은 물리적인 여러 노드가 없기 때문에 그 의미가 제한적입니다. 단일 노드에서 실행 중인 여러 개의 컨테이너 사이에서 로드밸런싱을 수행할 필요는 없기 때문입니다.

단일 노드에서 컨테이너들 간의 로드밸런싱이 필요한 경우, 일반적으로 로드밸런싱을 위한 다른 도구나 기술을 사용하는 것이 좋습니다. 예를 들어, Nginx, HAProxy 등의 리버스 프록시 서버를 사용하여 단일 노드 내에서 컨테이너들에게 트래픽을 분산시킬 수 있습니다.

Docker Swarm은 여러 노드로 구성된 클러스터에서 컨테이너들의 로드밸런싱을 제공하는 데 가장 효과적입니다. 여러 개의 노드를 구성할 수 없는 경우, 단일 노드에서 로드밸런싱이 필요한 경우에는 Swarm보다 다른 도구를 고려하는 것이 적합합니다.


CPU 할당량 조정: 컨테이너에 더 많은 CPU 자원을 할당하여 처리 능력을 향상시킬 수 있습니다. 이를 위해 docker run 명령어에서 --cpu-shares 또는 --cpus 옵션을 사용하여 CPU 할당량을 조정할 수 있습니다. 높은 트래픽을 처리해야하는 경우 CPU를 더 많이 할당하는 것이 도움이 될 수 있습니다.

메모리 조정: 컨테이너에 할당된 메모리가 부족한 경우, 메모리를 늘려줌으로써 성능을 향상시킬 수 있습니다. docker run 명령어에서 --memory 또는 --memory-swap 옵션을 사용하여 메모리 제한을 조정할 수 있습니다. 메모리를 충분히 할당해야 컨테이너가 트래픽을 처리하는 데 충분한 용량을 확보할 수 있습니다.

profile
프론트엔드 주니어 개발자 한정우입니다. 😁

0개의 댓글