SSL на node.js API работает в StatefulSet на GKE - PullRequest
0 голосов
/ 01 мая 2019

У меня есть приложение со следующей структурой:

  • Приложение R Shiny, которое функционирует в качестве пользовательского интерфейса и позволяет пользователю загружать файлы и сохранять их на gcePersistentDisk.
  • Сервер node.js, который считывает эти файлы в gcePersistentDisk, обрабатывает их и предоставляет API для приложения Shiny для получения результатов.

Это работает в кластере GKE со следующей структурой:

  • StatefulSet с модулем, содержащим два контейнера, чтобы обеспечить одновременный доступ как к клиенту, так и к серверу.
  • безголовый сервис для StatefulSet.
  • Вход с фиксированным IP-адресом, на который указывает домен.
  • a NodePort в качестве бэкэнда для Ingress с селектором, указывающим на 0-й модуль StatefulSet

По крайней мере, это то, что я сделал, чтобы сделать эту работу, я не слишком хорош в DevOps или в сети в целом. Теперь клиент получил запрос о том, что стороннее приложение также будет использовать API-интерфейс node.js, но он хочет сделать это по https.

Моей первой попыткой было использование greenlock-express.js, однако для этого нужен открытый IP-адрес, но сервер может видеть только свой IP-адрес кластера. Я не знаю, если это можно / нужно изменить, и если нет, то какие другие подходы я должен использовать?

Спасибо!

YAML в

apiVersion: v1
kind: Service
metadata:
  name: plo-set-service
  labels:
    app: plo
spec:
  clusterIP: None
  selector:
    app: plo
  ports:
  - name: web
    port: 80
    protocol: TCP
    targetPort: ploweb-port
  - name: api
    port: 3300
    protocol: TCP
    targetPort: ploapi-port
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: plo-set
spec:
  serviceName: plo-set-service
  replicas: 1
  selector:
    matchLabels:
      app: plo
  template:
    metadata:
      labels:
        app: plo
    spec:
      containers:
      - name: plo-server
        image: 
        readinessProbe:
          httpGet:
            path: /healthz
            port: 3300
          initialDelaySeconds: 15
          periodSeconds: 15
        ports:
        - name: ploapi-port
          containerPort: 3300
        volumeMounts:
        - mountPath: /data
          name: plo-volume
      - name: plo-client
        image: 
        ports:
        - name: ploweb-port
          containerPort: 80
        volumeMounts:
        - mountPath: /data
          name: plo-volume
  volumeClaimTemplates:
  - metadata:
      name: plo-volume
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 500Gi
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: plo-ingress
  annotations:
    kubernetes.io/ingress.global-static-ip-name: plo-ip
spec:
  backend:
    serviceName: plo-web
    servicePort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: plo-web
spec:
  type: NodePort
  externalTrafficPolicy: Local
  selector:
    statefulset.kubernetes.io/pod-name: plo-set-0
  ports:
  - name: web
    port: 80
    protocol: TCP
    targetPort: 80

1 Ответ

0 голосов
/ 02 мая 2019

По умолчанию Nginx Ingress Controller обслуживает порты "HTTP/80" и "HTTPS/443" независимо от протокола и порта бэкэнда.

Так что в вашем случае вам не нужно ничего менять, чтобы использовать протокол HTTPS для вашего бэкэнда, если вы просто используете Nginx Ingress Controller из коробки

Например, у меня есть служба Ingress Controller, как показано ниже, которая работает на портах 80 и 443, которые создаются при развертывании Nginx Controller

$ kubectl get svc nginx-ingress-controller
NAME                       TYPE           CLUSTER-IP      EXTERNAL-IP    PORT(S)                      AGE
nginx-ingress-controller   LoadBalancer   10.15.254.182   <external-ip-addr>   80:32594/TCP,443:31949/TCP   2d

Также у меня есть служба для прослушивания развертывания my-nginx через порт 80

$ kubectl get svc my-nginx
NAME       TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
my-nginx   ClusterIP   10.15.252.11   <none>        80/TCP    30m

И я развернул простой входной ресурс, похожий на ваш

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

Теперь вы можете позвонить в службу через HTTP или HTTPS, запросив IP-адрес контроллера нагрузки Nginx за пределами кластера или DNS / ClusterIP внутри кластера.

HTTP-запрос в кластере из другого модуля:

# curl -I http://nginx-ingress-controller
HTTP/1.1 200 OK
Server: nginx/1.15.9
...

HTTPS-запрос:

# curl -Ik https://nginx-ingress-controller
HTTP/2 200 
server: nginx/1.15.9
...

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

...