【问题标题】:CronJob: unknown field "configMapRef"CronJob:未知字段“configMapRef”
【发布时间】:2019-02-21 09:14:39
【问题描述】:

我正在应用 Kubernetes CronJob。 到目前为止它有效。 现在我想添加环境变量。 (环境:-名称...见下文) 尝试申请时出现错误

io.k8s.api.core.v1.EnvVarSource 中的未知字段“configMapRef”

我不喜欢在这里设置所有单曲变量。我更喜欢将 configmap 链接到不加倍变量。 如何在 CronJob 文件中设置指向 configmap.yaml 变量的链接,如何编码?

弗兰克

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: ad-sync
  creationTimestamp: 2019-02-15T09:10:20Z
  namespace: default
  selfLink: /apis/batch/v1beta1/namespaces/default/cronjobs/ad-sync
spec:
  concurrencyPolicy: Allow
  failedJobsHistoryLimit: 1
  successfulJobsHistoryLimit: 3
  suspend: false
  schedule: "0 */1 * * *"
  jobTemplate:
    metadata:
      labels:
        job: ad-sync
    spec:
      template:
        spec:
          containers:
          - name: ad-sync
            image: foo.azurecr.io/foobar/ad-sync
            command: ["dotnet", "AdSyncService.dll"]
            args: []
            env:
              - name: AdSyncService
                valueFrom:
                  configMapRef:
                    name: ad-sync-service-configmap
          restartPolicy: OnFailure

【问题讨论】:

  • 嗨,我认为应该是 configMapKeyRef

标签: kubernetes kubernetes-cronjob


【解决方案1】:

env field 中没有这样的字段 configMapRef 而是有一个名为 configMapKeyRef

的字段

为了获得更多关于kubernetes对象的细节,使用kubectl explain --help很方便

例如,如果您想检查所有键及其类型,您可以使用以下命令

kubectl explain cronJob --recursive

kubectl explain cronjob.spec.jobTemplate.spec.template.spec.containers.env.valueFrom.configMapKeyRef

【讨论】:

    【解决方案2】:

    您应该使用 configMapKeyRef 来表示单个值或使用 configMapRef 和 envFrom

    【讨论】:

      【解决方案3】:

      它是这样工作的:

      apiVersion: batch/v1beta1
      kind: CronJob
      metadata:
        ...
      spec:
        ...
        jobTemplate:
          metadata:
            ...
          spec:
            template:
              spec:
                containers:
                - name: ad-sync
                  ...
                  envFrom:
                    - configMapRef:
                        name: ad-sync-service-configmap
                  command: ["dotnet", "AdSyncService.dll"]

      【讨论】:

      • 它有效,但与您在示例中描述的不同,请在下面查看我的答案。
      【解决方案4】:

      有两种方法,对单个值使用valueFrom,对多个值使用envFrom

      valueFromenv 属性中使用,如下所示:

      spec:
        template:
          spec:
            containers:
            - name: ad-sync
              image: foo.azurecr.io/foobar/ad-sync
              command: ["dotnet", "AdSyncService.dll"]
              args: []
              env:
                - name: AdSyncService
                  valueFrom:
                    configMapKeyRef:
                      name: ad-sync-service-configmap
                      key: log_level
      

      envFrom 直接在container 属性中使用,如下所示:

      spec:
        template:
          spec:
            containers:
            - name: ad-sync
              image: foo.azurecr.io/foobar/ad-sync
              command: ["dotnet", "AdSyncService.dll"]
              envFrom:
                - configMapRef:
                    name: ad-sync-service-configmap
      

      ConfigMap 供参考:

      apiVersion: v1
      kind: ConfigMap
      metadata:
        name: ad-sync-service-configmap
        namespace: default
      data:
        log_level: INFO
      

      两者的主要区别是:

      • valueFrom 将从引用的 configMap 中注入一个键的值
      • envFrom 会将所有 configMap 键作为环境变量注入

      您的示例的主要问题是您在 valueFrom 中使用了来自 envFromconfigMapRef,其中实际上应该是 configMapKeyRef。 此外,configMapKeyRef 需要一个关键属性来识别数据的来源。

      更多详情,请查看this docs。

      【讨论】:

        猜你喜欢
        • 2021-11-22
        • 2020-02-18
        • 1970-01-01
        • 2022-07-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-12
        • 1970-01-01
        • 2019-05-22
        相关资源
        最近更新 更多