Справочная информация. У меня есть веб-приложение для клиентов, которое я развертываю вместе с Kubernetes в GKE.Как обычно в таком приложении, я хочу перенаправить трафик с http на https.
В старые времена я делал это в haproxy или nginx, но теперь я хотел сделать это в Kubernetes.Чтение по этой теме казалось трудным по некоторым причинам.https://github.com/kubernetes/ingress-gce/tree/2d2c91a608987d07205c4a93537c2938bc67df38#ingress-cannot-redirect-http-to-https
Поэтому я решил, что я просто пропущу http в своем веб-приложении и позволю промежуточному программному обеспечению первого уровня в моем приложении выполнить перенаправление.Я читал, что GKE установит заголовок x-forwarded-proto точно так же, как nginx.
Так что я сделал что-то вроде в приложении, которое является node + koa:
app.use((ctx, next) => {
if (ctx.request.header['x-forwarded-proto'] === 'https') {
return next()
} else {
const httpsHost = url.parse('http://' + ctx.request.header.host).hostname
let redirectTo = 'https://' + httpsHost
redirectTo += ctx.request.url
ctx.response.status = 307
ctx.response.redirect(redirectTo)
}
})
Это, похоже, работаетв течение нескольких минут / секунд, но мой вход был помечен как плохой:
Состояние в консоли GCloud было очень трудно интерпретировать, нопо-видимому, это служба проверки работоспособности по умолчанию, которая не работает, потому что я перенаправляю 307 на внутреннюю проверку работоспособности http:
Обратите внимание на rootпуть.
Я наконец-то смог это исправить, вручную указав зонды в развертывании
readinessProbe:
httpGet:
path: /healthz
port: 5002
livenessProbe:
httpGet:
path: /healthz
port: 5002
и позаботившись о них в приложении:
router.get('/healthz', ctx => {
console.log([ctx.request.headers]) //eslint-disable-line
ctx.response.status = 200
})
С этим я получаю другое определение состояния здоровья:
и с новой версией моего приложения я могу справиться с этим, и всеhappy go lucky.
То, что меня больше всего смущает и о чем я до сих пор думаю, так этотот факт, что этот тест по умолчанию, созданный как часть Ingress, является постоянным по сравнению с изменениями в Deployment.Я имею в виду, что мне нужно разорвать Ingress и воссоздать его еще раз, прежде чем обновлять датчик работоспособности в соответствии с резервным развертыванием.Простое изменение развертывания, в котором это определено, не воссоздает состояние службы проверки работоспособности, и оно все еще шло против /.Это сделало отладку этой вещи намного сложнее.
Я дважды проверил, что это все еще происходит в любом направлении.Я удалил настройки зондов и снова применил свое развертывание, но все работало нормально, потому что служба проверки работоспособности все еще работала против / healthz.Однако, сделав kubectl delete ingress; kubectl create -f ingress.yml
, он начал идти против / снова и терпеть неудачу.Таким образом, в основном вход определяется с точки зрения вспомогательного обслуживания.Разве это не несколько плохо ?
Я все еще пытаюсь понять:
- Это Kubernetes или просто GKE?
- Можно ли отключить проверку работоспособности по умолчанию, не определяя мою собственную?
- Есть ли лучший / более чистый способ достижения этой довольно простой вещи, к которой я стремлюсь?