GCP Ingress에서 force_https가 작동하지 않음

GCP에 kubernetes 인스턴스를 하나 운영하고 있습니다. 모든 것이 정상적으로 보이지만, 어째서인지 force_https가 리다이렉트를 강제하지 못하고 http://로 사이트가 접근 가능합니다.

현재로서는 app.yml에 아래 스탠사를 추가하는 방식으로 해결했습니다.

    - replace:
        filename: /etc/nginx/conf.d/discourse.conf
        from: '    add_header ETag "";'
        to: |
                  add_header EETag "";
                  if ($thescheme = "http") {
                    return 301 https://$host$request_uri;
                  }

(추가한 줄들의 인덴트를 pups가 어떻게 처리하는지 이해하고 싶지만, 이 부분은 일단 넘어가겠습니다.)

그 변경 이후 어느 시점부터 인그레스 컨트롤러가 사이트를 서빙하는 것을 멈춘 것 같습니다. 적어도 일정 기간 동안은 정상적으로 작동하고 올바르게 리다이렉트도 되고 있었는데 말입니다.

물론 이는 unsupported-install(비공식 설치) 영역이지만, 다음으로 어디를 살펴봐야 할지 아이디어가 있는 분이라면 감사하겠습니다.

HTTP 로드밸런서를 사용 중이신가요, 아니면 TCP 로드밸런서를 사용 중이신가요? HTTP의 경우, 인그레스에서 확인되는 프로토콜이 Discourse가 검색하지 않는 비표준 헤더에 포함되어 있을 수 있습니다.

완전 관리형 설정은 다음과 같습니다:

$ gcloud compute addresses create discourse-ip-address --global
#                                 ^~~~~~~~~~~~~~~~~~~~ 사용자 지정 이름
# WARNING: IP 주소를 예약해 두지만 사용하지 않으면 시간당 0.010달러의 벌금이 부과됩니다
---
apiVersion: networking.gke.io/v1beta1
kind: ManagedCertificate
metadata:
  name: discourse-cert
spec:
  domains:
    - discourse.example.com  # 사용자 지정
---
apiVersion: extensions/v1beta1
# v1.14 이상인 경우:
# apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: discourse-web-ingress
  annotations:
    networking.gke.io/managed-certificates: discourse-cert
    kubernetes.io/ingress.global-static-ip-name: discourse-ip-address
spec:
  backend:
    serviceName: discourse-web  # 이 값이 정확한지 확인하세요
    servicePort: 80

참고 자료:

정말 감사합니다, @riking! 네, 로드 밸런서 쪽에 문제가 있는 것 같습니다. Ingress는 문제없는 것 같고 (이제 두 사이데 차이점이 있다는 걸 어느 정도 파악했습니다). 제시해 주신 구성으로 전환했는데, 다소 복잡한 이전 구성과 동일한 결과를 얻고 있습니다. 다음 단계로 tcpdump를 활용해 헤더에 어떤 내용이 들어 있는지 확인해 보는 것이 좋겠습니다. . .

수정: 실제로는 동작해야 할 것 같습니다. 확인한 내용은 다음과 같습니다:

GET /thisisatest HTTP/1.1
User-Agent: Wget/1.19.4 (linux-gnu)
Accept: */*
Accept-Encoding: identity
Host: community.example.com
X-Cloud-Trace-Context: 72c9f7219e6b541cad01153c52fb92c5/13509441707361831434
Via: 1.1 google
X-Forwarded-For: MY-IP-ADDRESS, INGRESS-IP
X-Forwarded-Proto: http
Connection: Keep-Alive

Ingress IP를 지정하여 set_real_ip_from을 설정해 두었습니다(또한 IP 주소가 올바르게 기록되고 있습니다).

@pfaffman 이 부분은 도와드릴 수 있습니다. 저는 GCP를 사용 중이며 이전에 이 문제를 해결한 경험이 있습니다. 몇 시간 동안 바쁘지만, 로드 밸런서 설정(헬스 체크 관련 설정 포함)을 여기나 비공개로 보내주시면 문제를 찾아볼 수 있습니다.

P.S. TCP와 HTTP 모두 작동합니다.

정말 감사합니다, @p16!

자, 이제 헬스 체크를 확인해 보겠습니다. 경로를 /srv/status로 변경했는데도 여전히 "GoogleHC/1.0"이 /를访问하고 있습니다.

감사합니다. 로드 밸런서에 백엔드가 정상(healthy) 상태로 표시되고 있나요? 또한 호스트 설정(더 보기 항목)에 www.yoursite.com도 추가해 주세요.

아래는 제가 app.yml에 추가하는 내용입니다:

  after_web_config:
    - replace:
       filename: "/etc/nginx/conf.d/discourse.conf"
       from: /server.+{/
       to: |
         server {
           if ($http_x_forwarded_proto = 'http'){
            return 301 https://$host$request_uri;
           }

이번 분기에 Google이 http에서 https로의 리다이렉터 기능을 추가할 예정이므로, 이 설정은 너무 오래 유지되지 않을 것입니다.

네, 이제 작동하는 것 같습니다! 마법 같은 포트 30182에 대해 약간 혼란스럽지만, 아마도 다른 날에 이해하게 될 k8s의 마법 같은 것일 거라고 생각합니다.

after_web_config: 스탠스를 시도해 볼게요. 제가 하던 것보다 조금 더 깔끔해 보입니다.

정말 감사합니다.