pfaffman
(Jay Pfaffman)
10월 9, 2019, 5:16오후
1
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 (비공식 설치) 영역이지만, 다음으로 어디를 살펴봐야 할지 아이디어가 있는 분이라면 감사하겠습니다.
riking
(Kane York)
10월 9, 2019, 9:37오후
2
HTTP 로드밸런서를 사용 중이신가요, 아니면 TCP 로드밸런서를 사용 중이신가요? HTTP의 경우, 인그레스에서 확인되는 프로토콜이 Discourse가 검색하지 않는 비표준 헤더에 포함되어 있을 수 있습니다.
riking
(Kane York)
10월 9, 2019, 9:45오후
3
완전 관리형 설정은 다음과 같습니다:
$ 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
참고 자료:
pfaffman
(Jay Pfaffman)
10월 9, 2019, 10:37오후
4
정말 감사합니다, @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 주소가 올바르게 기록되고 있습니다).
P16
10월 9, 2019, 10:52오후
5
@pfaffman 이 부분은 도와드릴 수 있습니다. 저는 GCP를 사용 중이며 이전에 이 문제를 해결한 경험이 있습니다. 몇 시간 동안 바쁘지만, 로드 밸런서 설정(헬스 체크 관련 설정 포함)을 여기나 비공개로 보내주시면 문제를 찾아볼 수 있습니다.
P.S. TCP와 HTTP 모두 작동합니다.
pfaffman
(Jay Pfaffman)
10월 9, 2019, 11:08오후
6
정말 감사합니다, @p16 !
자, 이제 헬스 체크를 확인해 보겠습니다. 경로를 /srv/status로 변경했는데도 여전히 "GoogleHC/1.0"이 /를访问하고 있습니다.
P16
10월 9, 2019, 11:17오후
7
감사합니다. 로드 밸런서에 백엔드가 정상(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로의 리다이렉터 기능을 추가할 예정이므로, 이 설정은 너무 오래 유지되지 않을 것입니다.
pfaffman
(Jay Pfaffman)
10월 9, 2019, 11:29오후
8
네, 이제 작동하는 것 같습니다! 마법 같은 포트 30182에 대해 약간 혼란스럽지만, 아마도 다른 날에 이해하게 될 k8s의 마법 같은 것일 거라고 생각합니다.
after_web_config: 스탠스를 시도해 볼게요. 제가 하던 것보다 조금 더 깔끔해 보입니다.
정말 감사합니다.