GKE с настройкой Ingress всегда выдает статус UNHEALTHY

Для начала я протестировал руководство на странице https://cloud.google.com/kubernetes-engine/docs/tutorials/http-balancer.

который отлично работает. Я также протестировал тот же учебник, но также добавил секрет tls для тестирования https, который также работал нормально.

Мои проблемы возникают, когда я создаю свой образ. Вот шаги, которые я предпринимаю:

  1. Dockerfile:
     # We label our stage as "builder"
     FROM node:9.4.0-alpine as builder

     COPY package.json package-lock.json ./

     ## Storing node modules on a separate layer will prevent unnecessary npm installs at each build
     RUN npm i && mkdir /srv/cs-ui && cp -R ./node_modules ./srv/cs-ui

     WORKDIR /srv/cs-ui

     COPY . .

     ## Build the angular app in production mode and store the artifacts in dist folder
     RUN $(npm bin)/ng build --environment "prod"

     FROM nginx

     ## Copy our default nginx config
     COPY nginx/default.conf /etc/nginx/conf.d/

     ## Remove default nginx website
     RUN rm -rf /usr/share/nginx/html/*

     ## From "builder" stage copy over the artifacts in dist folder to default nginx nginx public folder
     COPY --from=builder /srv/cs-ui/dist /usr/share/nginx/html/
  1. Dockerfile запускается с файлом docker-compose, который выглядит следующим образом:
version: '2'
services:
  cs-ui:
    image: "gcr.io/cs-micro/cs-ui:v1"
    container_name: "cs-ui"
    tty: true
    build: .
    ports:
      - "80:80"
  1. Локально это работает без проблем. Следующее, что я делаю, это помещаю его в Реестр контейнеров.
gcloud docker -- push gcr.io/cs-micro/cs-ui:v1
  1. После этого создаю контейнер:
kubectl run cs-ui --image=gcr.io/cs-micro/cs-ui:v1 --port=80
  1. Потом выставляю:
kubectl expose deployment cs-ui --target-port=80  --type=NodePort
  1. Затем я запускаю следующий входной файл:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: basic-ingress
spec:
  tls:
    - secretName: tls-certificate
  backend:
    serviceName: cs-ui
    servicePort: 80

с командой:

kubectl apply -f test.yaml
  1. kubectl описать сервис
    Name:                     cs-ui
    Namespace:                default
    Labels:                   run=cs-ui
    Annotations:              
    Selector:                 run=cs-ui
    Type:                     NodePort
    IP:                       10.35.244.124
    Port:                       80/TCP
    TargetPort:               80/TCP
    NodePort:                   30272/TCP
    Endpoints:                10.32.0.32:80
    Session Affinity:         None
    External Traffic Policy:  Cluster
    Events:                   


    Name:              kubernetes
    Namespace:         default
    Labels:            component=apiserver
                       provider=kubernetes
    Annotations:       
    Selector:          
    Type:              ClusterIP
    IP:                10.35.240.1
    Port:              https  443/TCP
    TargetPort:        443/TCP
    Endpoints:         35.195.192.28:443
    Session Affinity:  ClientIP
    Events:            
  1. kubectl описывает развертывание
    Name:                   cs-ui
    Namespace:              default
    CreationTimestamp:      Thu, 25 Jan 2018 12:27:59 +0100
    Labels:                 run=cs-ui
    Annotations:            deployment.kubernetes.io/revision=1
    Selector:               run=cs-ui
    Replicas:               1 desired | 1 updated | 1 total | 1 available | 0 unavailable
    StrategyType:           RollingUpdate
    MinReadySeconds:        0
    RollingUpdateStrategy:  1 max unavailable, 1 max surge
    Pod Template:
      Labels:  run=cs-ui
      Containers:
       cs-ui:
        Image:        gcr.io/cs-micro/cs-ui:v1
        Port:         80/TCP
        Environment:  
        Mounts:       
      Volumes:        
    Conditions:
      Type           Status  Reason
      ----           ------  ------
      Available      True    MinimumReplicasAvailable
    OldReplicaSets:  
    NewReplicaSet:   cs-ui-2929390783 (1/1 replicas created)
    Events:
      Type    Reason             Age   From                   Message
      ----    ------             ----  ----                   -------
      Normal  ScalingReplicaSet  9m    deployment-controller  Scaled up replica set cs-ui-2929390783 to 1
  1. kubectl описание
    Name:             basic-ingress
    Namespace:        default
    Address:          35.227.220.186
    Default backend:  cs-ui:80 (10.32.0.32:80)
    TLS:
      tls-certificate terminates
    Rules:
      Host  Path  Backends
      ----  ----  --------
      *     *     cs-ui:80 (10.32.0.32:80)
    Annotations:
      https-forwarding-rule:  k8s-fws-default-basic-ingress--f5fde3efbfa51336
      https-target-proxy:     k8s-tps-default-basic-ingress--f5fde3efbfa51336
      ssl-cert:               k8s-ssl-default-basic-ingress--f5fde3efbfa51336
      target-proxy:           k8s-tp-default-basic-ingress--f5fde3efbfa51336
      url-map:                k8s-um-default-basic-ingress--f5fde3efbfa51336
      backends:               {"k8s-be-30272--f5fde3efbfa51336":"UNHEALTHY"}
      forwarding-rule:        k8s-fw-default-basic-ingress--f5fde3efbfa51336
      static-ip:              k8s-fw-default-basic-ingress--f5fde3efbfa51336
    Events:
      Type    Reason   Age               From                     Message
      ----    ------   ----              ----                     -------
      Normal  ADD      12m               loadbalancer-controller  default/basic-ingress
      Normal  CREATE   11m               loadbalancer-controller  ip: 35.227.220.186
      Normal  Service  6m (x4 over 11m)  loadbalancer-controller  default backend set to cs-ui:30272
  1. Через 3-5 минут я становлюсь нездоровым, и я понятия не имею, почему, потому что настройка почти такая же, как и с их настройкой.

Я прочитал бесчисленное количество тем о том, что делать, когда вы получаете статус бэкэнда «Неработоспособен», но ни один из них не помог. Одно упомянуто о добавлении правила брандмауэра, упомянутого в этом руководстве: https://cloud.google.com/compute/docs/load-balancing/health-checks, которые я добавил, но не помог.

Если у вас есть предложения, я с удовольствием их протестирую.


person TensaiNiNaru    schedule 25.01.2018    source источник
comment
Вы возвращаете код состояния 200 на '/'? Если вы не определяете настраиваемую проверку работоспособности, балансировщик нагрузки использует '/' для проверок работоспособности.   -  person Robbe    schedule 25.01.2018
comment
Вы были правы, Робби, оказалось, что наше приложение Angular имеет перенаправление на '/', которое дало ему ответ 302, который позже дал нам состояние UNHEALTHY. Как только мы настроили индивидуальную проверку работоспособности, все заработало. Спасибо за помощь!   -  person TensaiNiNaru    schedule 26.01.2018


Ответы (1)


Оказалось, что у нашего приложения Angular было перенаправление на '/', что дало ему ответ 302. Этот ответ приводит к сбою проверки работоспособности и переходу в НЕЗДОРОВНОЕ состояние.

Как только мы настроили индивидуальную проверку работоспособности, все заработало.

person TensaiNiNaru    schedule 26.01.2018