ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • K8S + Istio 환경에서 Nginx Proxy 설정하기
    K8S 2021. 9. 13. 12:36

    틀린 내용이 있을 수도 있습니다! 

    틀린 내용이 있다면 댓글로 달아주시면 감사하겠습니다!

     

     

    이번 포스팅은 K8S + 이스티오 환경에서 Nginx로 proxy를 만들고,

    API 서버들의 엔드포인트를 단일화하여 API Gateway로 사용하기 위한 Nginx Configuration에 대한 정리다. 

     

    그냥 nginx를 프록시로 만들어서 클러스터에 올리면 되지 않냐

    왜 굳이 K8S + Istio를 명시하여 포스팅하냐고 생각할 수도 있는데...

     

    Istio는 envoy proxy를 기반으로 하기 때문에

    nginx로 요청이 들어오기 위해선 envoy를 거쳐서 들어와야 한다. 

     

     

    따라서 나의 경우, Local 환경에서 테스트할때 정상이였던 nginx proxy는 클러스터 내부에서는 잘 동작하지 않았다.

    그래서 이번 포스팅은 istio를 수용할 수 있는 nginx proxy configuration에 대해 다룬다. 

     

    서비스의 구성은 다음과 같다. 

     

    프론트엔드에서 nginx을 게이트웨이로 삼아 API 서버들을 호출하는 구조다.

    여기서 nginx는 api-server들의 endpoint를 묶어 API gateway 역할을 하게 된다.  

     

    Istio와 함께 사용하기 위해 다음과 같이 Nginx configuration 코드를 작성했다.  

     

    /etc/nginx/conf.d/web.conf

    # nginx pod 내부에서 k8s dns를 사용하려면 coredns pod의 IP주소를 명시해야 한다. 
    resolver 10.96.0.10;
    
    # upstream의 이름은 요청을 받는 서비스 이름과 동일해야 한다. 
    upstream api-server1-service{
        server api-server1-service.default.svc.cluster.local:8080;
        keepalive 32;
    }
    
    upstream api-server2-service{
        server api-server2-service.default.svc.cluster.local:8080;
        keepalive 32;
    }
    
    upstream api-server3-service{
        server api-server3-service.default.svc.cluster.local:8080;
        keepalive 32;
    }
    
    
    # server 
    server {
       listen 80;
        proxy_http_version 1.1;   # istio에서는 1.1이나 2만 사용하므로 1.1을 사용한다고 명시한다. 
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
        proxy_set_header Connection "";
        
        
        # 이부분은 jaeger를 사용한다면 명시하고 사용하지 않으면 굳이 명시하지 않아도 된다.
        add_header X-Request-Id $http_x_request_id;
        add_header X-B3-Traceid $http_x_b3_traceid;
        add_header X-B3-Spanid $http_x_b3_spanid;
        add_header X-B3-Parentspanid $http_x_b3_parentspanid;
        add_header X-B3-Sampled $http_x_b3_sampled;
        add_header X-B3-Flags $http_x_b3_Flags;
        add_header B3 $http_b3;
        add_header X-Ot-Span-Context $http_x_ot_span_context;
       
       
        # /apis/v1/a로 시작한 요청은 api-server1으로 보낸다. 
        location ~ ^/apis/v1/a(.*)$ {
            rewrite ^/apis/v1/a(.*)$ /apis/v1/a$1 break;
            proxy_pass http://api-server1-service;
        }
        
        
        # /apis/v1/b로 시작한 요청은 api-server2으로 보낸다. 
        location ~ ^/apis/v1/b(.*)$ {
            rewrite ^/apis/v1/b(.*)$ /apis/v1/b$1 break;
            proxy_pass http://api-server2-service;
        }
        
        
        # /apis/v1/c로 시작한 요청은 api-server3으로 보낸다. 
        location ~ ^/apis/v1/c(.*)$ {
            rewrite ^/apis/v1/c(.*)$ /apis/v1/c$1 break;
            proxy_pass http://api-server3-service;
        }
    }

     

    위 proxy_set_header 설정을 반드시 Connection ""와 proxy_http_version을 1.1로 해주어야 한다.

    nginx는 기본적으로 http 요청을 프록시할 때, http 1.0으로 바꾸어서 보낸다. 

    이 과정에서 connection header 또한 close로 바꾸어서 보내는데, 이를 nginx를 통해 proxy할 때는 connection header를 없앤 후 보내주자. 

     

    참고로 http 1.0 에서는 커넥션을 유지하는 것이 default가 아니며,

    커넥션을 유지시켜주기 위해서는 따로 헤더에 Connection: keep-alive가 추가해 주어야 한다.

    http 1.1에서는 커넥션을 유지하는 것이 default이기 때문에 이 헤더가 필요 없다. 

     

    반응형

    'K8S' 카테고리의 다른 글

    kubectl Image를 이용한 pod 내에서 secret 생성하기  (0) 2022.08.05
    K8S 설계 개념(Kubernetes Design Concept)  (0) 2021.09.15
    K8S Network Policy 정리  (0) 2021.08.02
    K8S RBAC - Cluster Role 정리  (0) 2021.08.01
    K8S RBAC - Role 정리  (0) 2021.08.01

    댓글

Designed by Tistory.