4

Я новичок в K8s, и это моя первая попытка попытаться справиться с этим. Я пытаюсь создать базовую Nodejs Экспресс API с помощью этого deployment.yml:Kubernetes - Ingress/Service/LB

apiVersion: extensions/v1beta1 
kind: Deployment 
metadata: 
    name: api 
spec: 
    replicas: 1 
    template: 
    metadata: 
     labels: 
     app: api 
    spec: 
     containers: 
     - image: registry.gitlab.com/<project>/<app>:<TAG> 
     imagePullPolicy: Always 
     name: api 
     env: 
     - name: PORT 
      value: "8080" 
     ports: 
      - containerPort: 8080 
      hostPort: 80 
     livenessProbe: 
      httpGet: 
      path: /healthz 
      port: 8080 
      initialDelaySeconds: 30 
      timeoutSeconds: 1 
     readinessProbe: 
      httpGet: 
      path: /healthz 
      port: 8080 
      initialDelaySeconds: 30 
      timeoutSeconds: 1 
     imagePullSecrets: 
     - name: registry.gitlab.com 

Который развертывается через gitlab-CI. Это работает, и я настроил услугу, чтобы выставить его:

apiVersion: v1 
kind: Service 
metadata: 
    name: api-svc 
    labels: 
    app: api-svc 
spec: 
    ports: 
    - port: 80 
    targetPort: 80 
    protocol: TCP 
    name: http 
    selector: 
    app: api 
    type: LoadBalancer 

Но я смотрел в попаданию иметь единую точку входа, возможно, несколько сервисов. Я читал через Kubernetes гидов и я прочитал эту Kubernetes Ingress Example и это ingress.yml я создал:

apiVersion: extensions/v1beta1 
kind: Ingress 
metadata: 
    name: ingress 
spec: 
    backend: 
    serviceName: api-svc 
    servicePort: 80 

Но это не сработало, когда я посетил внешний IP-адрес, который был создан из попаданию и Я всего лишь 502 страницы ошибок.

Может ли кто-нибудь указать мне в правильном направлении, что я делаю неправильно или что мне не хватает? Я вижу, что в приведенном выше примере ссылки есть nginx-rc.yml, который я развернул точно так же, как в примере, и который был создан, но ничего не получил от конечной точки. API был доступен из службы внешнего IP, хотя ..

Большое спасибо

+0

У меня была точно такая же проблема с gke на прошлой неделе, и я решил отказаться от нее через некоторое время. После всех руководств к письму это не сработало, и даже с другими из слабины k8s мы не могли понять, что случилось. Теперь я решил просто создать входной балансировщик вручную за пределами кубернетов и указать его на мою службу LoadBalancer. – Tigraine

+0

Что вы использовали для вашего входного балансира нагрузки за пределами Кубернете? Не уверен, что это проблема, потому что вход все еще находится в стадии бета-тестирования, но это странно после их руководств, и он не работает. Вид облегчен тем, что у меня не только проблемы. – mchaffe

+0

Ну, проникновение просто создаст GCE L7 Loadbalancer - вы даже можете посмотреть его в своей Google Cloud Console. Поэтому я решил, что просто сконфигурирую L7 Balancer в консоли и укажу на L3 Balancer, созданный службой LoadBalancer. (Мне нужно в основном для завершения SSL.) – Tigraine

ответ

1

Мысли я после моего рабочего развертывания/обслуживание/ингресса

Таким образом, после долгих усилий в получении этой работы, вот что я, чтобы это заработало:

Развертывания

apiVersion: extensions/v1beta1 
kind: Deployment 
metadata: 
    name: backend-api-v2 
spec: 
    replicas: 2 
    template: 
    metadata: 
     labels: 
     app: backend-api-v2 
    spec: 
     containers: 
     - image: registry.gitlab.com/<project>/<app>:<TAG> 
     imagePullPolicy: Always 
     name: backend-api-v2 
     env: 
     - name: PORT 
      value: "8080" 
     ports: 
      - containerPort: 8080 
     livenessProbe: 
      httpGet: 
      # Path to probe; should be cheap, but representative of typical behavior 
      path: /healthz 
      port: 8080 
      initialDelaySeconds: 30 
      timeoutSeconds: 5 
     readinessProbe: 
      httpGet: 
      path: /healthz 
      port: 8080 
      initialDelaySeconds: 30 
      timeoutSeconds: 5 
     imagePullSecrets: 
     - name: registry.gitlab.com 

Сервис

apiVersion: v1 
kind: Service 
metadata: 
    name: api-svc-v2 
    labels: 
    app: api-svc-v2 
spec: 
    type: NodePort 
    ports: 
    - port: 80 
    targetPort: 8080 
    nodePort: 31810 
    protocol: TCP 
    name: http 
    selector: 
    app: backend-api-v2 

Ingress

apiVersion: extensions/v1beta1 
kind: Ingress 
metadata: 
    name: app-ingress 
spec: 
    rules: 
    - host: api.foo.com 
    http: 
     paths: 
     - path: /v1/* 
     backend: 
      serviceName: api-svc 
      servicePort: 80 
     - path: /v2/* 
     backend: 
      serviceName: api-svc-v2 
      servicePort: 80 

важные биты заметить, как @Tigraine отметил, что услуга использует type: NodePort и не LoadBalancer, я также определил nodePort, но я считаю, что это будет создавать, если Вы пропусти это.

Он будет использовать default-http-backend для любых маршрутов, которые не соответствуют правилам, который является контейнером по умолчанию, который GKE работает в пространстве имен kube-system. Поэтому, если я посетил http://api.foo.com/bob, я получаю ответ по умолчанию default backend - 404.

Надеюсь, это поможет

+0

Также обратите внимание, что проверки работоспособности должны ударить по тому же порту, который вы выставили в службе. Мне пришлось отказаться от L7 Ingress, поскольку проверка работоспособности происходит на вторичном порту, который я не могу открыть, поскольку это основная конечная точка Admin-API моей службы. – Tigraine

+0

@Tigraine. Если я создал другое развертывание и еще одну службу, Ingress создаст другой IP-адрес в GCE?Есть ли способ указать статический IP-адрес для Ingress, если какие-либо другие средства для достижения – kt14

+0

@ kt14 для входа назначается один IP-адрес и проксирует службы, которые вы ему описываете. Если вам нужен IP-адрес для службы, вам необходимо настроить службы как балансировщики нагрузки. – mchaffe

0

Похоже, вы подвергая службу к порту 80 но ваш контейнер выставляет 8080 поэтому любой запрос к сервису происходит сбой.

Кроме того, посмотрите на входной ресурс образца (https://github.com/nginxinc/kubernetes-ingress/blob/master/examples/complete-example/cafe-ingress.yaml), вам также необходимо определить, какие хосты/пути маршрутизируются при попадании контроллера входа. (например, example.foo.com -> api-svc)

+1

Благодаря @steve в настоящее время служба, работающая как LoadBalancer, доступна из внешнего мира. Насколько я понял, я думал, что использование containerPort и hostPort отображает различия, хотя я вполне могу ошибаться. Когда я обратился к консоли LoadBalancer и создал пользовательскую проверку работоспособности на порту 80, вход начал работать. Таким образом, кажется, что есть проблема с проверкой работоспособности порта, которая мешает ему работать по умолчанию. – mchaffe

1

Я просмотрел его снова и думаю, что понял.

Для того, чтобы Ingress работал на GCE, вам необходимо определить свой серверный сервис das a NodePort не как ClusterIP или LoadBalancer.

Также вам необходимо убедиться, что проверка работоспособности http-кода / работает (вы увидите, что LoadLancer Google L7 сильно поражает ваш сервис на этом URL-адресе), а затем он доступен.

+1

Спасибо, после многих усилий я получил его работу, я настроил готовность к загрузке, чтобы он попадал на эти конечные точки, но также определял тайм-аут 5 сек., Поскольку набор 1сек, который у меня был, вызывал ошибку. Я также изменил на NodePort, как вы предложили, а также определил nodePort в yml. – mchaffe

+0

Если бы это было полезно для вас, я был бы признателен за upvote :) – Tigraine