【问题标题】:How to use kubernetes secrets in nodejs application?如何在 nodejs 应用程序中使用 kubernetes 机密?
【发布时间】:2021-01-02 05:57:00
【问题描述】:

我在 gcp 上有一个 kubernetes 集群,运行我的 expressnode.js 应用程序,运行 CRUD 使用 MongoDB 进行操作。

我创建了一个秘密,包含usernamepassword, 在我的kubernetes yml 文件中与mongoDB 指定cified secret 作为environment 连接。 现在我的问题是“如何访问该用户名和密码 在用于连接 mongoDB 的节点 js 应用程序中"。

我试过process.env.SECRET_USERNAMEprocess.env.SECRET_PASSWORDNode.JS 应用程序中,它正在抛出undefined

任何想法都会受到赞赏。

Secret.yaml

 apiVersion: v1

  data:

     password: pppppppppppp==

     username: uuuuuuuuuuuu==

kind: Secret

metadata:

 creationTimestamp: 2018-07-11T11:43:25Z

 name: test-mongodb-secret

 namespace: default

 resourceVersion: "00999"

 selfLink: /api-path-to/secrets/test-mongodb-secret

 uid: 0900909-9090saiaa00-9dasd0aisa-as0a0s-

 type: Opaque

kubernetes.yaml

 apiVersion: extensions/v1beta1
 
kind: Deployment

metadata:

annotations:deployment.kubernetes.io/

revision: "4"

creationTimestamp: 2018-07-11T11:09:45Z

generation: 5

labels:
    name: test
 name: test
 namespace: default
 resourceVersion: "90909"
 selfLink: /api-path-to/default/deployments/test
 uid: htff50d-8gfhfa-11egfg-9gf1-42010gffgh0002a
spec:
  replicas: 1
   selector:
   matchLabels:
   name: test
 strategy:
    rollingUpdate:
     maxSurge: 1
     maxUnavailable: 1
    type: RollingUpdate
  template:
     metadata:
      creationTimestamp: null
  labels:
    name: test
  spec:
    containers:
  - env:
    - name: SECRET_USERNAME
      valueFrom:
        secretKeyRef:
          key: username
          name: test-mongodb-secret
    - name: SECRET_PASSWORD
      valueFrom:
        secretKeyRef:
          key: password
          name: test-mongodb-secret
    image: gcr-image/env-test_node:latest
    imagePullPolicy: Always
    name: env-test-node
    resources: {}
    terminationMessagePath: /dev/termination-log
    terminationMessagePolicy: File
  dnsPolicy: ClusterFirst
  restartPolicy: Always
  schedulerName: default-scheduler
  securityContext: {}
  terminationGracePeriodSeconds: 30
 
  status:
   availableReplicas: 1
   conditions:
  - lastTransitionTime: 2018-07-11T11:10:18Z
     lastUpdateTime: 2018-07-11T11:10:18Z
    message: Deployment has minimum availability.
     reason: MinimumReplicasAvailable
    status: "True"
     type: Available
     observedGeneration: 5
      readyReplicas: 1
      replicas: 1
      updatedReplicas: 1

【问题讨论】:

    标签: node.js mongodb express kubernetes


    【解决方案1】:

    您的kubernetes.yaml 文件指定要存储您的秘密的环境变量,以便该命名空间中的应用可以访问它。

    使用kubectl secrets cli interface,您可以上传您的秘密。

    kubectl create secret generic -n node-app test-mongodb-secret --from-literal=username=a-username --from-literal=password=a-secret-password
    

    (命名空间参数-n node-app是可选的,否则会上传到默认命名空间)

    运行此命令后,您可以检查您的 kube 仪表板以查看密钥已保存

    然后从你的节点应用,访问环境变量process.env.SECRET_PASSWORD

    也许在您的情况下,秘密是在错误的命名空间中创建的,因此为什么 undefined 在您的应用程序中。

    编辑 1

    container.env 的缩进似乎是错误的

    apiVersion: v1
    kind: Pod
    metadata:
      name: secret-env-pod
    spec:
      containers:
      - name: mycontainer
        image: redis
        env:
          - name: SECRET_USERNAME
            valueFrom:
              secretKeyRef:
                name: mysecret
                key: username
          - name: SECRET_PASSWORD
            valueFrom:
              secretKeyRef:
                name: mysecret
                key: password
      restartPolicy: Never
    

    【讨论】:

    • 我创建了秘密,它已保存在我的 gcp kubernetes 仪表板中。我也在 kubernetes.yaml 文件中声明为 env 。当我试图通过我的代码访问用户名时,它会抛出 undefined 。 ``` var myvalue=process.env.SECRET_USERNAME;控制台.log(myvalue); ```
    • 我想我看到了问题所在。在 yaml 文件的容器块中缩进您的环境变量。查看我编辑的答案
    • 我修复了 yaml 文件中的缩进,现在它为我提供了用户名和密码的空数据。如果可能的话,你能给我任何链接吗?
    • 我认为这是一个好兆头,至少它正在阅读test-mongodb-secret 的秘密。也许秘密也被错误地上传了。删除秘密并使用上面给出的 cli 命令(只是为了测试)重新添加它。相关链接在我上面的回答中
    • 我删除了旧的并重新添加了它,它仍然是空的。上面的链接我已经读过,不幸的是它没有在任何应用程序(即节点、java 或 elixir)中使用秘密的任何单个示例。
    猜你喜欢
    • 2019-06-30
    • 2020-01-02
    • 2020-01-12
    • 1970-01-01
    • 2021-11-07
    • 2016-02-05
    • 2020-10-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多