Kubernetes难题:从文件(装入的卷)填充环境变量

时间:2019-05-17 22:26:24

标签: kubernetes volumes

我有一个Pod或Job yaml规范文件(我可以对其进行编辑),我想从本地计算机上启动它(例如,使用kubectl create -f my_spec.yaml

规范声明了卷安装。该卷中会有一个文件,我想用作环境变量的值。

我要使卷文件的内容最终出现在环境变量中(而我不必通过某种方式将文件“下载”到本地计算机并插入到规范中来跳过循环)。

P.S。如果您可以控制command中的container,显然该怎么做。但是在启动任意图像的情况下,我无法控制command属性,因为我不知道。

apiVersion: batch/v1
kind: Job
metadata:
  generateName: puzzle
spec:
  template:
    spec:
      containers:
      - name: main
        image: arbitrary-image
        env:
        - name: my_var
          valueFrom: <Contents of /mnt/my_var_value.txt>
        volumeMounts:
        - name: my-vol
          path: /mnt
      volumes:
      - name: my-vol
        persistentVolumeClaim:
          claimName: my-pvc

1 个答案:

答案 0 :(得分:1)

您可以使用kubectl无限循环创建部署,该循环将不断轮询卷并从中更新configmap。之后,您可以将创建的configmap挂载到pod中。这有点hacky,但是可以正常工作并自动更新您的configmap。唯一的要求是PV必须为ReadWriteMany或ReadOnlyMany(但在这种情况下,您可以以只读模式将其安装到所有Pod)。

apiVersion: v1
kind: ServiceAccount
metadata:
  name: cm-creator
  namespace: default
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: default
  name: cm-creator
rules:
- apiGroups: [""]
  resources: ["configmaps"]
  verbs: ["create", "update", "get"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: cm-creator
  namespace: default
subjects:
- kind: User
  name: system:serviceaccount:default:cm-creator
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: Role
  name: cm-creator
  apiGroup: rbac.authorization.k8s.io
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: cm-creator
  namespace: default
  labels:
    app: cm-creator
spec:
  replicas: 1
  serviceAccountName: cm-creator
  selector:
    matchLabels:
      app: cm-creator
  template:
    metadata:
      labels:
        app: cm-creator
    spec:
      containers:
      - name: cm-creator
        image: bitnami/kubectl
        command:
        - /bin/bash
        - -c
        args:
        - while true; 
            kubectl create cm myconfig --from-file=my_var=/mnt/my_var_value.txt --dry-run -o yaml | kubectl apply -f-;
            sleep 60;
          done
        volumeMounts:
        - name: my-vol
          path: /mnt
          readOnly: true
      volumes:
      - name: my-vol
        persistentVolumeClaim:
          claimName: my-pvc