如何将kubernetes秘密注入配置文件

时间:2019-05-24 10:02:18

标签: kubernetes

我有一个配置文件,如下。该文件是一个configmap,将由我的应用安装和读取。这里的问题是此配置文件具有一个带有我的数据库密码的属性。而且我不想暴露它。因此无论如何都将kubernetes秘密注入到这种配置文件中。谢谢

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
  <property>
    <name>javax.jdo.option.ConnectionUserName</name>
    <value>hive</value>
  </property>
  <property>
    <name>javax.jdo.option.ConnectionPassword</name>
    <value>my_db_password</value>
  </property>

4 个答案:

答案 0 :(得分:0)

尝试以下步骤

1.  add the password as an environment variable

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
  <property>
    <name>javax.jdo.option.ConnectionUserName</name>
    <value>hive</value>
  </property>
  <property>
    <name>javax.jdo.option.ConnectionPassword</name>
    <value>${my_db_password}</value>
  </property>

2. include the password in secret object
3. load the env variable from secret object. you need to define env from secret object ref in pod definition

答案 1 :(得分:0)

如果您不想直接将秘密公开给应用程序容器,则可以使用初始化容器和共享卷的组合。

init容器使用密钥从模板创建配置文件(例如,sed替换占位符)并将文件放置在共享卷中。应用程序容器使用该卷来检索文件。 (鉴于您可以配置应用程序期望配置文件的路径。)

另一种选择是简单地将密钥用作应用程序的环境变量,并从常规配置中单独获取它。

答案 2 :(得分:0)

问题在于XML不会扩展该变量。不知道它是否适合您的用例,但是我们有一个带有一些XML配置的JVM应用程序,并做了以下工作以使其起作用:

  1. 创建Secret
  2. Secret环境变量中引用Depoyment
  3. 将它们作为System Properties注入到JAVA_OPT变量中
  4. 系统属性得到扩展

示例

部署文件:

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp
  labels:
    app: myapp
spec:
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
        - name: myapp
          image: myimage
          ports:
            - containerPort: 8080
          env:
            - name: DB_USER
              valueFrom:
                secretKeyRef:
                  name: my-secret-credentials
                  key: user
            - name: DB_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: my-secret-credentials
                  key: password
            - name: JAVA_OPTS
              value: "-db.user=$(DB_USER) -Ddb.password=$(DB_PASSWORD)"

您的XML配置文件:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
  <property>
    <name>javax.jdo.option.ConnectionUserName</name>
    <value>"#{systemProperties['db.user']}"</value>
  </property>
  <property>
    <name>javax.jdo.option.ConnectionPassword</name>
    <value>"#{systemProperties['db.password']}"</value>
  </property>

这样,您的秘密就可以安全地注入了。只需从部署yaml中的另一个环境变量引用环境变量时要注意,它使用括号而不是花括号。

希望有帮助

答案 3 :(得分:0)

我不知道这种方法是否适用于Hadoop 2。

在Hadoop 3+中,我对core-site.xml和hive-metastore.xml使用了以下配置,以从环境变量中设置配置值:

core-site.xml

<property>
    <name>fs.defaultFS</name>
    <value>${env.HADOOP_DEFAULT_FS}</value>
</property>

metastore-site.xml:

   <property>
      <name>javax.jdo.option.ConnectionPassword</name>
      <value>${env.METASTORE_PASSWORD}</value>
   </property>

在将HADOOP_DEFAULT_FS和METASTORE_PASSWORD定义为k8s密钥的情况下,该密钥作为env变量附加到容器。