[Kubernetes] Ambassador Pod Design Pattern

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