본문 바로가기
문서 목차
ORKESTRIX설치

Ingress 컨트롤러

외부(브라우저 등)에서 도메인 기반으로 들어온 HTTP/HTTPS 요청을, 어느 서비스의 어느 파드로 보낼지 라우팅해주는 기능입니다. Traefik 을 사용합니다.

QUANTUM C&S

외부(브라우저 등)에서 도메인 기반으로 들어온 HTTP/HTTPS 요청을, 어느 서비스의 어느 파드로 보낼지 라우팅해주는 기능입니다. Traefik을 사용합니다.

./install.sh ubuntu plays/qks-ingress-controller.yaml
TLS 인증서는 클러스터 초기화 때(k8s.yaml) 이미 만들어진 인증서를 그대로 재사용하므로, 별도의 인증서 준비가 필요 없습니다. (참고: iaas.yaml 번들에도 포함되어 있어 그쪽으로 설치할 수도 있지만, 단독 실행 시엔 qks_ingress_controller_enabled 값과 무관하게 항상 설치됩니다.)

설정값

qks_ingress_controller_enabled: true
qks_ingress_controller_namespace: qks-system
qks_ingress_controller_release: traefik
qks_ingress_controller_replicas: 2
qks_ingress_controller_nodeport_insecure: 30080   # HTTP
qks_ingress_controller_nodeport_secure: 30443     # HTTPS
NodePort(30080/30443)로 노출됩니다 — 로드밸런서의 HAProxy 설정이 정확히 이 포트를 바라보고 있어, 설치 즉시 로드밸런서와 연결됩니다. 또한 HTTP(80/30080)로 들어온 요청은 자동으로 HTTPS(443/30443)로 리다이렉트됩니다.

설치 흐름

./install.sh ubuntu plays/qks-ingress-controller.yaml 실행 시 아래 순서로 진행됩니다:

./install.sh ubuntu plays/qks-ingress-controller.yaml
  │
  ├─ 1. 전 노드(마스터+워커) 공통 사전 작업 실행
  │     (변수/팩트 수집 등 — 이 역할 자체의 작업은 아직 시작 전)
  │
  └─ 2. 마스터 노드 그룹에서만 아래를 순서대로 실행
        (run_once로 지정되어 있어 물리적으로는 대표 마스터 1대에서만 실행되지만,
         결과물은 kubectl/Helm을 통해 클러스터 전체에 적용됨)

        ① 네임스페이스 생성          qks-system 네임스페이스 생성
        ② TLS 인증서 읽기            클러스터 초기화 때 만들어진 server.crt/server.key를 읽음
        ③ TLS Secret 생성            읽은 인증서로 쿠버네티스 Secret 생성
        ④ Helm 저장소 등록           https://traefik.github.io/charts 등록
        ⑤ 차트 위치 결정             온라인/오프라인 모드에 따라 차트 경로 결정
        ⑥ Helm install/upgrade      Traefik Deployment + Service(NodePort) 배포,
                                     배포 완료(Ready)까지 대기
        ⑦ 기본 TLS 인증서 지정       TLSStore CRD로 ③의 Secret을 기본 인증서로 지정
⑥에서 배포되는 Deployment는 replica 수(기본 2)만큼 파드가 뜨고, 쿠버네티스 스케줄러가 알아서 노드에 배치합니다. Service는 NodePort 타입이라 어느 마스터에서 설치 명령을 실행했든 관계없이 클러스터의 모든 노드(마스터+워커)에서 30080/30443 포트로 접근 가능합니다.

설치 확인

kubectl get pods -n qks-system | grep traefik
helm list -n qks-system | grep traefik
kubectl get svc -n qks-system | grep traefik

파드가 Running, Helm 릴리즈가 deployed, Service 타입이 NodePort여야 합니다.

파드가 Running이고 릴리즈가 deployed인 것만으로는 실제 요청이 라우팅되는지까지는 보증하지 않습니다. 아래처럼 실제 앱을 배포해 직접 확인하는 것을 권장합니다.

실제 라우팅 동작 확인

테스트용 앱과 Ingress를 배포합니다:

# test-ingress.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: test-ingress-app
spec:
  replicas: 1
  selector:
    matchLabels:
      app: test-ingress-app
  template:
    metadata:
      labels:
        app: test-ingress-app
    spec:
      containers:
        - name: web
          image: hashicorp/http-echo
          args:
            - "-text=hello-from-ingress"
          ports:
            - containerPort: 5678
---
apiVersion: v1
kind: Service
metadata:
  name: test-ingress-svc
spec:
  selector:
    app: test-ingress-app
  ports:
    - port: 80
      targetPort: 5678
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: test-ingress
spec:
  rules:
    - host: test.example.com   # 실제 도메인으로 바꿔도 되고, 테스트용 임의 도메인이어도 됩니다
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: test-ingress-svc
                port:
                  number: 80
kubectl apply -f test-ingress.yaml
kubectl get pods -w   # Running 확인되면 Ctrl+C

로드밸런서(HAProxy)를 거쳐서 실제 요청을 보내봅니다. 테스트 도메인이 실제 DNS에 없으므로 --resolve로 로드밸런서 주소에 강제로 매핑합니다:

LBIP=$(getent hosts k8s.<도메인> | awk '{print $1}')   # 예: k8s.aila.quantumcns.ai

curl -k -L \
  --resolve test.example.com:80:$LBIP \
  --resolve test.example.com:443:$LBIP \
  http://test.example.com/

hello-from-ingress가 응답으로 나오면, HAProxy → Traefik(HTTP→HTTPS 리다이렉트 포함) → Service → Pod까지 전체 경로가 정상 동작하는 것입니다.

확인 후 정리:

kubectl delete -f test-ingress.yaml

다음 단계