Как подключить фронт к задней панели внутри кластера k8s (соединение отказано) - PullRequest
2 голосов
/ 02 апреля 2020

Ошибка при попытке подключить веб-интерфейс React к nodejs express api-серверу в кластер kubernetes.

Можно перейти в браузере на http:localhost:3000 и веб-сайт в порядке.

Но не могу перейти к http:localhost:3008, как ожидалось (не должен быть выставлен)

Моя цель - передать REACT_APP_API_URL переменную окружения во внешний интерфейс, чтобы установить ax ios baseURL и сможет установить sh связь между front и его сервером api.

deploy-front.yml

apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
kind: Deployment
metadata:
  name: gbpd-front
spec:
  selector:
    matchLabels:
      app: gbpd-api
      tier: frontend
      track: stable
  replicas: 2
  template:
    metadata:
      labels:
        app: gbpd-api
        tier: frontend
        track: stable
    spec:
      containers:
        - name: react
          image: binomio/gbpd-front:k8s-3
          ports:
            - containerPort: 3000
          resources:
            limits:
              memory: "150Mi"
            requests:
              memory: "100Mi"
          imagePullPolicy: Always

service-front.yaml

apiVersion: v1
kind: Service
metadata:
  name: gbpd-front
spec:
  selector:
    app: gbpd-api
    tier: frontend
  ports:
  - protocol: "TCP"
    port: 3000
    targetPort: 3000
  type: LoadBalancer

Deploy-back.yaml

apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
kind: Deployment
metadata:
  name: gbpd-api
spec:
  selector:
    matchLabels:
      app: gbpd-api
      tier: backend
      track: stable
  replicas: 3 # tells deployment to run 2 pods matching the template
  template:
    metadata:
      labels:
        app: gbpd-api
        tier: backend
        track: stable
    spec:
      containers:
        - name: gbpd-api
          image: binomio/gbpd-back:dev
          ports:
            - name: http
              containerPort: 3008

service-back.yaml

apiVersion: v1
kind: Service
metadata:
  name: gbpd-api
spec:
  selector:
    app: gbpd-api
    tier: backend
  ports:
  - protocol: "TCP"
    port: 3008
    targetPort: http

Я пробовал много комбинаций, также пытался добавить «LoadBalancer» в backservice, но ничего. ..

Я могу подключить perfecto к localhost: 3000 и использовать внешний интерфейс, но внешний интерфейс не может подключиться к бэкэнд-сервису.

Вопрос 1 : Что такое ip / name использовать для того, чтобы передать REACT_APP_API_URL на фронтэн правильно? Вопрос 2 : почему curl localhost: 3008 не отвечает?

Через 2 дня пробуя почти все в официальных документах k8s ... не могу понять, что здесь происходит, поэтому любая помощь поможет очень цениться.

kubectl описать sv c gbpd-api Ответ:

kubectl describe svc gbpd-api
Name:                     gbpd-api
Namespace:                default
Labels:                   <none>
Annotations:              kubectl.kubernetes.io/last-applied-configuration:
                            {"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"name":"gbpd-api","namespace":"default"},"spec":{"ports":[{"port":3008,"p...
Selector:                 app=gbpd-api,tier=backend
Type:                     LoadBalancer
IP:                       10.107.145.227
LoadBalancer Ingress:     localhost
Port:                     <unset>  3008/TCP
TargetPort:               http/TCP
NodePort:                 <unset>  31464/TCP
Endpoints:                10.1.1.48:3008,10.1.1.49:3008,10.1.1.50:3008
Session Affinity:         None
External Traffic Policy:  Cluster
Events:                   <none>

1 Ответ

2 голосов
/ 02 апреля 2020

Я протестировал вашу среду, и она работала при использовании образа Nginx, давайте рассмотрим среду:

  • Фронтальное развертывание правильно описано.
  • Фронтальное развертывание сервис предоставляет его как loadbalancer , что означает, что ваш веб-интерфейс доступен извне, идеально.
  • Обратное развертывание также правильно описано.
  • Бэкэнд-сервис остается как ClusterIP для того, чтобы быть доступным только внутри кластера, отлично.

Ниже я продемонстрирую связь между интерфейсом и сервером.

  • Я использую те же самые yamls, которые вы предоставили, просто изменили изображение на Nginx в качестве примера, и так как это http-сервер, я изменяю контейнерный порт на 80.

Вопрос 1: Что такое ip / name, чтобы использовать его для правильной передачи REACT_APP_API_URL в * fronten?

  • Я добавил переменную ENV в переднее развертывание в соответствии с запросом, и я буду использовать его для демонстрации. Вы должны использовать имя службы для скручивания, я использовал короткую версию, потому что мы работаем в одном пространстве имен. Вы также можете использовать полное имя: http://gbpd-api.default.svc.cluster.local: 3008

Воспроизведение:

  • Создать yamls и применил их:
$ cat deploy-front.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: gbpd-front
spec:
  selector:
    matchLabels:
      app: gbpd-api
      tier: frontend
      track: stable
  replicas: 2
  template:
    metadata:
      labels:
        app: gbpd-api
        tier: frontend
        track: stable
    spec:
      containers:
        - name: react
          image: nginx
          env:
            - name: REACT_APP_API_URL
              value: http://gbpd-api:3008
          ports:
            - containerPort: 80
          resources:
            limits:
              memory: "150Mi"
            requests:
              memory: "100Mi"
          imagePullPolicy: Always

$ cat service-front.yaml 
cat: cat: No such file or directory
apiVersion: v1
kind: Service
metadata:
  name: gbpd-front
spec:
  selector:
    app: gbpd-api
    tier: frontend
  ports:
  - protocol: "TCP"
    port: 3000
    targetPort: 80
  type: LoadBalancer

$ cat deploy-back.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: gbpd-api
spec:
  selector:
    matchLabels:
      app: gbpd-api
      tier: backend
      track: stable
  replicas: 3
  template:
    metadata:
      labels:
        app: gbpd-api
        tier: backend
        track: stable
    spec:
      containers:
        - name: gbpd-api
          image: nginx
          ports:
            - name: http
              containerPort: 80

$ cat service-back.yaml 
apiVersion: v1
kind: Service
metadata:
  name: gbpd-api
spec:
  selector:
    app: gbpd-api
    tier: backend
  ports:
  - protocol: "TCP"
    port: 3008
    targetPort: http

$ kubectl apply -f deploy-front.yaml 
deployment.apps/gbpd-front created
$ kubectl apply -f service-front.yaml 
service/gbpd-front created
$ kubectl apply -f deploy-back.yaml 
deployment.apps/gbpd-api created
$ kubectl apply -f service-back.yaml 
service/gbpd-api created
$ kubectl get all
NAME                              READY   STATUS    RESTARTS   AGE
pod/gbpd-api-dc5b4b74b-kktb9      1/1     Running   0          41m
pod/gbpd-api-dc5b4b74b-mzpbg      1/1     Running   0          41m
pod/gbpd-api-dc5b4b74b-t6qxh      1/1     Running   0          41m
pod/gbpd-front-66b48f8b7c-4zstv   1/1     Running   0          30m
pod/gbpd-front-66b48f8b7c-h58ds   1/1     Running   0          31m

NAME                 TYPE           CLUSTER-IP    EXTERNAL-IP    PORT(S)          AGE
service/gbpd-api     ClusterIP      10.0.10.166   <none>         3008/TCP         40m
service/gbpd-front   LoadBalancer   10.0.11.78    35.223.4.218   3000:32411/TCP   42m
  • Эти модули являются рабочими, и, поскольку они являются заменяемыми по своей природе, мы будем подключаться к модулю внешнего интерфейса для имитации его поведения. и попробуйте подключиться к бэкэнд-сервису (это сетевой уровень, который направит трафик c к одному из бэкенд-модулей).
  • Образ nginx не поставляется с предустановленным curl, поэтому мне придется установить его для демонстрационных целей:
$ kubectl exec -it pod/gbpd-front-66b48f8b7c-4zstv -- /bin/bash
root@gbpd-front-66b48f8b7c-4zstv:/# apt update && apt install curl -y
done.

root@gbpd-front-66b48f8b7c-4zstv:/# curl gbpd-api:3008
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
...
  • Теперь давайте попробуем использовать определенную переменную среды:
root@gbpd-front-66b48f8b7c-4zstv:/# printenv | grep REACT
REACT_APP_API_URL=http://gbpd-api:3008
root@gbpd-front-66b48f8b7c-4zstv:/# curl $REACT_APP_API_URL
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
...

Соображения:

Вопрос 2: W hy is curl localhost: 3008 не отвечает?

  • Так как все yamls правильно описаны, вы должны проверить, правильно ли image: binomio/gbpd-back:dev работает на порте 3008, как и предполагалось.
  • Так как это не опубликованное c изображение, я не могу его протестировать, поэтому я дам вам шаги по устранению неполадок:
    • , так же как мы вошли в интерфейсный модуль, вам нужно будет войти в этот бэкэнд- pod and test curl localhost:3008.
    • Если он основан на linux дистрибутиве с apt-get, вы можете запускать команды так же, как я делал в моей демонстрации:
    • получить имя pod из внутреннего развертывания (пример: gbpd-api-6676c7695c-6bs5n)
    • выполнить kubectl exec -it pod/<POD_NAME> -- /bin/bash
    • , затем выполнить apt update && apt install curl -y
    • и проверить curl localhost:3008
    • , если нет ответьте на команду `apt update && apt install net -tools
    • и тестируйте netstat -nlpt, вам нужно будет показать выходные данные запущенных служб и соответствующий порт, например:
root@gbpd-api-585df9cb4d-xr6nk:/# netstat -nlpt
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      1/nginx: master pro 
  • Если модуль не возвращает ничего даже при таком подходе, вам придется проверить код на изображении .

Дайте мне знать, если после этого вам понадобится помощь!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...