1

嗨,我正在玩 Kubernetes 的秘密。我的部署文件是:

---
apiVersion: v1
kind: Secret
metadata:
  name: my-secrets
  labels:
    app: my-app
data:
  username: dXNlcm5hbWU=
  password: cGFzc3dvcmQ=

我能够创建秘密,并将它们安装在我的部署中,如下所示:

---
apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: my-service
  ports:
  - protocol: TCP
    port: 80
    targetPort: 8080
  type: NodePort

---

apiVersion: apps/v1
kind: Deployment
metadata:
  name: spring-service
  labels:
    app: spring-service
spec:
  replicas: 1
  selector:
    matchLabels:
      app: spring-service
  template:
    metadata:
      labels:
        app: spring-service
    spec:
      containers:
      - name: spring-service
        image: my-image:tag
        imagePullPolicy: Always
        ports:
        - containerPort: 8080
        volumeMounts:
        - name: my-secret-vol
          mountPath: "/app/secrets/my-secret"
          readOnly: true            
      volumes:
      - name: my-secret-vol
        secret:
          secretName: my-secrets

我的问题是如何访问usernamepassword在 spring-boot 应用程序中秘密创建?

我尝试使用${my-secrets.username}and加载${username},但找不到值。

我还尝试在 deployment.yml 中添加秘密作为环境变量,如下所示:

env:
- name: username
  valueFrom:
    secretKeyRef:
      name: my-secrets
      key: username
- name: password
  valueFrom:
    secretKeyRef:
      name: my-secrets
      key: password

在这种情况下,值是从秘密加载的,当我在 minikube 仪表板中更改秘密值时,它不会反映更改。

请帮助我了解这是如何工作的。

我正在使用minikubedocker作为容器

4

2 回答 2

2

对于第一种方法,您将在以下位置找到值:

- /app/secrets/my-secret/username
- /app/secrets/my-secret/password 

对于第二种方法,您无法在运行时更改 env vars 的值,您需要重新启动或重新部署 pod

于 2019-03-07T23:35:23.603 回答
1

您不会将秘密注入properties.yml. 相反,您将密钥的内容用作properties.yml. 该过程如下所示:

  • properties.yml使用敏感数据(例如密码)创建一个
  • Base64 编码这个文件(例如base64 properties.yml)。
  • 取 base64 编码的值并将其放在 key 下的 secret 中properties.yaml

您最终应该得到以下格式的秘密:

apiVersion: v1
kind: Secret
metadata:
  name: my-secrets
  labels:
    app: my-app
data:
  properties.yml: dXNlcm5hbWU=

现在当你在你的 pod 上挂载这个 secret 时,Kubernetes 会解密这个 secret 并将值放在相关路径下,你就可以挂载它了。

该模式是有 2 个配置文件 - 一个具有与代码一起存储的非敏感配置,第二个(包括敏感配置)作为机密存储。我不知道是否可以使用 Spring Boot 加载多个配置文件。

最后一个评论 - 这个过程很麻烦且容易出错。对配置文件的每次更改都需要解码原始密钥并重复此手动过程。此外,很难理解发生了什么变化——你所看到的只是整个内容都发生了变化。出于这个原因,我们构建了Kamus。它让您只加密敏感值而不是整个文件。让我知道这是否与您相关:)

于 2019-03-11T14:06:57.730 回答