从kubernetes secret导入数据以配置映射

时间:2018-05-21 16:07:37

标签: kubernetes kubernetes-secrets

我正在使用包含应用程序数据库配置的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"

和deployment.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”值并用于登录数据库

2 个答案:

答案 0 :(得分:3)

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"

答案 1 :(得分:0)

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