我想知道是否有定义kubernate或openshift模板从其中一个卷中的文件加载环境变量的方法。

我想要达到的目标是:

  • 在initContainer
  • 上生成一个值
  • 在文件
  • 上写入值
    启动主容器时
  • 加载值作为环境变量

    如果有人知道允许主容器读取从initContainer生成的环境变量的替代方法,它也将解决我的问题

    谢谢

    最佳答案

    我可以看到两种方法来满足您的需求:
    1-使用configMap:您需要授予initContainer运行kubectl的权限,以创建具有所需值的configmapsecret,并使您的主容器读取configmap并将其配置为环境变量。
    2-使用persistentVolume:在initContainer中写入文件,然后它们将相同的卷装载到pod上,读取文件并根据需要使用。
    的第一个方法是更优雅的IMO,因为您可以配置权限级别并隔离configMap对象以使用Role权限。
    第二个方法比第二个更为简单,所需的步骤更少,但取决于您需要存储哪种数据,如果它是明智的数据,我建议转到第二种方法。
    方法1
    这种方法包括使用所需变量创建一个kubernetes configMap,并使用此configMap中的值在主容器中配置环境变量。
    它需要一些额外的步骤:

  • 创建服务帐户
  • 创建一个角色,以允许configmap
  • 中的serviceAccount perfom操作
  • 创建一个RoleBinding将serviceAccount与Role
  • 连接起来

    在这种情况下,initContainer将负责创建/更新configmap,并且您的主容器将读取此configmap并将值配置为env vars。
    envFrom:这将负责从Kubernetes读取configMap并设置环境变量。更多信息here
    RBAC
    以下规范将创建 serviceAccount Role and RoleBinding :
    创建一个名为rbac-sa-myuser.yaml的文件,内容如下
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: sa-myuser
      namespace: myns
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: Role
    metadata:
      namespace: myns
      name: role-configmap
    rules:
    - apiGroups: [""]
      resources: ["configmaps"]
      verbs: ["create", "update", "get", "patch", "delete"]
    ---
    kind: RoleBinding
    apiVersion: rbac.authorization.k8s.io/v1
    metadata:
      name: rolebinding-configmap
      namespace: myns
    roleRef:
      kind: Role
      name: role-configmap
      apiGroup: rbac.authorization.k8s.io
    subjects:
    - kind: ServiceAccount
      name: sa-myuser
      namespace: myns
    
    申请kubectl apply -f rbac-sa-myuser.yaml现在,您需要在部署模板中进行适当的更改,并添加其他参数:
    服务帐户名称:
     spec:
       serviceAccountName: sa-myuser
    
    env来自:
    envFrom:
      - configMapRef:
          name: my-var
    
    initContainer:这只是运行命令以创建configMap的initContainer的示例,您需要针对用例进行调整:
     initContainers:
       - name: my-init
         image: bitnami/kubectl
         command: ['sh', '-c', 'kubectl delete cm my-var ; kubectl create cm my-var --from-literal MYVAR=UPVOTEIT']
    
    最后,您的部署规范必须类似于以下内容:
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: var-example
      namespace: myns
    spec:
      selector:
        matchLabels:
          app: var-example
      template:
        metadata:
          labels:
            app: var-example
        spec:
          serviceAccountName: sa-myuser
          containers:
          - name: var-example
            image: nginx
            envFrom:
              - configMapRef:
                  name: my-var
            ports:
            - name: http
              containerPort: 80
          initContainers:
            - name: my-init
              image: bitnami/kubectl
              command: ['sh', '-c', 'kubectl delete cm my-var ; kubectl create cm my-var --from-literal MYVAR=UPVOTEIT']
    
    方法2:持久卷
    您将需要创建一个persistVolume,并在两个 pods 中进行安装,例如,我将使用hostPath演示其工作原理,但是您需要为您的工作量找到最佳的持久性卷。请参阅here各种列表。
    以下yaml将在您的节点上创建2Gi持久性卷和1Gi的持久性卷声明。
    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: pv-volume
      labels:
        type: local
    spec:
      storageClassName: manual
      capacity:
        storage: 2Gi
      accessModes:
        - ReadWriteOnce
      hostPath:
        path: "/mnt/data"
    ---
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: pv-claim
    spec:
      storageClassName: manual
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 1Gi
    
    然后只需创建将卷装入initContainer和主容器中的部署,例如:
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: var-example
    spec:
      selector:
        matchLabels:
          app: var-example
      template:
        metadata:
          labels:
            app: var-example
        spec:
          volumes:
            - name: pv-storage
              persistentVolumeClaim:
                claimName: pv-claim
          containers:
          - name: var-example
            image: nginx
            ports:
            - name: http
              containerPort: 80
            volumeMounts:
              - mountPath: "/mnt/data"
                name: pv-storage
            command: ["sh", "-c", "echo MYVAR=$(cat /mnt/data/myfile.txt) >> /etc/environment ; sleep 3600"]
          initContainers:
            - name: my-init
              image: busybox:1.28
              volumeMounts:
                - mountPath: "/mnt/data"
                  name: pv-storage
              command: ['sh', '-c', 'echo "UPVOTE_IT" > /mnt/data/myfile.txt']
    

    关于kubernetes - 文件中的Openshift或Kubernate环境变量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/61375369/

    10-16 23:44