클러스터 외부 도메인에 대한 경로 기반 라우팅을 Kubernetes Ingress로 설정 에러?

클러스터 외부 도메인에 대한 경로 기반 라우팅을 Kubernetes Ingress로 설정하려고 합니다. 외부 도메인은 소유하지 않은 도메인입니다.

라우팅 자체는 잘 설정이 된 것 같지만, 이상한 현상이 발생합니다. 클러스터 내 워크로드들이 해당 외부 도메인으로 통신할 때, 443 포트를 통해 HTTP 프로토콜을 사용합니다. 이 때문에 SSL 오류가 발생하네요. 혹시 이런 문제 겪어보신 분 계신가요? 어떻게 해결하셨나요?

두 가지 중요한 포인트를 확인해보셔야 합니다.

첫째, Ingress에서 외부 도메인을 대상으로 프록시 역할을 할 때, 내부 통신도 SSL을 고려해야 합니다. 즉, 서비스 간 통신이 내부에서 발생하더라도 HTTPS를 명시적으로 사용하도록 설정해야 합니다. HTTP를 통해 443 포트를 접근하게 되면 TLS 핸드셰이크 오류가 발생할 수밖에 없습니다.

둘째, 사용하는 Ingress Controller(NGINX, Traefik 등)가 외부 도메인으로 요청을 프록시할 때, proxy_passbackend 설정이 어떻게 되어 있는지 확인해보세요. 외부 요청을 리디렉션할 때도 명확하게 https://를 명시해야 하고, X-Forwarded-Proto 등의 헤더도 정확히 설정되어야 합니다.

대부분의 경우, 해결 방법은 다음과 같습니다:

  • 서비스 내부에서 외부 도메인으로 연결할 때, 반드시 https:// 프로토콜을 사용하세요.
  • Ingress 또는 서비스 디스커버리에서 scheme 관련 설정이 있다면, 이를 https로 고정하세요.
  • NGINX Ingress의 경우, nginx.ingress.kubernetes.io/backend-protocol: "HTTPS" 어노테이션을 사용하면 도움이 됩니다.

이 설정들을 반영하면, 내부 통신도 외부와 마찬가지로 암호화된 HTTPS로 이루어져 SSL 오류를 방지할 수 있습니다.

[CloudBro AI Bot Response]
Kubernetes Ingress를 통해 클러스터 외부 도메인에 대해 경로 기반 라우팅을 설정할 때 발생하는 SSL/TLS 관련 오류 문제에 대해 단계별로 점검하고 해결하는 방법을 안내드립니다.


문제 요약

  • Ingress가 외부 도메인(예: 외부 API, 서비스)으로 요청을 프록시할 때 TLS 핸드셰이크 오류가 발생
    • 내부 통신이 HTTPS가 아닌 HTTP로 시도되어 SSL 오류 발생 가능성

핵심 점검 포인트

1. 내부 통신도 HTTPS로 설정

  • 클러스터 내에서 외부 도메인으로 요청을 보낼 때 반드시 https:// 프로토콜을 사용해야 합니다.
    • HTTP로 443 포트에 접근하면 TLS 핸드셰이크 실패가 발생합니다.
      예시:
proxy_pass https://external.domain.com;

2. Ingress Controller 설정 확인

  • 사용하는 Ingress Controller(NGINX, Traefik 등)에서 외부 도메인 프록시 설정 시 proxy_pass URL에 https:// 명시 필수
    • NGINX Ingress Controller에서는 다음 어노테이션을 통해 백엔드 프로토콜을 HTTPS로 지정할 수 있습니다.
metadata:
  annotations:
    nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
  • 또한 X-Forwarded-Proto 헤더가 올바르게 설정되어야 합니다. NGINX Ingress Controller는 기본적으로 이를 처리하지만, 커스텀 설정 시 주의 필요합니다.

3. 서비스 디스커버리 및 Helm 차트 설정

  • 사용 중인 서비스 디스커버리, Helm 차트, 또는 기타 설정에서 scheme 또는 protocol 관련 값이 있다면 반드시 https로 고정하세요.

실무 적용 예시

NGINX Ingress 예시

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: example-ingress
  annotations:
    nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
spec:
  rules:
  - host: your.internal.domain
    http:
      paths:
      - path: /external-api
        pathType: Prefix
        backend:
          service:
            name: external-proxy-service
            port:
              number: 443

external-proxy-service는 외부 도메인으로 HTTPS 요청을 프록시하는 역할을 합니다.


추가 학습 및 참고 자료


트러블슈팅 팁

  1. Ingress Controller 로그 확인
  2. TLS 핸드셰이크 오류 시 Ingress Controller 로그(예: NGINX 로그)를 확인하세요.
  3. curl 테스트
  4. 클러스터 내 파드에서 직접 외부 도메인에 curl -v https://external.domain 명령어로 HTTPS 연결 테스트를 수행하세요.
  5. 어노테이션 적용 후 Ingress 재적용
  6. 변경 사항 적용 후 kubectl apply -f ingress.yaml을 수행하고, kubectl describe ingress <name>으로 설정 반영 여부를 확인하세요.
  7. 버전 호환성 확인
  8. Ingress Controller와 Kubernetes 버전 간 호환성 문제로 인해 TLS 관련 설정이 다르게 동작할 수 있으니, 공식 릴리즈 노트를 참고하세요.

이 가이드가 Kubernetes Ingress를 통한 외부 도메인 경로 기반 라우팅 시 SSL/TLS 오류 해결에 도움이 되길 바랍니다. 추가 문의나 구체적인 설정 공유 시 더 상세한 분석과 조언을 드릴 수 있습니다.

그냥 미소유 도메인을 사용하고, 인증서가 셀프 사인이거나 재대로 인증되지 않아서 발 생하는 문제같네요.
인증서를 구매하고 인증서 발급을 진행후 동일하게 테스트해보세요.

1 Like

[CloudBro AI Bot Response]
안녕하세요! 말씀하신 내용은 Kubernetes Ingress 환경에서 인증서 문제로 인해 접속 이슈가 발생하는 전형적인 사례입니다. 아래에 단계별로 문제 원인과 해결 방안을 정리해 드리겠습니다.


문제 원인

  • 미소유 도메인 사용: 실제 소유하지 않은 도메인으로 인증서를 발급받지 못해 신뢰할 수 없는 인증서가 사용됨
    • 셀프사인(Self-signed) 인증서 사용: 클라이언트가 신뢰하지 않는 인증서이므로 브라우저나 클라이언트에서 경고 또는 접속 실패 발생
    • 인증서 미발급 또는 잘못된 발급: 인증서 체인이 완전하지 않거나 인증서가 만료됨

해결 방법

  1. 도메인 확보
    • 실제 소유하고 제어 가능한 도메인을 준비합니다.
    • 무료 도메인 또는 유료 도메인 모두 가능하며, DNS 설정이 가능해야 합니다.
  2. 공인 인증서 발급
  • Let’s Encrypt 같은 무료 공인 인증기관을 활용하거나, 유료 인증서를 구매합니다.
    • 예) Let’s Encrypt Certbot을 사용해 자동 발급 및 갱신 설정 가능
  1. Kubernetes Ingress에 인증서 적용
    • 인증서와 개인키를 Kubernetes Secret으로 생성합니다.

bash
kubectl create secret tls tls-secret --cert=fullchain.pem --key=privkey.pem -n your-namespace

  • Ingress 리소스에 해당 Secret을 참조하도록 설정합니다.

yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: example-ingress
namespace: your-namespace
annotations:
kubernetes.io/ingress.class: nginx
spec:
tls:

  • hosts:
  • your.domain.com
    secretName: tls-secret
    rules:
  • host: your.domain.com
    http:
    paths:
  • path: /
    pathType: Prefix
    backend:
    service:
    name: your-service
    port:
    number: 80
  1. 테스트 및 검증
    • 브라우저에서 https://your.domain.com 접속 시 인증서 경고가 없어야 합니다.
    • curl 명령어로도 인증서 검증이 통과하는지 확인합니다.
    curl -v https://your.domain.com
    

추가 팁 및 참고 자료


필요하시면 인증서 자동 갱신 설정, DNS 설정 방법 등도 단계별로 안내해 드릴 수 있으니 편하게 문의해 주세요!