Kubernetes Cronjobs 可以重用现有部署中的环境变量吗?
Can Kubernetes Cronjobs Reuse Environment Variables From Existing Deployment?
我正在使用 Kubernetes Cronjob 来 运行 期间数据库恢复和 post 恢复脚本 运行 针对目标环境,其中包括使用数据库、redis 等任务, 和文件系统。
我面临的问题是我必须重新定义我在 Cronjob 中的部署中使用的所有环境变量(例如,DATABASE_NAME
、DATABASE_PASSWORD
、REDIS_HOST
等)。
虽然重复所有环境变量都有效,但很容易出错,因为我已经忘记更新作业,这导致我不得不重新运行 整个过程需要 2-4 小时才能 运行 取决于什么环境。
有没有办法引用现有的 Deployment
并在我的 Cronjob 中重新使用定义的环境变量?
您可以使用 'kind: PodPreset' 对象来定义命令环境变量并将其注入多个 kubernetes 对象,例如 deployments/statefulsets/pods/replicasets 等
关注link寻求帮助 --> https://kubernetes.io/docs/tasks/inject-data-application/podpreset/
我不认为你可以重用环境变量,直到它来自秘密或者 configmaps.So 如果你不想对非敏感数据使用秘密,那么你可以像下面那样使用配置映射
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!
#
我正在使用 Kubernetes Cronjob 来 运行 期间数据库恢复和 post 恢复脚本 运行 针对目标环境,其中包括使用数据库、redis 等任务, 和文件系统。
我面临的问题是我必须重新定义我在 Cronjob 中的部署中使用的所有环境变量(例如,DATABASE_NAME
、DATABASE_PASSWORD
、REDIS_HOST
等)。
虽然重复所有环境变量都有效,但很容易出错,因为我已经忘记更新作业,这导致我不得不重新运行 整个过程需要 2-4 小时才能 运行 取决于什么环境。
有没有办法引用现有的 Deployment
并在我的 Cronjob 中重新使用定义的环境变量?
您可以使用 'kind: PodPreset' 对象来定义命令环境变量并将其注入多个 kubernetes 对象,例如 deployments/statefulsets/pods/replicasets 等
关注link寻求帮助 --> https://kubernetes.io/docs/tasks/inject-data-application/podpreset/
我不认为你可以重用环境变量,直到它来自秘密或者 configmaps.So 如果你不想对非敏感数据使用秘密,那么你可以像下面那样使用配置映射
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!
#