Определяется ли проверка работоспособности по умолчанию Kubernetes / GKE в терминах службы поддержки во время создания? - PullRequest
0 голосов
/ 15 октября 2018

Справочная информация. У меня есть веб-приложение для клиентов, которое я развертываю вместе с 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)
  }
})

Это, похоже, работаетв течение нескольких минут / секунд, но мой вход был помечен как плохой:

enter image description here

Состояние в консоли GCloud было очень трудно интерпретировать, нопо-видимому, это служба проверки работоспособности по умолчанию, которая не работает, потому что я перенаправляю 307 на внутреннюю проверку работоспособности http:

enter image description here

Обратите внимание на 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
})

С этим я получаю другое определение состояния здоровья:

enter image description here

и с новой версией моего приложения я могу справиться с этим, и всеhappy go lucky.

То, что меня больше всего смущает и о чем я до сих пор думаю, так этотот факт, что этот тест по умолчанию, созданный как часть Ingress, является постоянным по сравнению с изменениями в Deployment.Я имею в виду, что мне нужно разорвать Ingress и воссоздать его еще раз, прежде чем обновлять датчик работоспособности в соответствии с резервным развертыванием.Простое изменение развертывания, в котором это определено, не воссоздает состояние службы проверки работоспособности, и оно все еще шло против /.Это сделало отладку этой вещи намного сложнее.

Я дважды проверил, что это все еще происходит в любом направлении.Я удалил настройки зондов и снова применил свое развертывание, но все работало нормально, потому что служба проверки работоспособности все еще работала против / healthz.Однако, сделав kubectl delete ingress; kubectl create -f ingress.yml, он начал идти против / снова и терпеть неудачу.Таким образом, в основном вход определяется с точки зрения вспомогательного обслуживания.Разве это не несколько плохо ?

Я все еще пытаюсь понять:

  1. Это Kubernetes или просто GKE?
  2. Можно ли отключить проверку работоспособности по умолчанию, не определяя мою собственную?
  3. Есть ли лучший / более чистый способ достижения этой довольно простой вещи, к которой я стремлюсь?

1 Ответ

0 голосов
/ 16 октября 2018

это kubernetes, управляемый Google, поэтому он использует движок Google kubernetes.

, если вы хотите удалить или добавить проверку работоспособности, вы можете запустить kubectl edit deployment <your deployment>, и должен появиться yaml из текущего запущенного развертывания.в редакторе по умолчанию, затем отредактируйте его (добавьте / удалите зонд).

Лучшее решение для вас - использовать reverse proxy in NGINX здесь , а также пример и конфигурацию дляперенаправить http на https.

...