Ambassador Pod Design Pattern
서비스 간의 연결을 추상화하고 프록시 역할을 수행하는 Kubernetes 디자인 패턴이다. 이 패턴은 앱의 복잡성을 줄이고 네트워크 연결 설정을 유연하게 관리하기 위해 사용된다. 앰배서더(Ambassador) 컨테이너를 애플리케이션 컨테이너와 동일한 Pod 안에 배치한다. 이 앰버서더는 외부 시스템과의 통신을 처리하는 역할을 맡으며, 애플리케이션은 앰배서더를 통해서만 외부와 소통한다. 이는 애플리케이션이 직접 외부 네트워크 세부사항을 알 필요없이, 로컬 주소만 참조하도록 설계한다. 주로 서비스 디스커버리추상화(외부 IP OR DNS 숨김) , 보안통신으로 사용한다.
- 앰배서더 컨테이너
- 프록시 역할을 수행하며, 외부 서비스와의 통신 로직을 처리한다.
- 예: Nginx, Envoy, HAProxy 같은 도구 사용.
- 애플리케이션 컨테이너
- 비즈니스 로직을 담당하며, 로컬에서 앰배서더를 통해 네트워크 요청을 전송한다.
- 외부 서비스의 세부사항을 몰라도 된다.
예제 구성

- Nginx를 Ambassador로 사용.
- 애플리케이션 컨테이너는 외부 API를 직접 호출하지 않고 Nginx를 통해 요청.
- Nginx는 요청을 외부 API로 전달.
- 앱 컨테이너: 간단한 HTTP 클라이언트를 실행하는 Python Flask 애플리케이션.
- 앰배서더 컨테이너: 외부 API와의 통신을 프록시하는 Nginx.
nginx.conf 설정
먼저, nginx.conf 파일을 작성하여 Nginx가 Ambassador 역할을 하도록 설정한다. 이 파일은 외부에서 들어오는 요청을 Flask 애플리케이션 컨테이너로 전달하는 역할을 한다.
events {
worker_connections 1024; # Nginx의 최대 연결 수
}
http {
upstream flaskapp {
server localhost:9000; # Flask 애플리케이션 컨테이너로 요청 전달
}
server {
listen 80; # 외부 요청을 수신할 포트
location / {
proxy_pass http://flaskapp; # Flask 애플리케이션으로 요청 전달
proxy_redirect off; # 리디렉션 방지
}
}
}
ConfigMap 생성
이제 작성한 nginx.conf 파일을 Kubernetes ConfigMap으로 만들어서 Nginx 컨테이너에 전달한다.
kubectl create cm nginx-conf --from-file=nginx.conf
Flask 애플리케이션 및 Nginx 컨테이너 설정
apiVersion: v1
kind: Pod
metadata:
name: flaskapp-pod
labels:
app: flaskapp
spec:
containers:
- image: nginx:1.25.3-alpine # Nginx 이미지
name: proxy-container
volumeMounts:
- name: nginx-proxy-config
mountPath: /etc/nginx # ConfigMap에서 nginx.conf를 읽어올 경로
ports:
- containerPort: 80 # Nginx가 요청을 수신할 포트
- image: dbgurum/py_flask:2.0 # Flask 애플리케이션 이미지
name: flaskapp-container
ports:
- containerPort: 9000 # Flask 애플리케이션이 동작하는 포트
volumes:
- name: nginx-proxy-config
configMap:
name: nginx-conf # ConfigMap으로부터 Nginx 설정 파일을 가져옴
Flask 애플리케이션 Pod 생성
kubectl apply -f flaskapp-pod.yaml
서비스 생성
Kubernetes에서 외부 요청을 처리할 수 있도록 Flask 애플리케이션에 대한 서비스를 생성한다. nodeport를 이용하여 커맨드로 작성해주었다.
kubectl expose po flaskapp-pod --name=flaskapp-svc --type=NodePort --port=80 --target-port=80
curl 테스트
curl http://192.168.56.101:32604
이 설정을 통해 외부에서 들어오는 요청은 Ambassador 역할을 하는 Nginx 컨테이너로 전달되고, Nginx는 이를 Flask 애플리케이션 컨테이너로 전달된다.
'kubernetes' 카테고리의 다른 글
| [kubernetes] deployment (0) | 2024.12.10 |
|---|---|
| [Kubernetes] DeamonSet & Job, Cronjob (0) | 2024.12.06 |
| [Kubernetes] Configmap & Secret (0) | 2024.12.05 |
| [Kubernetes] Volume(PV, PVC) (0) | 2024.12.04 |
| [kubernetes] Service & Ingress (0) | 2024.12.03 |