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

如何将kubernetes秘密注入配置文件,kubernetes,Kubernetes,我有一个配置文件,如下所示。此文件是configmap,将由我的应用程序装载和读取。这里的问题是,此配置文件有一个带有my db password的属性。我不想让它暴露出来。因此,无论如何都有必要将kubernetes秘密注入到这样的配置文件中。谢谢 <?xml version="1.0" encoding="UTF-8" standalone="no"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?&g

我有一个配置文件,如下所示。此文件是configmap,将由我的应用程序装载和读取。这里的问题是,此配置文件有一个带有my db password的属性。我不想让它暴露出来。因此,无论如何都有必要将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>

javax.jdo.option.ConnectionUserName
蜂箱
javax.jdo.option.ConnectionPassword
我的密码
尝试以下步骤

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。将密码添加为环境变量
javax.jdo.option.ConnectionUserName
蜂箱
javax.jdo.option.ConnectionPassword
${my_db_password}
2.在机密对象中包含密码
3.从secret对象加载env变量。您需要从pod定义中的secret object ref定义环境

如果不想直接向应用程序容器公开机密,可以将init容器与共享卷结合使用

init容器使用secret从模板创建配置文件(f.e.
sed
替换占位符),并将文件放置在共享卷中。应用程序容器使用卷检索文件。(假设您可以配置应用程序需要配置文件的路径。)


另一种选择是简单地将secret用作应用程序的环境变量,并将其与常规配置分开检索。

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

  • 创建
    Secret
  • 参考
    Depoyment
    环境变量中的
    Secret
  • 将它们作为
    系统属性
    注入
    JAVA_OPT
    变量中
  • 系统属性得到扩展
  • 范例

    部署文件:

    ---
    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>
    
    
    javax.jdo.option.ConnectionUserName
    “#{systemProperties['db.user']}”
    javax.jdo.option.ConnectionPassword
    “#{systemProperties['db.password']}”
    
    这样你的秘密就可以安全地注射了。请注意,当从部署yaml中的另一个环境变量引用环境变量时,它使用括号而不是大括号


    希望这能有所帮助

    我不知道这种方法是否适用于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>
    
    
    fs.defaultFS
    ${env.HADOOP\u DEFAULT\u FS}
    
    metastore-site.xml:

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

    其中HADOOP_DEFAULT_FS和METASTORE_PASSWORD被定义为k8s secret,作为环境变量附加到容器。

    是什么导致环境变量引用被扩展?有多种方法。您可以尝试使用envsubst