如何将 Kubernetes 密钥注入配置文件中

4

我有一个配置文件如下所示。这个文件是一个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>
5个回答

1
您可以使用初始化容器和共享卷的组合方式来实现此目的,如果您不想直接向应用程序容器公开密钥。
初始化容器使用密钥从模板创建配置文件(例如,使用sed替换占位符),并将文件放置在共享卷中。应用程序容器使用该卷检索文件。(假设您可以配置应用程序期望配置文件的路径。)
另一种选择是将密钥简单地用作应用程序的环境变量,并从通用配置中单独检索它。

0
这是我尝试解决同样问题的方法。 我试图避免使用sedeval或任何其他不安全的解决方案(特殊字符或类似问题)。
创建一个包含配置文件的密钥(在您的情况下,它将是xml):
apiVersion: v1
kind: Secret
metadata:
  name: mysecret
type: Opaque
stringData:
  config.yaml: |
    apiUrl: "https://my.api.com/api/v1"
    username: <user>
    password: <password> 

然后将该秘密作为文件挂载:

apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
  - name: mypod
    image: redis
    volumeMounts:
    - name: foo
      mountPath: "/etc/foo"
      readOnly: true
  volumes:
  - name: foo
    secret:
      secretName: mysecret
      optional: false # default setting; "mysecret" must exist

https://kubernetes.io/docs/tasks/configmap-secret/managing-secret-using-config-file/ https://kubernetes.io/docs/concepts/configuration/secret/#using-secrets-as-files-from-a-pod


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秘钥,并作为环境变量附加到容器中。


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

什么导致环境变量引用被扩展? - David Maze
有多种方法可以实现。您可以尝试使用envsubst <文件名来执行。 - P Ekambaram

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

  1. 创建Secret
  2. Depoyment环境变量中引用Secret
  3. 将它们作为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文件中从另一个环境变量引用环境变量时,请注意使用括号而不是花括号。

希望这有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接