Kubernetes是否接受JSON格式的输入文件来创建configmap和secret?

19

我有一个已存在的JSON格式的配置文件,类似下面这样:

{
    "maxThreadCount": 10,
    "trackerConfigs": [{
            "url": "https://example1.com/",
            "username": "username",
            "password": "password",
            "defaultLimit": 1
        },
        {
            "url": "https://example2.com/",
            "username": "username",
            "password": "password",
            "defaultLimit": 1
        }
    ],
    "repoConfigs": [{
        "url": "https://github.com/",
        "username": "username",
        "password": "password",
        "type": "GITHUB"
    }],
    "streamConfigs": [{
        "url": "https://example.com/master.json",
        "type": "JSON"
    }]
}

我知道可以通过--from-file选项使用键/值对属性文件创建configmap和secret。

但是JSON格式的文件呢?Kubernetes是否也接受JSON格式的文件作为输入文件来创建configmap和secret?

$ kubectl create configmap demo-configmap --from-file=example.json

如果我运行这个命令,它会显示 configmap/demo-configmap 已创建。但是我如何在其他 Pod 中引用这个 configmap 的值呢?
4个回答

44

当您使用--from-file创建configmap/secret时,默认情况下文件名将成为键名,文件内容将成为值。

例如,您创建的configmap将会是这个样子:

apiVersion: v1
data:
  test.json: |
    {
        "maxThreadCount": 10,
        "trackerConfigs": [{
                "url": "https://example1.com/",
                "username": "username",
                "password": "password",
                "defaultLimit": 1
            },
            {
                "url": "https://example2.com/",
                "username": "username",
                "password": "password",
                "defaultLimit": 1
            }
        ],
        "repoConfigs": [{
            "url": "https://github.com/",
            "username": "username",
            "password": "password",
            "type": "GITHUB"
        }],
        "streamConfigs": [{
            "url": "https://example.com/master.json",
            "type": "JSON"
        }]
    }
kind: ConfigMap
metadata:
  creationTimestamp: "2020-05-07T09:03:55Z"
  name: demo-configmap
  namespace: default
  resourceVersion: "5283"
  selfLink: /api/v1/namespaces/default/configmaps/demo-configmap
  uid: ce566b36-c141-426e-be30-eb843ab20db6
你可以将configmap作为卷挂载到pod中,其中键名将是文件名,值将是文件内容,如下所示。
apiVersion: v1
kind: Pod
metadata:
  name: test-pod
spec:
  containers:
    - name: test-container
      image: k8s.gcr.io/busybox
      command: [ "/bin/sh", "-c", "ls /etc/config/" ]
      volumeMounts:
      - name: config-volume
        mountPath: /etc/config
  volumes:
    - name: config-volume
      configMap:
        name: demo-configmap
  restartPolicy: Never

当Pod运行时,命令ls /etc/config/将产生下面的输出:

test.json


感谢您的帮助,我已将文件挂载在位置/etc/config/test.json。 我想从我的java应用程序中读取此文件的内容。 我可以定义一个env键/值对,该值为/etc/config/test.json,并调用System.getenv().get("key");来读取它。 但是我想知道是否有一种方法可以使用System.getProperty()进行定义和调用?这样我就不必在我的java应用程序代码中从System.getenv().get()更改为System.getProperty()。 - user1684651
您可以将configmap作为环境变量传递。就像这样https://kubernetes.io/docs/tasks/configure-pod-container/configure-pod-configmap/#configure-all-key-value-pairs-in-a-configmap-as-container-environment-variables - hoque
1
是的,但它仍然是一个环境变量,我必须更改我的Java应用程序代码为System.getenv().get()才能使用它。我想设置一个Java系统属性,这样我就可以直接调用System.getProperty()而不需要更新我的应用程序代码。 - user1684651

2

配置映射是键值对的容器。如果您从包含JSON的文件创建ConfigMap,则将使用文件名作为键存储JSON作为值。

要从Pod访问这样的ConfigMap,您必须将其作为卷挂载到Pod中:

如何挂载配置映射


1
很不幸,hoque提供的解决方案对我无效。在我的情况下,该应用程序以非常可疑的消息终止:
Could not execute because the application was not found or a compatible .NET SDK is not installed.
Possible reasons for this include:
  * You intended to execute a .NET program:
      The application 'myapp.dll' does not exist.
  * You intended to execute a .NET SDK command:
      It was not possible to find any installed .NET SDKs.
      Install a .NET SDK from:
        https://aka.ms/dotnet-download

我看到appsettings.json已经部署了,但是出了些问题。最终,这个解决方案对我有用(类似,但带有一些额外功能):

spec:
  containers:
    - name: webapp
      image: <my image>
      volumeMounts:
      - name: appconfig
        # "mountPath: /app" only doesn't work (app crashes)
        mountPath: /app/appsettings.json
        subPath: appsettings.json
  volumes:
    - name: appconfig
      configMap:
        name: my-config-map
        # Required since "mountPath: /app" only doesn't work (app crashes)
        items:
        - key: appsettings.json
          path: appsettings.json

apiVersion: v1
kind: ConfigMap
metadata:
  name: my-config-map
  labels:
    app: swpq-task-02-team5
data:
  appsettings.json: |
    {
     ...
    }

0

我遇到了这个问题已经有几天了,因为我想从我的本地目录引用一个json配置文件(config.production.json)到pod的特定位置(/var/lib/ghost)中。下面的配置对我起作用。请注意mountPathsubPath键,它们为我解决了问题。下面的片段是一个kind=deployment的pod,为了方便阅读而缩短了---

 spec:
      volumes:
        - name: configmap-volume
          configMap:
            name: configmap
      containers:
        - env:
            - name: url
              value: https://www.example.com
          volumeMounts:
            - name: configmap-volume
              mountPath: /var/lib/ghost/config.production.json
              subPath: config.production.json

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