Container Orchestration/Kubernetes

Ingress Nginx란?

Somaz 2024. 7. 4. 12:39
728x90
반응형

Overview

Kubernetes 클러스터에 외부 트래픽을 안전하고 유연하게 연결하려면 적절한 진입 지점(Entry Point)이 필요하다.

 

Ingress NGINX는 Kubernetes에서 가장 널리 사용되는 Ingress Controller 중 하나로, HTTP/HTTPS 요청을 클러스터 내부의 서비스로 라우팅하는 데 최적화되어 있다. 이 글에서는 Ingress NGINX의 개념과 주요 기능, 다양한 주석(annotation)을 활용한 커스터마이징, Helm 또는 Manifest 기반 설치 방법까지 실습 중심으로 알아본다.

 

특히 On-Premise 환경에서는 LoadBalancer 서비스 유형을 사용하기 위해 MetalLB와 함께 Ingress NGINX를 구성하는 것이 일반적이다. 이를 통해 클라우드 환경에서 제공되는 네트워크 기능을 Bare-Metal에서도 구현할 수 있다.

 

출처 : https://cloudworkmates.com/2021/06/08/running-ha-nginx-ingress-on-aws-eks-with-tlsaws-acm/

 

 

 

📅 관련 글

MetalLB의 관한 내용은 아래의 글을 참고하길 바란다.

2023.05.03 - [Container Orchestration/Kubernetes] - MetalLB란?

 

2024.06.24 - [Container Orchestration/Kubernetes] - Ingress Nginx란?

2024.11.07 - [AWS] - AWS Ingress Annotations 정리

2025.03.21 - [Container Orchestration/Kubernetes] - Kubernetes Gateway API 완전 정복

 

 

 

 

 

 


 

 

 

Ingress Nginx란?

Ingress Nginx는 Kubernetes 클러스터로의 HTTP 및 HTTPS 트래픽 라우팅을 처리하기 위해 널리 사용되는 컨트롤러이다.  외부 트래픽의 입구(진입점) 역할을 하며 Ingress 리소스에 지정된 규칙에 따라 클러스터 내의 적절한 서비스로 전달한다. URL 라우팅을 통해 외부에서 내부 서비스에 액세스할 수 있도록 하여 역방향 프록시 및 로드 밸런서 역할을 한다.  주요 구성 요소와 기능에 대한 자세한 개요는 다음과 같다.

 

 

 


 

 

 

 

 

Ingress Nginx의 주요 기능

  1. 트래픽 라우팅
    • 호스트 기반 라우팅 : 도메인 이름을 기반으로 트래픽을 라우팅한다. 예를 들어 요청을 `example.com` 을 하나의 서비스로 라우팅하고 `another.com` 을 다른 서비스로 라우팅할 수 있다.
    • 경로 기반 라우팅 : URL 경로를 기반으로 트래픽을 라우팅한다. 예를 들어, `example.com/blog` 및 `example.com/shop` 다른 서비스로 연결시킬 수 있다.
  2. SSL/TLS 종료 
    • Ingress Nginx는 SSL/TLS 종료를 관리하여 암호화된 트래픽이 백엔드 서비스에 도달하기 전에 처리할 수 있다. 이는 서비스 자체에서 암호화 오버헤드를 오프로드하고 인증서 관리를 중앙 집중화한다.
  3. 로드 밸런싱 
    • Nginx를 통해 로드 밸런싱을 제공하여 수신 트래픽을 서비스의 여러 인스턴스에 분산하고, 높은 트래픽 로드 처리를 개선하고 내결함성을 높인다.
  4. 사용자 정의 가능한 Annotation
    • Ingress 리소스는 Annotation을 사용하여 구성할 수 있다. 이를 통해 시간 초과, 요청에 허용되는 본문 크기, SSL 사용 여부 및 Nginx와 관련된 기타 여러 설정을 사용자 정의할 수 있다.
  5. 로깅 및 모니터링 
    • 자세한 액세스 및 오류 로깅을 지원한다. 측정항목은 Prometheus를 통해 노출 및 모니터링할 수 있으며 Grafana와 같은 도구를 사용하여 시각화할 수 있다.
  6. 선호도 및 세션 고정성 

 

 

 

 

Ingress Nginx Annotation(주석) 정리

Ingress Nginx는 주석을 사용하여동작을 맞춤설정한다.  Ingress 컨트롤러가 HTTP 요청을 처리하는 방법의 다양한 측면을 세부적으로 제어할 수 있다. 다음은 Nginx Ingress에 사용되는 주요 주석 중 일부이다.

 

  • `nginx.ingress.kubernetes.io/rewrite-target` : 요청이 애플리케이션으로 전송되기 전에 요청의 URL을 다시 작성하도록 지정
  • `nginx.ingress.kubernetes.io/ssl-redirect` : HTTPS 리디렉션을 강제할지 여부를 제어
  • `nginx.ingress.kubernetes.io/force-ssl-redirect` : 서버가 TLS로 구성되지 않은 경우에도 HTTPS 리디렉션을 강제
  • `nginx.ingress.kubernetes.io/use-regex` : 경로 값을 정규식으로 해석해야 하는지 여부 확인
  • `nginx.ingress.kubernetes.io/configuration-snippet` : 서버 또는 위치 블록에 사용자 정의 구성을 삽입
  • `nginx.ingress.kubernetes.io/limit-rps` : 초당 요청을 Ingress에 정의된 경로로 제한
  • `nginx.ingress.kubernetes.io/limit-connections` : 단일 IP 주소에서 허용되는 동시 연결 수를 제한
  • `nginx.ingress.kubernetes.io/auth-type` : 인증 유형(예: 기본 또는 다이제스트)을 지정
  • `nginx.ingress.kubernetes.io/auth-secret` : 인증을 위한 사용자 이름과 비밀번호가 포함된 비밀의 이름을 지정
  • `nginx.ingress.kubernetes.io/auth-realm`: 인증을 위한 영역을 설정

 

 

 

다음은 이러한 주석 중 일부를 사용하는 방법을 보여주는 예제 YAML 파일이다.

apiVersion: networking.k8s.io/v1kind: Ingressmetadata:
  name: example-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$1
    nginx.ingress.kubernetes.io/ssl-redirect: "true"
    nginx.ingress.kubernetes.io/use-regex: "true"
    nginx.ingress.kubernetes.io/limit-rps: "5"
    nginx.ingress.kubernetes.io/configuration-snippet: |
      more_set_headers "X-Robots-Tag: noindex, nofollow";
spec:
  rules:
  - http:
      paths:
      - path: /something(/|$)(.*)
        pathType: Prefix
        backend:
          service:
            name: some-service
            port:
              number: 80
  • Rewrite Target: path에 정의된 캡처 그룹을 기반으로 들어오는 URL을 다시 작성
  • SSL Redirect: HTTP 요청을 HTTPS로 리디렉션
  • Use Regex : 지정된 경로를 정규식으로 처리
  • Rate Limiting: 초당 요청을 5개로 제한
  • Configuration Snippet: Nginx 구성에 직접 추가 구성을 추가

 

 

 

 


 

 

Ingress Nginx 설치

 

Ingress Nginx 배포에는 일반적으로 YAML Manifest 또는 Helm 차트를 사용하여 Nginx Ingress Controller를 설치하는 작업을 사용한다. 따라서 Manifest와 Helm을 사용해서 설치하는 방법을 각각 알아본다.

 

설치하기 전에 Onpremise 환경이라면 MetalLB를 설치후에 Ingress Nginx를 설치해야 Service를 LoadBalancer Type으로 설정하여 설치할 수 있다. 그리고 EXTERNAL-IP로 받아오는 IP는 MetalLB의 IPAddressPool에 설정된 값을 가져오게 된다.

cat <<EOF >> metallb-config.yaml
# 사용 apiversion
apiVersion: metallb.io/v1beta1 
kind: IPAddressPool
metadata:
  name: ip-pool
  namespace: metallb-system
spec:
  addresses:
  # 사용할 ip address pool
  - 143.92.123.123-143.92.123.123
  autoAssign: true
--- 
apiVersion: metallb.io/v1beta1 
# metalib의 l2모드를 사용한다.
kind: L2Advertisement 
metadata:
  name: l2-network
  namespace: metallb-system
spec:
   # 사용할 ipAddressPools
  ipAddressPools:
    - ip-pool
EOF
k get po -n ingress-nginx
NAME                                        READY   STATUS    RESTARTS   AGE
ingress-nginx-controller-6766768d48-zm8cj   1/1     Running   0          36s

k get svc -n ingress-nginx
NAME                                 TYPE           CLUSTER-IP     EXTERNAL-IP      PORT(S)                      AGE
ingress-nginx-controller             LoadBalancer   10.96.140.20   143.92.123.123   80:31665/TCP,443:30379/TCP   44s
ingress-nginx-controller-admission   ClusterIP      10.100.76.3    <none>           443/TCP                      44s

 

 

 

 


 

 

 

 

 

Install With Helm

https://github.com/kubernetes/ingress-nginx/tree/main/charts/ingress-nginx

 

ingress-nginx/charts/ingress-nginx at main · kubernetes/ingress-nginx

Ingress-NGINX Controller for Kubernetes. Contribute to kubernetes/ingress-nginx development by creating an account on GitHub.

github.com

 

 

Repo를 추가한다.

helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update

 

설치한다.

helm install [RELEASE_NAME] ingress-nginx/ingress-nginx

 

 

Chart를 가져와서 Values 수정후 설치를 하는 방법은 아래와 같다.

helm install ingress-nginx . -n ingress-nginx -f ingress-nginx-values.yaml --create-namespace

# lint
helm lint --values ingress-nginx-values.yaml

# dry run
helm install ingress-nginx . -n ingress-nginx -f ingress-nginx-values.yaml --dry-run

# 설치
helm install ingress-nginx . -n ingress-nginx -f ingress-nginx-values.yaml

# 업그레이드
helm upgrade ingress-nginx . -n ingress-nginx -f ingress-nginx-values.yaml

 

 

helm으로 fluent-bit sidecar를 붙이는 방법도 간단하다.

 

 

`templates/extra-configmap.yaml`

아래와 같이 template을 추가해준다.

{{- if .Values.controller.extraConfigMaps }}
{{- range .Values.controller.extraConfigMaps }}
apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .name }}
  labels:
    {{- toYaml .labels | nindent 4 }}
data:
  {{- toYaml .data | nindent 2 }}
{{- end }}
{{- end }}

 

 

`ingress-nginx-values.yaml`

아래와 같이 값을 추가해준다.

controller:
...
  extraContainers: 
    - name: fluent-bit
      image: fluent/fluent-bit:latest
      imagePullPolicy: IfNotPresent
      ports:
        - containerPort: 2020
      volumeMounts:
        - name: varlog
          mountPath: /var/log
        - name: fluent-bit-config
          mountPath: /fluent-bit/etc
      resources:
        limits:
          memory: 500Mi
        requests:
          cpu: 100m
          memory: 100Mi
  extraVolumes:
    - name: shared-data
      emptyDir: {}
    - name: fluent-bit-config
      configMap:
        name: fluent-bit-config 
  extraVolumeMounts:
    - name: shared-data
      mountPath: /var/log/nginx
    - name: fluent-bit-config
      mountPath: /fluent-bit/etc/
  extraConfigMaps:
    - name: fluent-bit-config
      labels:
        type: fluent-bit
      data:
        fluent-bit.conf: |
          [SERVICE]
              Flush        1
              Log_Level    info
              Parsers_File parsers.conf
          [INPUT]
              Name tail
              Path /var/log/nginx/access.log
              Parser nginx_access_parser
              Tag nginx_access
          [INPUT]
              Name tail
              Path /var/log/nginx/error.log
              Parser nginx_error_parser
              Tag nginx_error
          [FILTER]
              Name    grep
              Match   nginx_access
              Regex   log .*fgn.*
          [FILTER]
              Name    modify
              Match   nginx_access
              Add     log_type nginx_access
          [FILTER]
              Name    modify
              Match   nginx_error
              Add     log_type nginx_error
          [OUTPUT]
              Name stdout
              Match *
          [OUTPUT]
              Name loki
              Match *
              Host loki.somaz.link
              Port 443
              URI /loki/api/v1/push
              tls On
              Labels job=fluent-bit, log_type=$log_type
        parsers.conf: |
          [PARSER]
              Name        nginx_access_parser
              Format      regex
              Regex       ^(?<remote_addr>[^ ]*) - (?<remote_user>[^ ]*) \[(?<time>[^\]]*)\] "(?<method>\S+) (?<request>[^ ]*) (?<http_protocol>[^"]*)" (?<status>[^ ]*) (?<body_bytes_sent>[^ ]*) "(?<http_referer>[^"]*)" "(?<http_user_agent>[^"]*)" (?<request_length>[^ ]*) (?<request_time>[^ ]*) \[(?<upstream_name>[^\]]*)\] \[(?<upstream_addr>[^\]]*)\] (?<upstream_response_length>[^ ]*) (?<upstream_response_time>[^ ]*) (?<upstream_status>[^ ]*) (?<request_id>[^ ]*)$
              Time_Key    time
              Time_Format  %d/%b/%Y:%H:%M:%S %z
          [PARSER]
              Name        nginx_error_parser
              Format      regex
              Regex       ^(?<time>\d{4}/\d{2}/\d{2} \d{2}:\d{2}:\d{2}) \[(?<log_level>\w+)\] (?<process_info>\d+#\d+): (?<message>.*)$
              Time_Key    time
              Time_Format  %Y/%m/%d %H:%M:%S

 

 

 

마지막으로 다시 업그레이드 해준다.

helm upgrade ingress-nginx . -n ingress-nginx -f ingress-nginx-values.yaml

 

 

 

logs 를 사용해서 sidecar가 잘 붙었는지 확인 가능하다.

k get po -n ingress-nginx
NAME                                        READY   STATUS        RESTARTS   AGE
ingress-nginx-controller-6766768d48-zm8cj   0/1     Terminating   0          37d
ingress-nginx-controller-84d78c7d45-ptt97   2/2     Running       0          82s

k logs -n ingress-nginx ingress-nginx-controller-84d78c7d45-ptt97 -c fluent-bit
Fluent Bit v3.0.7
* Copyright (C) 2015-2024 The Fluent Bit Authors
* Fluent Bit is a CNCF sub-project under the umbrella of Fluentd
* https://fluentbit.io

___________.__                        __    __________.__  __          ________
\_   _____/|  |  __ __   ____   _____/  |_  \______   \__|/  |_  ___  _\_____  \
 |    __)  |  | |  |  \_/ __ \ /    \   __\  |    |  _/  \   __\ \  \/ / _(__  <
 |     \   |  |_|  |  /\  ___/|   |  \  |    |    |   \  ||  |    \   / /       \
 \___  /   |____/____/  \___  >___|  /__|    |______  /__||__|     \_/ /______  /
     \/                     \/     \/               \/                        \/

[2024/07/05 08:55:46] [ info] [fluent bit] version=3.0.7, commit=73e72bdf9a, pid=1
[2024/07/05 08:55:46] [ info] [storage] ver=1.5.2, type=memory, sync=normal, checksum=off, max_chunks_up=128
[2024/07/05 08:55:46] [ info] [cmetrics] version=0.9.1
[2024/07/05 08:55:46] [ info] [ctraces ] version=0.5.1
[2024/07/05 08:55:46] [ info] [input:tail:tail.0] initializing
[2024/07/05 08:55:46] [ info] [input:tail:tail.0] storage_strategy='memory' (memory only)
[2024/07/05 08:55:46] [ info] [input:tail:tail.1] initializing
[2024/07/05 08:55:46] [ info] [input:tail:tail.1] storage_strategy='memory' (memory only)
[2024/07/05 08:55:46] [ info] [output:stdout:stdout.0] worker #0 started
[2024/07/05 08:55:46] [ info] [output:loki:loki.1] configured, hostname=loki.somaz.link:443
[2024/07/05 08:55:46] [ info] [sp] stream processor started

 

 

 

아래와 같이 curl로 확인도 가능하고, grafana를 연동해서 시각화도 할 수 있다.

curl -G -s "https://loki.somaz.link/loki/api/v1/query_range" \
  --data-urlencode "query={job=\"fluent-bit\",log_type=\"nginx_error\"}" \
  --data-urlencode "limit=10" \
  --data-urlencode "start=$(date --date='1 hour ago' +%s)" \
  --data-urlencode "end=$(date +%s)"


curl -G -s "https://loki.somaz.link/loki/api/v1/query_range" \
  --data-urlencode "query={job=\"fluent-bit\",log_type=\"nginx_access\"}" \
  --data-urlencode "limit=10" \
  --data-urlencode "start=$(date --date='1 hour ago' +%s)" \
  --data-urlencode "end=$(date +%s)"

 

 

 

 


 

 

 

 

 

Install By Manifest

https://github.com/kubernetes/ingress-nginx/blob/main/deploy/static/provider/baremetal/deploy.yaml

 

ingress-nginx/deploy/static/provider/baremetal/deploy.yaml at main · kubernetes/ingress-nginx

Ingress-NGINX Controller for Kubernetes. Contribute to kubernetes/ingress-nginx development by creating an account on GitHub.

github.com

 

 

 

해당 Manifest를 사용해서 배포하면 된다.

kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/baremetal/deploy.yaml

 

 

파일을 가져와서 배포하고 싶다면 아래와 같이 하면된다.

# 파일 다운로드
curl -LO https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/baremetal/deploy.yaml

# 배포
k apply -f deploy.yaml -n ingress-nginx

 

 

Manifest로 배포할 시에는 아래와 같이 간단하게 FluentBit Sidecar를 사용해서, `nginx/access.log` , `nginx/error.log` 를 수집하여 Loki로 전달할 수 있다.

---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app.kubernetes.io/component: controller
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
    app.kubernetes.io/version: 1.10.1
  name: ingress-nginx-controller
  namespace: ingress-nginx
...
        volumeMounts:
        - name: webhook-cert
          mountPath: /usr/local/certificates/
          readOnly: true
        - name: shared-data
          mountPath: /var/log/nginx
        resources:
          requests:
            cpu: 100m
            memory: 90Mi
      - name: fluent-bit
        image: fluent/fluent-bit:2.2.2
        imagePullPolicy: Always
        volumeMounts:
        - name: shared-data
          mountPath: /var/log/nginx
        - name: fluent-bit-config
          mountPath: /fluent-bit/etc/
      volumes:
      - name: webhook-cert
        secret:
          secretName: ingress-nginx-admission
      - name: shared-data
        emptyDir: {}
      - name: fluent-bit-config
        configMap:
          name: fluent-bit-config
---

 

 

`fluentbit-config.yaml`

apiVersion: v1
kind: ConfigMap
metadata:
  name: fluent-bit-config
  namespace: ingress-nginx
data:
  fluent-bit.conf: |
    [SERVICE]
        Flush        1
        Log_Level    info
        Parsers_File parsers.conf

    [INPUT]
        Name tail
        Path /var/log/nginx/access.log
        Parser nginx_access_parser
        Tag nginx_access

    [INPUT]
        Name tail
        Path /var/log/nginx/error.log
        Parser nginx_error_parser
        Tag nginx_error

    [FILTER]
        Name    grep
        Match   nginx_access
        Regex   log .*fgn.*

    [FILTER]
        Name    modify
        Match   nginx_access
        Add     log_type nginx_access

    [FILTER]
        Name    modify
        Match   nginx_error
        Add     log_type nginx_error

    [OUTPUT]
        Name stdout
        Match *

    [OUTPUT]
        Name loki
        Match *
        Host loki-gateway.somaz.link
        Port 443
        URI /loki/api/v1/push
        tls On
        Labels job=fluent-bit, log_type=$log_type

  parsers.conf: |
    [PARSER]
        Name        nginx_access_parser
        Format      regex
        Regex       ^(?<remote_addr>[^ ]*) - (?<remote_user>[^ ]*) \[(?<time>[^\]]*)\] "(?<method>\S+) (?<request>[^ ]*) (?<http_protocol>[^"]*)" (?<status>[^ ]*) (?<body_bytes_sent>[^ ]*) "(?<http_referer>[^"]*)" "(?<http_user_agent>[^"]*)" (?<request_length>[^ ]*) (?<request_time>[^ ]*) \[(?<upstream_name>[^\]]*)\] \[(?<upstream_addr>[^\]]*)\] (?<upstream_response_length>[^ ]*) (?<upstream_response_time>[^ ]*) (?<upstream_status>[^ ]*) (?<request_id>[^ ]*)$
        Time_Key    time
        Time_Format  %d/%b/%Y:%H:%M:%S %z

    [PARSER]
        Name        nginx_error_parser
        Format      regex
        Regex       ^(?<time>\d{4}/\d{2}/\d{2} \d{2}:\d{2}:\d{2}) \[(?<log_level>\w+)\] (?<process_info>\d+#\d+): (?<message>.*)$
        Time_Key    time
        Time_Format  %Y/%m/%d %H:%M:%S

 

 

이런식으로 수정하여 수집을 해주면 아래와 같이 검색이 가능하고 Grafana로 시각화도 할 수 있다.

curl -G -s "https://loki-gateway.somaz.link/loki/api/v1/query_range" \
  --data-urlencode "query={job=\"fluent-bit\",log_type=\"nginx_access\"}" \
  --data-urlencode "limit=10" \
  --data-urlencode "start=$(date --date='1 hour ago' +%s)" \
  --data-urlencode "end=$(date +%s)"
{"status":"success","data":{"resultType":"streams","result":[{"stream":{"job":"fluent-bit","log_type":"nginx_access"},"values":[["1706081048896054832","{\"log\":\"10.10.100.24 - 1 [24/Jan/2024:07:24:08 +0000] \\\"POST /user/leader-character/position/update HTTP/1.1\\\" 200 213 \\\"-\\\" \\\"UnityPlayer/2022.3.1f1 (UnityWebRequest/1.0, libcurl/7.84.0-DEV)\\\" 606 0.012 [sn-server-dev1-sn-server-game-dev1-80] [] 10.233.105.94:8080 213 0.012 200 c65ef0adbdc886d6d731bcdee1f09753\",\"log_type\":\"nginx_access\"}"],["1706081021518809926","{\"log\":\"10.10.100.24 - 25 [24/Jan/2024:07:23:41 +0000] \\\"POST /guild/get HTTP/1.1\\\" 200 417 \\\"-\\\" \\\"UnityPlayer/2022.3.1f1 (UnityWebRequest/1.0, libcurl/7.84.0-DEV)\\\" 353 0.011 [sn-server-dev1-sn-server-game-dev1-80] [] 10.233.105.94:8080 417 0.012 200 dcb2b475b0ffd7815df0d51556a0fd9c\",\"log_type\":\"nginx_access\"}"],["1706081021463331838","{\"log\":\"10.10.100.24 - 25 [24/Jan/2024:07:23:41 +0000] \\\"POST /stat-upgrade/get HTTP/1.1\\\" 200 117 \\\"-\\\" \\\"UnityPlayer/2022.3.1f1 (UnityWebRequest/1.0, libcurl/7.84.0-DEV)\\\" 360 0.006 [sn-server-dev1-sn-server-game-dev1-80] [] 10.233.105.94:8080 117 0.008 200 3452a1a6ea9a8d1c1470a4fa8da6f4af\",\"log_type\":\"nginx_access\"}"],["1706081021429729524","{\"log\":\"10.10.100.24 - 25 [24/Jan/2024:07:23:41 +0000] \\\"POST /dungeon/stage-dungeon/get HTTP/1.1\\\" 200 22 \\\"-\\\" \\\"UnityPlayer/2022.3.1f1 (UnityWebRequest/1.0, libcurl/7.84.0-DEV)\\\" 369 0.006 [sn-server-dev1-sn-server-game-dev1-80] [] 10.233.105.94:8080 22 0.004 200 e11bf5f3b51e7a166950f409604eea25\",\"log_type\":\"nginx_access\"}"],["1706081021400093773","{\"log\":\"10.10.100.24 - 25 [24/Jan/2024:07:23:41 +0000] \\\"POST /event-pass/get HTTP/1.1\\\" 200 20 \\\"-\\\" \\\"UnityPlayer/2022.3.1f1 (UnityWebRequest/1.0, libcurl/7.84.0-DEV)\\\" 358 0.008 [sn-server-dev1-sn-server-game-dev1-80] [] 10.233.105.94:8080 20 0.008 200 645368bd7ca65b79a7744e0329f60dca\",\"log_type\":\"nginx_access\"}"],["1706081021317536728","{\"log\":\"10.10.100.24 - 25 [24/Jan/2024:07:23:41 +0000] \\\"POST /game-event/get HTTP/1.1\\\" 200 640 \\\"-\\\" \\\"UnityPlayer/2022.3.1f1 (UnityWebRequest/1.0, libcurl/7.84.0-DEV)\\\" 358 0.013 [sn-server-dev1-sn-server-game-dev1-80] [] 10.233.105.94:8080 640 0.012 200 05f440ca128244a57da4563c8133ff87\",\"log_type\":\"nginx_access\"}"],["1706081021258885802","{\"log\":\"10.10.100.24 - 25 [24/Jan/2024:07:23:41 +0000] \\\"POST /like-ability-quest/get HTTP/1.1\\\" 200 20 \\\"-\\\" \\\"UnityPlayer/2022.3.1f1 (UnityWebRequest/1.0, libcurl/7.84.0-DEV)\\\" 366 0.005 [sn-server-dev1-sn-server-game-dev1-80] [] 10.233.105.94:8080 20 0.008 200 9b4ef1b9d5b379dcb498639fa258e062\",\"log_type\":\"nginx_access\"}"],["1706081021226876432","{\"log\":\"10.10.100.24 - 25 [24/Jan/2024:07:23:41 +0000] \\\"POST /membership/get HTTP/1.1\\\" 200 39 \\\"-\\\" \\\"UnityPlayer/2022.3.1f1 (UnityWebRequest/1.0, libcurl/7.84.0-DEV)\\\" 358 0.008 [sn-server-dev1-sn-server-game-dev1-80] [] 10.233.105.94:8080 39 0.008 200 bee9c7544b2281c452a7c394f63643f7\",\"log_type\":\"nginx_access\"}"],["1706081021154217636","{\"log\":\"10.10.100.24 - 25 [24/Jan/2024:07:23:41 +0000] \\\"POST /item/get HTTP/1.1\\\" 200 251 \\\"-\\\" \\\"UnityPlayer/2022.3.1f1 (UnityWebRequest/1.0, libcurl/7.84.0-DEV)\\\" 352 0.006 [sn-server-dev1-sn-server-game-dev1-80] [] 10.233.105.94:8080 251 0.004 200 5f5769e5b2d86ff7f326cb6c2cfcc72f\",\"log_type\":\"nginx_access\"}"],["1706081021123018100","{\"log\":\"10.10.100.24 - 25 [24/Jan/2024:07:23:41 +0000] \\\"POST /deck/get HTTP/1.1\\\" 200 113 \\\"-\\\" \\\"UnityPlayer/2022.3.1f1 (UnityWebRequest/1.0, libcurl/7.84.0-DEV)\\\" 352 0.005 [sn-server-dev1-sn-server-game-dev1-80] [] 10.233.105.94:8080 113 0.008 200 dd85cd8d37295a6ff2b4d84a2bfcd254\",\"log_type\":\"nginx_access\"}"]]}],"stats":{"summary":{"bytesProcessedPerSecond":2777344,"linesProcessedPerSecond":8688,"totalBytesProcessed":4795,"totalLinesProcessed":15,"execTime":0.001726469,"queueTime":0.00007025,"subqueries":1,"totalEntriesReturned":10},"querier":{"store":{"totalChunksRef":0,"totalChunksDownloaded":0,"chunksDownloadTime":0,"chunk":{"headChunkBytes":0,"headChunkLines":0,"decompressedBytes":0,"decompressedLines":0,"compressedBytes":0,"totalDuplicates":0}}},"ingester":{"totalReached":1,"totalChunksMatched":1,"totalBatches":1,"totalLinesSent":10,"store":{"totalChunksRef":0,"totalChunksDownloaded":0,"chunksDownloadTime":0,"chunk":{"headChunkBytes":4795,"headChunkLines":15,"decompressedBytes":0,"decompressedLines":0,"compressedBytes":0,"totalDuplicates":0}}}}}}

 

 

 

 

 

Gateway API vs Ingress NGINX 간단 비교

항목 Ingress NGINX Gateway API
표준화 수준 성숙, Kubernetes Core 최신 API, GA 단계 도입 중
역할 분리 Controller 하나에 집중 GatewayClass, Gateway, Route 분리
지원 프로토콜 HTTP/HTTPS 중심 HTTP, HTTPS, TCP, TLS, gRPC 등 다중 프로토콜
라우팅 기능 Annotation 기반 세부 설정 CRD 기반 선언적이고 확장 가능한 구조
커뮤니티 지원 매우 활발 빠르게 성장 중
복잡도 낮음 (학습 난이도 낮음) 중간~높음 (구조적 설계 요구)

 

  • Ingress NGINX는 빠르고 유연한 구성에 적합하며, Gateway API는 구조적이고 복합적인 요구사항을 만족시키는 데 강점을 가진다.
  • 실습 위주의 단일 환경이나 단순 라우팅이라면 Ingress NGINX, 다중 팀 또는 다중 프로토콜 기반의 엔터프라이즈 환경이라면 Gateway API를 고려하는 것이 좋다.

 

 

 

 

 


 

 

 

 

마무리

Ingress NGINX는 클러스터 외부 트래픽을 안전하고 효율적으로 처리하는 데 필수적인 컴포넌트다. 호스트 기반, 경로 기반 라우팅은 물론 SSL 종료, 로드 밸런싱, 인증 처리까지 다양한 기능을 제공하며, Annotation 기반으로 매우 세밀한 설정이 가능하다.

 

Helm과 Manifest 두 가지 방식으로 설치할 수 있으며, Fluent Bit와 같은 사이드카를 연동해 실시간 로그 수집 및 시각화도 쉽게 연동할 수 있다. 특히 Loki, Prometheus, Grafana와 연계하면 모니터링 환경까지 완성도 높게 구축할 수 있다.

 

 

 

 

 

 

 

 


Reference

https://github.com/kubernetes/ingress-nginx/tree/main/charts/ingress-nginx

https://github.com/kubernetes/ingress-nginx/blob/main/deploy/static/provider/baremetal/deploy.yaml

https://cloudworkmates.com/2021/06/08/running-ha-nginx-ingress-on-aws-eks-with-tlsaws-acm/

728x90
반응형