【问题标题】:Can Kubernetes Cronjobs Reuse Environment Variables From Existing Deployment?Kubernetes Cronjobs 可以重用现有部署中的环境变量吗?
【发布时间】:2019-12-03 22:06:14
【问题描述】:

我正在使用 Kubernetes Cronjob 运行周期数据库恢复和发布恢复脚本,这些脚本针对目标环境运行,包括使用数据库、redis 和文件系统等任务。

我面临的问题是我必须重新定义我在 Cronjob 中的部署中使用的所有环境变量(例如,DATABASE_NAMEDATABASE_PASSWORDREDIS_HOST 等)。

虽然重复所有环境变量有效,但很容易出错,因为我已经忘记更新作业,这导致我不得不重新运行整个过程,这需要 2-4 小时才能运行,具体取决于环境。

有没有办法引用现有的 Deployment 并在我的 Cronjob 中重新使用定义的环境变量?

【问题讨论】:

  • 我不认为你可以参考部署,但你可以从秘密设置环境变量,所以你会在 cron 和部署中引用相同的秘密
  • @Markownikow,是的,这是真的。我将它用于我的实际秘密,例如DATABASE_PASSWORD,但实际上并不想在我的部署中将非敏感环境变量转换为秘密(因为在 SCM 中查看文件时,它会使故障排除变得有点困难)。感谢您的反馈。
  • 我明白了,在调试时可以轻松查看值的配置映射怎么样?
  • 好点。那么有效的解决方法。谢谢指点。

标签: kubernetes kubernetes-deployment kubernetes-cronjob


【解决方案1】:

您可以使用 'kind: PodPreset' 对象来定义和注入 comman env 变量到多个 kuberentes 对象中,例如部署/statefulsets/pods/replicasets 等。

点击链接寻求帮助 --> https://kubernetes.io/docs/tasks/inject-data-application/podpreset/

【讨论】:

  • 看起来是一个有效的解决方案,它还允许我的 CronJob(和部署)使用一个标签,而不是重新指定要使用的每个环境变量,我需要使用 ConfigMap 或机密。我需要围绕我的掌舵图做一些工作,但会将其添加到我的待办事项中。
【解决方案2】:

我不认为你可以重用环境变量,直到它来自秘密或配置映射。所以如果你不想对非敏感数据使用秘密,那么你可以使用如下配置映射

kubectl create configmap redis-uname --from-literal=username=jp

[root@master ~]# kubectl get cm redis-uname -o yaml
apiVersion: v1
data:
  username: jp
kind: ConfigMap
metadata:
  creationTimestamp: "2019-11-28T21:38:18Z"
  name: redis-uname
  namespace: default
  resourceVersion: "1090703"
  selfLink: /api/v1/namespaces/default/configmaps/redis-uname
  uid: 1a9e3cce-50b1-448b-8bae-4b2c6ccb6861
[root@master ~]#

[root@master ~]# echo -n 'K8sCluster!' | base64
SzhzQ2x1c3RlciE=

[root@master ~]# cat redis-sec.yaml
apiVersion: v1
kind: Secret
metadata:
 name: redissecret
data:
 password: SzhzQ2x1c3RlciE=
[root@master ~]#



[root@master ~]# kubectl apply -f redis-sec.yaml
secret/redissecret created

[root@master ~]# kubectl get secret redissecret -o yaml
apiVersion: v1
data:
  password: SzhzQ2x1c3RlciE=
kind: Secret
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"v1","data":{"password":"SzhzQ2x1c3RlciE="},"kind":"Secret","metadata":{"annotations":{},"name":"redissecret","namespace":"default"}}
  creationTimestamp: "2019-11-28T21:40:18Z"
  name: redissecret
  namespace: default
  resourceVersion: "1090876"
  selfLink: /api/v1/namespaces/default/secrets/redissecret
  uid: 2b6acdcd-d7c6-4e50-bd0e-8c323804155b
type: Opaque
[root@master ~]#

apiVersion: v1
kind: Pod
metadata:
 name: "redis-sec-env-pod"
spec:
 containers:
 - name: redis-sec-env-cn
   image: "redis"
   env:
    - name: username
      valueFrom:
        configMapKeyRef:
          name: redis-uname
          key: username
    - name: password
      valueFrom:
        secretKeyRef:
          name: redissecret
          key: password

[root@master ~]# kubectl apply -f reddis_sec_pod.yaml
pod/redis-sec-env-pod created

[root@master ~]# kubectl exec -it redis-sec-env-pod sh
# env|grep -i user
username=jp
# env|grep -i pass
password=K8sCluster!
#

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-10-19
    • 2022-10-04
    • 2022-09-13
    • 2020-01-30
    • 1970-01-01
    • 2022-10-23
    • 2020-12-29
    • 2019-03-09
    相关资源
    最近更新 更多