20

我正在使用一个包含应用程序数据库配置的 kubernetes ConfigMap,并且有一个包含数据库密码的秘密。我需要在 ConfigMap 中使用这个秘密,所以当我尝试在 ConfigMap 中添加环境变量并从秘密中指定 pod 部署中的值时,我无法使用密码连接到 mysql,因为 ConfigMap 中的值采用了变量的确切字符串。

apiVersion: v1
kind: ConfigMap
metadata:
  name: config
data:
  APP_CONFIG: |
    port: 8080
    databases:
      default:
        connector: mysql
        host: "mysql"
        port: "3306"
        user: "root"
        password: "$DB_PASSWORD"

和部署.yaml

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: app
  labels:
    app: backend
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: backend
    spec:
      containers:
      - name: app
        image: simple-app-image
        ports:
          - name: "8080"
            containerPort: 8080
        env:
          - name: APP_CONFIG
            valueFrom:
              configMapKeyRef:
                name: config
                key: APP_CONFIG
          - name: DB_PASSWORD
            valueFrom:
              secretKeyRef:
                name: "mysql-secret"
                key: "mysql-root-password"

注意:秘密存在,我可以获得“mysql-root-password”值并用于登录数据库

4

2 回答 2

11

Kubernetes 无法为您进行替换,您应该在容器的入口点使用 shell 进行替换。

这是一个工作示例。我修改默认入口点以使用该替换创建一个新变量。在此命令之后,您应该添加所需的入口点。

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: app
  labels:
    app: backend
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: backend
    spec:
      containers:
      - name: app
        image: simple-app-image
        command:
          - /bin/bash
          - -c
        args:
          - "NEW_APP_CONFIG=$(echo $APP_CONFIG | envsubst) && echo $NEW_APP_CONFIG && <INSERT IMAGE ENTRYPOINT HERE>"
        ports:
          - name: "app"
            containerPort: 8080
        env:
          - name: APP_CONFIG
            valueFrom:
              configMapKeyRef:
                name: config
                key: APP_CONFIG
          - name: DB_PASSWORD
            valueFrom:
              secretKeyRef:
                name: "mysql-secret"
                key: "mysql-root-password"
于 2018-05-21T16:59:13.327 回答
0

我会将整个configMap转换为 asecret并直接在其中部署数据库密码。然后,您可以将密钥作为文件挂载到卷中,并像容器中的常规配置文件一样使用它。

于 2019-08-14T14:38:39.127 回答