簡體   English   中英

在GKE上的StatefulSet中運行的node.js API上的SSL

[英]SSL on node.js API running in StatefulSet on GKE

我有一個具有以下結構的應用程序:

  • 一個R Shiny應用程序,用作UI,它允許用戶上傳文件並將其存儲在gcePersistentDisk上。
  • 在gcePersistentDisk上讀取這些文件的node.js服務器處理它們,並為Shiny應用程序提供API以檢索結果。

它在具有以下結構的GKE集群中運行:

  • 包含兩個容器的pod的StatefulSet,允許客戶端和服務器同時訪問卷。
  • 為StatefulSet提供無頭服務。
  • 具有固定IP的Ingress到域指向的位置。
  • 一個NodePort作為Ingress的后端,選擇器指向StatefulSet的第0個pod

至少這是我做的工作,我在DevOps或網絡方面不太好。 現在,客戶端提出了一個請求,即第三方應用程序也將使用node.js API,但它希望在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

默認情況下,無論后端協議和端口如何, Nginx Ingress Controller在端口"HTTP/80""HTTPS/443"

因此,在您的情況下,如果您只是使用開箱即用的Nginx Ingress Controller,則無需為后端使用HTTPS協議進行任何更改

例如,我在端口80443上具有Ingress Controller服務,如下所示,在部署Nginx控制器時創建

$ 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

此外,我還在端口80上監聽my-nginx部署

$ 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

現在,您可以通過從群集外部或集群內的DNS / ClusterIP請求Nginx Controller LoadBalancer IP,通過HTTP或HTTPS調用您的服務。

來自其他pod的集群內的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
...

希望它可以幫到你

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM