NGINX 인그레스 컨트롤러 아키텍처: 라우팅 및 SSL 종료

💡 핵심 요약 (Executive Summary)

본 가이드는 nginx ingress controller 핵심 가이드 및 실전 아키텍처의 핵심 개념, 실전 구성 명령어 및 아키텍처 베스트 프랙티스를 다룹니다. 클라우드 네이티브 및 인프라 엔지니어링 실무에 즉시 활용 가능하도록 체계적으로 정리했습니다.

📑 Table of Contents
Setups
bash
repo=bitnami
sdiff -s <(helm show values ${repo}/$(cat Chart.yaml | yq '.name') --version=$(cat Chart.yaml | yq '.version') | yq -oprops) <(cat ./values.yaml | yq -oprops)
nodeAffinityPreset.type =                                     | nodeAffinityPreset.type = hard
nodeAffinityPreset.key =                                      | nodeAffinityPreset.key = node-role.kubernetes.io/control-plane
                                                              > nodeAffinityPreset.values.0 = true
                                                              > tolerations.0.key = node-role.kubernetes.io/control-plane
                                                              > tolerations.0.operator = Exists
                                                              > tolerations.0.effect = NoSchedule
service.externalTrafficPolicy =                               | service.externalTrafficPolicy = Local
Annotations
bash
nginx.ingress.kubernetes.io/ssl-redirect: "true" #http 접근시 https로 리다이렉트
nginx.ingress.kubernetes.io/whitelist-source-range: 0.0.0.0/24,1.1.1.1 #접근허용 대역,IP 명시
nginx.ingress.kubernetes.io/proxy-body-size: "1g" #1gb까지 업로드 허용


nginx.org/lb-method: "ip_hash" # ip_hash 로드 밸런싱 방법을 선택합니다
nginx.org/ssl-services: "webapp" # 백엔드 메소드에 TLS를 활성화합니다
nginx.org/proxy-connect-timeout: "10s" # 백엔드에 대한 시간 초과를 구성합니다.
nginx.org/proxy-read-timeout: "10s" 
nginx.org/proxy-send-timeout: "10s" 
nginx.org/rewrites: "serviceName=webapp rewrite=/v1" # 요청 URI rewrite
nginx.com/jwt-key: "webapp-jwk" # 요청의 JWT 인증 활성화
nginx.com/jwt-realm: "Webb App" 
nginx.com/jwt-token: "$cookie_auth_token" 
nginx.com/jwt-login-url: "https://login.example.com" 

#path 새로 쓰기
nginx.ingress.kubernetes.io/rewrite-target: /ceph-dashboard/$2
#manifest: spec.rules[].http.paths[].path: "/ceph-dashboard(/|$)(.*)"
common
bash
#cert-manager certification 생성요청
cert-manager.io/cluster-issuer: $clusterissuer
cert-manager.io/issuer: $issuer

# nginx
## 세션 유지 및 웹소켓 고정 (Sticky Session)
#nginx.ingress.kubernetes.io/affinity: "cookie"
#nginx.ingress.kubernetes.io/session-cookie-name: "route"
#nginx.ingress.kubernetes.io/session-cookie-change-on-failure: "true"
## Client IP Hash 기반 Sticky Session
nginx.ingress.kubernetes.io/upstream-hash-by: "$remote_addr"
# 타임아웃 설정 (연결 유지)
nginx.ingress.kubernetes.io/proxy-read-timeout: "3600"
nginx.ingress.kubernetes.io/proxy-send-timeout: "3600"
## 데이터 처리
nginx.ingress.kubernetes.io/proxy-body-size: "50m"
nginx.ingress.kubernetes.io/proxy-body-size: "50m"
nginx.ingress.kubernetes.io/proxy-buffer-size: "128k"
## custom header
nginx.ingress.kubernetes.io/custom-headers: "portal/no-cache-headers"
Logging
ip 정상 감지 / 출력 방법
  • 외부에서 호출되는 IP 요청 노드에 nginx-ingress-controller가 스케줄링 되어야 함.
  • public IP가 controle-plane인 경우
  • controle-plane 스케줄링 허용 및 자동스케줄링 제한
bash
k uncordon $controle_plane
    k edit node $controle_plane
    >>>
    # .spec 추가
      taints:
      - effect: NoSchedule
        key: node-role.kubernetes.io/control-plane #적절한 라벨
        value: "true"
    <<<
  • deployment에서 스케줄 옵션 적용 (helm의 경우 values.yaml에서 정의)
bash
k edit -n $ns deploy/nginx-ingress-controller
    >>>
    # .spec.template.spec 추가
    	# 스케줄링 노드 지정
          affinity:
            nodeAffinity:
              requiredDuringSchedulingIgnoredDuringExecution:
                nodeSelectorTerms:
                - matchExpressions:
                  - key: node-role.kubernetes.io/control-plane
                    operator: In
                    values:
                    - "true"
    	# 스케줄링 노드 허용
          tolerations:
          - effect: NoSchedule
            key: node-role.kubernetes.io/control-plane
            operator: Exists
    <<<
  • service externalTrafficPolicy 설정
bash
k edit svc -n $ns nginx-ingress-controller
    >>>
    # .spec 변경
      externalTrafficPolicy: Local #Cluster
    <<<
Features
메모리가 작은 Control-plane을 Ingress용으로만 사용할 경우
  • node spec
bash
taints:
      - effect: NoSchedule
        key: node-role.kubernetes.io/control-plane
  • nginx-ingress-setting
bash
nodeAffinityPreset.type = 	      |	nodeAffinityPreset.type = hard
  nodeAffinityPreset.key = 		      |	nodeAffinityPreset.key = node-role.kubernetes.io/control-plan
  														      >	nodeAffinityPreset.values.0 = true
  														      >	tolerations.0.key = node-role.kubernetes.io/control-plane
  														      >	tolerations.0.operator = Exists
  														      >	tolerations.0.effect = NoSchedule
  defaultBackend.enabled = true		  |	defaultBackend.enabled = false
  service.externalTrafficPolicy =   |	service.externalTrafficPolicy = Local

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *