💡 핵심 요약 (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
Leave a Reply