복잡한 쿠버네티스 애플리케이션을 쉽게 설치, 업그레이드, 관리할 수 있도록 도와주며, 쿠버네티스 환경에서의 소프트웨어 배포를 간소화할 수 있게 도와줌
Helm 사용 이유
복잡한 쿠버네티스 애플리케이션 관리 단순화 - 쿠버네티스 다양한 리소스(Pod, Service, Deployment 등)를 개별적으로 관리하는 것은 매우 복잡 → Helm을 통해 리소스들을 차트(Chart)라는 하나의 패키지로 묶어 관리함으로써 배포 및 관리를 단순화 - 수많은 컴포넌트로 구성된 마이크로서비스 아키텍처의 애플리케이션을 관리할 때 Helm이 매우 효율적
일관된 배포 및 재사용성 확보 - Helm 차트는 재사용이 가능하므로 동일한 애플리케이션을 여러 환경(개발, 스테이징, 프로덕션)에 일관되게 배포 가능 - Helm 저장소(Repository)를 통해 다른 사람들과 차트를 공유 → 애플리케이션 배포를 표준화하고 생산성 증가
간편한 애플리케이션 업데이트 및 롤백 - Helm은 애플리케이션의 버전 관리를 지원하므로 업데이트 및 롤백을 쉽게 수행 가능 - 애플리케이션 배포 과정에서 발생할 수 있는 오류를 최소화하고 안정성을 높일 수 있음
설정 관리의 효율성 향상 - Helm은 values.yaml 파일을 통해 애플리케이션의 설정을 분리하여 관리할 수 있도록 지원 - 환경별로 다른 설정을 적용해야 하는 경우에도 유연하게 대처 가능
자동화된 배포 파이프라인 구축 용이 - Helm은 CI/CD(Continuous Integration/Continuous Delivery) 파이프라인과 통합하여 자동화된 애플리케이션 배포를 구축하는 데 유용 - 애플리케이션 배포 과정을 자동화하고 배포 빈도를 높일 수 있음
Helm 3가지 주요 개념
1. Chart
helm의 리소스 패키지로 k8s cluster에서 애플리케이션을 기동하기 위해 필요한 모든 리소스가 포함
Chart 구성 요소 1. Chart.yaml : 차트의 이름, 버전 등 기본적인 메타 정보를 정의 2. templates : kubernets에 배포될 리소스들의 manifest 탬플릿들을 포함 → 오브젝트들의 yaml 파일 포함 디렉토리 3. charts : dependency가 있는 chart 파일들의 저장 디렉토리 4. values.yaml : 템플릿에 사용될 변수(value) 값들을 정의
Kong API Gateway는 대규모 분산 시스템에서 API 관리와 보안을 제공하는 오픈 소스 솔루션 → Kong gateway는 OSS gateway로 가장 많이 사용되고 있는 솔루션
Kong API Gateway는 플러그인을 통해 고성능과 확장성이 뛰어나며, 클라우드 네이티브 및 플랫폼에 구애받지 않고 확장 가능
프록시(Proxy), 라우팅(Routing), 로드 밸린싱(Load Balancing), 인증(Auth) 등을 위한 기능을 제공
Kong API Gateway는 마이크로서비스(Microservice) 또는 기존 API 트래픽을 쉽게 오케스트레이션(Orchestration)하기 위한 중앙 레이저 역할을 함
Kong API Gateway 공식 Kubernetes Ingress Controller에 의해 Kubernetes에서 기본적으로 실행 가능Kong API Gateway는 대규모 분산 시스템에서 API 관리와 보안을 제공하는 오픈 소스 솔루션 → Kong gateway는 OSS gateway로 가장 많이 사용되고 있는 솔루션
Kong API Gateway는 플러그인을 통해 고성능과 확장성이 뛰어나며, 클라우드 네이티브 및 플랫폼에 구애받지 않고 확장 가능
프록시(Proxy), 라우팅(Routing), 로드 밸린싱(Load Balancing), 인증(Auth) 등을 위한 기능을 제공
Kong API Gateway는 마이크로서비스(Microservice) 또는 기존 API 트래픽을 쉽게 오케스트레이션(Orchestration)하기 위한 중앙 레이저 역할을 함
Kong API Gateway 공식 Kubernetes Ingress Controller에 의해 Kubernetes에서 기본적으로 실행 가능
다양한 plugin을 제공하고 있고, plugin을 개발할 수 있는 여러 언어(python, go, javascript)의 PDK(plugin development kit)가 있어 원하는 plugin을 개발하여 적용 가능
Admin API를 통해 Service, Route, Plugin을 설정할 수 있는데, Konga를 이용하면 UI를 통해 쉽게 설정 가능
Kong API Gateway는 새로운 서비스를 구축하면서, 클라이언트를 기존 업스트림 서비스로 라우팅하는 추상화 계층으로 활용하여 접근 방식을 단순화
대상 서비스가 어디에 있든 각 요청 및 응답에 대해 공통 정책을 적용해 클라이언트에 영향을 미치지 않도록 할 수 있음
2. Kong API Gateway 특징
고급 라우팅, 로드 밸런싱, 상태 확인 등을 관리 API 또는 선언적 구성을 통해 설정
JWT, 기본 인증, ACL 등과 같은 방법을 사용하여 API에 대한 인증 및 권한 부여
L4 또는 L7 트래픽에 대한 프록시, SSL/TLS 종료 및 연결 지원
트래픽 제어, Request/Response 변환, 로깅, 모니터링을 시행하고 플러그인 개발자 허브를 포함하는 플러그인 제공
데이터베이스가 없는 선언적 방식 배포 및 하이브리드 배포(제어 플레인/데이터 플레인 분리)와 같은 정교한 배포 모델 제공
Kubernetes 제공을 위한 기본 Kong Ingress Controller 지원
벤더 종속이 없음
3. Kong API Gateway 구성 요소
API 클라이언트에서 Gateway로 요청 흐름은 Gateway 구성을 기반으로 Proxy에 의해 수정 및 관리되며, Upstream 서비스로 전달
Kong API Gateway 구성 요소 특징
특징
상세 내용
Admin API
• 서비스, 경로, 플러그인 및 소비자의 관리 및 구성을 위한 RESTful 인터페이스를 제공 • Kong Gateway에 대해 수행할 수 있는 모든 작업은 Kong Admin API를 사용하여 자동화
Manager
• Kong Gateway용 그래픽 사용자 인터페이스(GUI) 제공 • 내부에서 Kong Admin API를 사용하여 Kong Gateway를 관리하고 제어
Dev Portal
• API 문서를 생성하고, 사용자 정의 페이지를 만들고, API 버전을 관리하고, 개발자 액세스를 보호하는 데 사용
Vitals
• Kong Gateway 노드의 상태 및 성능에 대한 유용한 메트릭 및 프록시된 API 사용에 대한 메트릭을 제공 • 시각적으로 모니터링하고 실시간으로 이상 징후를 정확히 찾아낼 수 있음 • 시각적 API 분석을 사용하여 API 및 게이트웨이가 어떻게 수행되고 있는지 정확히 확인하고 주요 통계에 액세스
Gateway Plugin
• 사용 사례를 충족하는 턴키 기능을 통해 Kong Gateway 플러그인에 최대한의 제어를 보장하고 불필요한 오버 헤드를 최소화 • Kong Manager 또는 Admin API를 통해 Kong Gateway 플러그인을 활성화하여 인증, 속도 제한 및 변환과 같은 기능을 활성화
4. Kong API Gateway 기능 소개 → 서비스 라우팅 적용
Service 및 Route 기능을 사용하면 Kong API Gateway를 사용하여 클라이언트에 서비스를 노출
Service 및 Route를 구성한 후 Kong API Gateway를 통해 요청을 시작
Service를 통해 백엔드 API로 라우팅 되는 요청 및 응답 흐름을 구현
4.1. Service 기능 소개
API에 대한 액세스를 구성할 때 먼저 Service를 지정
Kong API Gateway에서 Service는 외부 업스트림 API 또는 마이크로 서비스를 나타내는 Entity로 사용
Service의 주요 속성으로 Service가 요청을 수신하는 URL를 적용
단일 문자열을 사용하거나 해당 프로토콜, 호스트, 포트 및 경로를 개별적으로 지정
4.2. Route 기능 소개
Service에 대한 요청을 시작하기 전에 Route를 추가해야함
Route는 요청이 Kong API Gateway에 도달한 후 Service로 전송되는 방법(및 여부)을 결정
단일 Service에는 여러 경로가 있을 수 있음
5. DB-less 설정 소개
Kong Gateway는 데이터베이스 없이 Entity용 인메모리(In-Memory) 스토리지만 사용하여 실행할 수 있으며, 이것을 DB-less 모드라고 함
Kong Gateway DB-less를 실행할 때 Entity 구성은 선언적 구성을 사용
사용 사례에 대한 전체 설정이 메모리에서의 처리가 알맞는 경우, 데이터베이스 설치 및 관리가 불필요하여 종속성을 감소시킴
Entity에 대한 구성은 Git 저장소를 통해 관리되는 단일 정보 소스에 보관할 수 있기 때문에 CI/CD 시나리오의 자동화에 적합함
Pacemaker와 Corosync을 사용하여 HA (고가용성) 클러스터를 구성하는 것은 복잡함
Pacemaker를 사용하여 VIP(가상 IP)와 노드 간 HA 클러스터를 설정
[목차]
Pacemaker 설치 서버
Pacemaker와 Corosync 설치
Coresync 설정
Pacemaker 클러스터 구성 → pcs를 사용하여 클러스터를 설정
클러스터 기본 설정 > STONITH(Fencing) 설정
클러스터 기본 설정 > VIP 리소스 생성
1. Pacemaker 설치 서버
호스트 이름
서버 IP
운영체제
네트워크
VIP
192.168.100.10
server1
192.168.100.4
Ubuntu 22.04.4 LTS
bond0
server2
192.168.100.5
Ubuntu 22.04.4 LTS
bond0
server3
192.168.100.6
Ubuntu 22.04.4 LTS
bond0
2. Pacemaker와 Corosync 설치
모든 서버에서 다음 명령어를 실행하여 Pacemaker와 Corosync를 설치
## apt 업데이트 및 pacemaker, corosync 패키지 설치
$ sudo apt update
$ sudo apt install -y pacemaker corosync pcs
## pacemaker 버전 확인
$ pacemakerd --version
Pacemaker 2.1.2
Written by Andrew Beekhof
## corosync 버전 확인
$ corosync -v
Corosync Cluster Engine, version '3.1.6'
Copyright (c) 2006-2021 Red Hat, Inc.
Built-in features: dbus monitoring watchdog augeas systemd xmlconf vqsim nozzle snmp pie relro bindnow
Available crypto models: nss openssl
Available compression models: zlib lz4 lz4hc lzo2 lzma bzip2 zstd
3. Coresync 설정
3.1. authkey 파일 생성 및 권한 변경 → Corosync가 클러스터 노드 간의 통신을 인증하는 데 사용
### authkey 생성
$ sudo corosync-keygen
Corosync Cluster Engine Authentication key generator.
Gathering 2048 bits for key from /dev/urandom.
Writing corosync key to /etc/corosync/authkey.
### 파일 권한 변경
$ sudo chown root:root /etc/corosync/authkey
$ sudo chmod 400 /etc/corosync/authkey
### authkey 파일 권한 변경 확인
$ ls -l /etc/corosync/authkey
-r-------- 1 root root 256 Oct 29 11:21 /etc/corosync/authkey
3.2. 인증키 복사 → 클러스터의 모든 노드에 authkey 파일을 복사 (생성 서버는 192.168.100.4, 복사 서버는 192.168.100.5, 192.168.100.6)
### 192.168.100.4 > 192.168.100.5으로 authkey 파일 복사
$ scp /etc/corosync/authkey root@192.168.100.5:/etc/corosync/authkey
### 192.168.100.4 > 192.168.100.6으로 authkey 파일 복사
$ scp /etc/corosync/authkey root@192.168.100.6:/etc/corosync/authkey
3.3. Corosync 설정 config 파일 수정 → Corosync의 설정 config 파일을 수정하여 클러스터 노드를 정의 (3개 Node에서 동시 실행)
$ sudo crm status
Cluster Summary:
* Stack: corosync
* Current DC: 192.168.100.4 (version 2.1.2-ada5c3b36e2) - partition with quorum
* Last updated: Fri Aug 15 13:19:02 2025
* Last change: Thu Aug 14 15:01:54 2025 by root via cibadmin on 192.168.100.4
* 3 nodes configured
* 1 resource instance configured
Node List:
* Online: [ 192.168.100.4 192.168.100.5 192.168.100.6 ]
Full List of Resources:
* vip (ocf:heartbeat:IPaddr2): Stopped (disabled)
4. Pacemaker 클러스터 구성 → pcs를 사용하여 클러스터를 설정 (3개 Node에서 동시 실행)
$ sudo pcs cluster setup pcs_cluster 192.168.100.4 192.168.100.5 192.168.100.6 --force
### 실행 결과 ###
No addresses specified for host '192.168.100.4', using '192.168.100.4'
No addresses specified for host '192.168.100.5', using '192.168.100.5'
No addresses specified for host '192.168.100.6', using '192.168.100.6'
Warning: 192.168.100.4: The host seems to be in a cluster already as the following service is found to be running: 'corosync'. If the host is not part of a cluster, stop the service and retry
Warning: 192.168.100.4: The host seems to be in a cluster already as cluster configuration files have been found on the host. If the host is not part of a cluster, run 'pcs cluster destroy' on host '192.168.100.4' to remove those configuration files
Warning: 192.168.100.6: The host seems to be in a cluster already as the following service is found to be running: 'corosync'. If the host is not part of a cluster, stop the service and retry
Warning: 192.168.100.6: The host seems to be in a cluster already as cluster configuration files have been found on the host. If the host is not part of a cluster, run 'pcs cluster destroy' on host '192.168.100.6' to remove those configuration files
Warning: 192.168.100.5: The host seems to be in a cluster already as the following service is found to be running: 'corosync'. If the host is not part of a cluster, stop the service and retry
Warning: 192.168.100.5: The host seems to be in a cluster already as cluster configuration files have been found on the host. If the host is not part of a cluster, run 'pcs cluster destroy' on host '192.168.100.5' to remove those configuration files
Destroying cluster on hosts: '192.168.100.4', '192.168.100.5', '192.168.100.6'...
192.168.100.6: Successfully destroyed cluster
192.168.100.5: Successfully destroyed cluster
192.168.100.4: Successfully destroyed cluster
Requesting remove 'pcsd settings' from '192.168.100.4', '192.168.100.5', '192.168.100.6'
192.168.100.6: successful removal of the file 'pcsd settings'
192.168.100.4: successful removal of the file 'pcsd settings'
192.168.100.5: successful removal of the file 'pcsd settings'
Sending 'corosync authkey', 'pacemaker authkey' to '192.168.100.4', '192.168.100.5', '192.168.100.6'
192.168.100.6: successful distribution of the file 'corosync authkey'
192.168.100.6: successful distribution of the file 'pacemaker authkey'
192.168.100.4: successful distribution of the file 'corosync authkey'
192.168.100.4: successful distribution of the file 'pacemaker authkey'
192.168.100.5: successful distribution of the file 'corosync authkey'
192.168.100.5: successful distribution of the file 'pacemaker authkey'
Sending 'corosync.conf' to '192.168.100.4', '192.168.100.5', '192.168.100.6'
192.168.100.6: successful distribution of the file 'corosync.conf'
192.168.100.4: successful distribution of the file 'corosync.conf'
192.168.100.5: successful distribution of the file 'corosync.conf'
Cluster has been successfully set up.
$ pcs status
Cluster name: pcs_cluster
Cluster Summary:
* Stack: corosync
* Current DC: 192.168.100.5 (version 2.1.2-ada5c3b36e2) - partition with quorum
* Last updated: Fri Aug 15 13:29:57 2025
* Last change: Thu Aug 14 15:01:54 2025 by root via cibadmin on 192.168.100.4
* 3 nodes configured
* 1 resource instance configured
Node List:
* Online: [ 192.168.100.4 192.168.100.5 192.168.100.6 ]
Full List of Resources:
* No resources
Daemon Status:
corosync: active/disabled
pacemaker: active/disabled
pcsd: active/enabled
5. 클러스터 기본 설정 > STONITH(Fencing) 설정
5.1. STONITH(Fencing) 비활성화 (추천 방법은 아님)
### Fencing 비활성화 > Pacemaker의 Node가 이슈가 있을 때 완전 배제를 위해 Fencing 설정 필요, 우선 Fencing 비활성화
$ sudo pcs property set stonith-enabled=false
### Fencing 활성화 > Fencing 방법도 학습 필요
### sudo pcs property set stonith-enabled=true
Twitch로 스트리밍 중이며 Windows를 사용하는 경우, TwitchTest를 사용하여 품질 점수가 가장 높은 서버를 검색
향상된 방송(Enhanced Broadcasting) 기능을 비활성화하거나 TwitchTest 결과에서 확인된 대역폭보다 낮은 최대 스트리밍 대역폭을 설정하여 테스트 진행 가능
2. 비디오 비트레이트(Video Bitrate) 낮추기
Settings > Output으로 이동하여 비디오 비트레이트(Video Bitrate)를 낮추기
비트레이트(Bitrate)는 안정적인 업로드 속도(upload speed)와 스트리밍 서비스의 비트레이트 제한(bitrate limitations)에 따라 달라짐
총 업로드 속도(total upload speed)의 75%로 설정하는 것이 좋은 시작점(starting point)
3. 다른 서비스로 스트리밍(stream)하기
Settings > stream으로 이동하여 다른 서비스로 스트리밍(stream) 변경
예시) Twitch로 스트리밍 중이라면 YouTube로 스트리밍하여 연결 상태를 테스트
참고 : 특정 서비스의 연결 문제는 해결되지 않지만, 서비스 관련 문제인지 확인하는 데 도움됨
4. 네트워크 최적화 및 TCP 페이싱 활성화
Settings > Advanced → Network로 이동하여 '네트워크 최적화 활성화(Enable network optimizations)'와 'TCP 페이싱 활성화(Enable TCP pacing)'를 선택
일부 사용자는 '네트워크 최적화 활성화(Enable network optimizations)'와 'TCP 페이싱 활성화(Enable TCP pacing)' 설정으로 프레임 드롭(dropped frames)이나 연결 끊김 문제(disconnection issues)가 개선되었다고 보고
문제 해결을 위한 로그(log)에 추가 세부 정보(further details)가 기록 ※ 참고: 해당 Settings은 Windows에서만 사용 가능
5. “Bind to IP”가 기본값으로 설정되어 있는지 확인 필요
Settings > Advanced → Network 로 이동하여 Bind to IP가 기본값으로 설정되어 있는지 확인
6. IP 패밀리를 IPv4 전용으로 설정
Settings > Advanced → Network로 이동하여 IP Family를 IPv4 전용으로 설정 필요 ※ 참고: 연결 문제가 해결되지 않으면, 기본 설정인 IPv4 및 IPv6을 유지하는 것이 좋음
7. 동적 비트레이트 조정 활성화
Settings > Advanced → Network로 이동하여 ‘Dynamically change bitrate to manage congestion(혼잡 관리 위해 비트레이트 동적 변경)’ 항목을 선택
연결 상태가 불안정할 때 프레임 드롭(dropped frames) 대신 비트레이트(bitrates)를 낮춰 전송
※ 참고
프레임 드롭(dropped frames)의 근본 원인을 해결하지 않으며, 연결 문제를 해결할 수 없는 경우에만 사용
비트레이트(bitrates) 감소는 영상 품질 저하를 동반
OBS Studio 외부의 소프트웨어
원인
해결책
보안 소프트웨어 간섭 보안 소프트웨어(방화벽/바이러스 백신)가 OBS Studio와 스트리밍 서버 간의 연결을 방해 가능
보안 소프트웨어를 일시적으로 비활성화하여 원인이 되는지 확인 필요 문제가 해결되면 OBS Studio에 대한 예외를 추가하고 보안 소프트웨어를 다시 활성화
VPN 소프트웨어 간섭 VPN 소프트웨어로 인해 스트리밍 서버와의 연결이 불안정
VPN을 비활성화하여 네트워크 불안정성의 원인인지 확인 필요
Bundled(번들) 네트워크 소프트웨어 - 일부 네트워크 소프트웨어는 OBS Studio의 우선순위를 낮춰 필요한 비트레이트를 유지하지 못하게 할 수 있음 - 네트워크 연결을 최적화(optimize)하거나 조정(tweak)한다고 표방하는 모든 소프트웨어를 반드시 확인 필요
1. Lenovo Vantage → Lenovo Vantage 소프트웨어 내에서 네트워크 부스트 옵션을 비활성화 2. Killer NIC → Killer NIC 소프트웨어 제품군을 제거한 후 설치 프로그램을 다시 실행하고, 하드웨어 드라이버만 설치하도록 선택 3. 기타 소프트웨어 → 소프트웨어를 완전히 제거하거나 비활성화한 후 연결 상태를 다시 테스트
구형 네트워크 드라이버 구형 네트워크 드라이버는 연결 상태가 나빠질 수 있음
컴퓨터 또는 메인보드 제조업체 웹사이트에서 최신 드라이버를 다운로드하여 설치하십시오.
Potential Hardware Issues (잠재적인 하드웨어 문제)
원인
해결책
WiFi를 통한 스트리밍 스트리밍에 WiFi가 불안정
스트리밍 시에는 유선 연결을 사용하는 것이 좋음
모뎀/라우터 연결 문제 모뎀/라우터에 일반적인 연결 문제가 있있을 수 있음
잠재적인 연결 문제를 해결하려면 모뎀과 라우터를 모두 재시작
하드웨어 결함 연결 경로 상의 하드웨어에 결함이 있을 수 있음 모뎀, 라우터, 네트워크 케이블, 네트워크 카드 또는 스위치나 익스텐더와 같은 기타 네트워크 장치가 포함
하드웨어에 문제가 없는지 확인하려면 각 하드웨어를 하나씩 교체 필요
※ 참고 하드웨어에 결함이 있는지 확실하지 않은 경우, 직접 장비를 교체하기 전에 반드시 인터넷 서비스 제공업체(ISP)에 문의 필요
인터넷 서비스 제공업체에 문의 필요
가이드의 문제 해결 단계를 모두 수행했음에도 연결 문제가 지속된다면, ISP(인터넷 서비스 제공업체)에 문의 필요
OBS Studio는 사용자의 네트워크에 의존하며, 네트워크의 상당 부분은 사용자의 직접적인 통제 범위를 벗어남
ISP는 종종 자체적으로 변경 사항을 적용하거나, 연결 경로에 예상치 못한 혼잡(congestion)이 발생할수 있음
OBS Studio의 인기 플러그인 대부분은 설치 프로그램이 함께 제공 → 일반적으로 플러그인은 아래에 나열된 위치에 설치
플러그인을 수동으로 설치해야 하는 경우, 관련 파일은 다음 폴더 중 하나에 위치해야 할 가능성이 높음
플러그인 설명서를 확인
운영체제
경로 및 설명
Windows (all users)
C:\Program Files\obs-studio\obs-plugins\64bit or C:\ProgramData\obs-studio\plugins
※ 참고 - ProgramData 폴더에 설치된 플러그인은 특정 디렉터리 구조를 요구 - 플러그인 이름으로 명명된 폴더에는 bin 폴더와 data 폴더가 포함 필요 - bin 폴더 내에는 플러그인은 .dll 파일을 포함하는 64bit 폴더가 필요 - data 폴더 내에는 로케일(locale)은 .ini 파일을 포함하는 locale 폴더가 필요 - 수동 설치 시 권장되는 위치
Windows (legacy 32-bit plugins; OBS Studio 27.2.4 and prior only)
C:\Program Files\obs-studio\obs-plugins\32bit
macOS
~/Library/Application Support/obs-studio/plugins
※ 참고 - 이 폴더 안에는 각 플러그인마다 .plugin으로 끝나는 별도의 번들이 있어야 함 - 파인더(finder)에서 이들을 보면 하얀색 플라스틱 장난감 블록처럼 보임
Linux
~/.config/obs-studio/plugins
Linux (Flatpak)
Install plugins using Flatpak
OBS Studio를 사용자 지정 위치에 설치하거나 휴대용 모드를 사용하는 경우, 설치 프로그램의 대상 폴더를 사용자 지정 위치의 data/plugins 폴더로 변경 필요
사용자 지정 플러그인 디렉터리를 사용하려면 환경 변수 OBS_PLUGINS_PATH 및 OBS_PLUGINS_DATA_PATH를 원하는 디렉터리로 설정 필요