Express API внутри Kubernetes для реагирующих и реагирующих приложений - PullRequest
0 голосов
/ 23 апреля 2020

Я учу Kubernetes. У меня есть Apollo- express GraphQL API, интерфейс React и приложение React Native. Как подключить (или) какой тип службы следует использовать, если я хочу, чтобы GraphQL API мог подключаться как к веб-интерфейсу, так и к мобильным приложениям?

Я получил маршрут /hi, который отвечает Hi! для проверки если он работает:

app.get('/hi', function (_req, res) {
  res.send('Hi!')
})

Вот моя попытка для api.yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: server-api
spec:
  replicas: 2
  selector:
    matchLabels:
      app: server-api
  template:
    metadata:
      labels:
        app: server-api
    spec:
      terminationGracePeriodSeconds: 5
      containers:
        - name: server-api
          imagePullPolicy: IfNotPresent
          image: my/server-api:latest
          ports:
            - name: gql
              containerPort: 8081
          env:
            - name: NODE_ENV
              value: "development"
            - name: REDIS_HOST
              value: "redis-cache"
            - name: REDIS_PORT
              value: "6379"
            - name: POSTGRES_URL
              valueFrom:
                secretKeyRef:
                  name: postgres-url
                  key: POSTGRES_URL
---
apiVersion: v1
kind: Service
metadata:
  name: server-api
spec:
  type: ClusterIP
  selector:
    app: server-api
  ports:
  - name: gql
    port: 8081
    targetPort: 8081
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: server-api-external
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
    - http:
        paths:
          - path: /api
            backend:
              serviceName: server-api
              servicePort: 8081

IP Minikube - 192.168.99.100. Но это показывает Cannot GET / на 192.168.99.100/api/hi.

Что я делаю не так? Пожалуйста, помогите.

1 Ответ

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

Ваш вход неверный. С вашим входом, когда есть входящий запрос к /api/hi, вход будет совпадать с /api правилом пути и переписать путь к / в соответствии с rewrite-target аннотацией.

Чтобы он работал, вам нужно чтобы использовать следующий вход:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: server-api-external
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
  rules:
    - http:
        paths:
          - path: /api/(.*)
            backend:
              serviceName: server-api
              servicePort: 8081

Теперь небольшое объяснение того, как это работает. Обратите внимание на изменения в поле path и аннотации rewrite-target. С этим входом, когда поступает входящий запрос к /api/hi, вход будет соответствовать правилу пути /api/(.*), а затем будет извлекать все совпадения с группой (.*) (в данном случае это будет hi). Далее, ingress будет использовать эту подходящую группу и переписать путь к /$1, поэтому / + first group match. В конце путь, который получает ваше приложение, будет /hi, и это то, что вы ищете.

См. Nginx Документация Ingress Controller для более подробного объяснения функции перезаписи. .

Дайте мне знать, если что-то недостаточно ясно и нуждается в дополнительном объяснении.

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