文件中的Openshift或Kubernate环境变量

时间:2020-04-22 21:25:53

标签: kubernetes openshift

我想知道是否仍然可以定义kubernate或openshift模板来从一个卷中的文件加载环境变量。

我要实现的目标是:

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

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

谢谢

1 个答案:

答案 0 :(得分:0)

我可以看到两种方法来满足您的需求:

1-使用configMap:您需要授予initContainer运行权限kubectl,以创建具有所需值的configmapsecret并设置您的主容器读取configmap并配置为环境变量。

2-使用persistentVolume::在initContainer中写入文件,然后它们将相同的卷装载到pod上,读取文件并根据需要使用。

first 方法比优雅 IMO多得多,因为您可以配置权限级别并隔离configMap对象以使用角色权限。

与第二个方法相比,第二个方法更容易并且所需的步骤更少。但是取决于明智的存储类型。数据,我建议转到第二种方法。

方法1

这种方式包括使用所需变量创建一个kubernetes configMap,并使用此configMap中的值在主容器中配置环境变量。

这需要一些额外的步骤:

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

在这种情况下,initContainer将负责创建/更新configmap,并且您的主容器将读取此configmap并将值配置为env vars。

注意:在此示例中,我使用了 myns 名称空间中的所有资源。 您应该进行适当的更改以使其最适合您的环境,例如:Role / ClusterRole权限,您可以使用resourceNames来限制ir。看到这里

envFrom:这将负责从Kubernetes读取configMap并设置环境变量。更多信息here

RBAC

以下规范将创建serviceAccountRole 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

现在,您需要在部署模板中进行适当的更改,并添加其他参数:

serviceAccountName:

 spec:
   serviceAccountName: sa-myuser

env发件人:

envFrom:
  - configMapRef:
      name: my-var

initContainer:这只是一个initContainer运行示例以创建configMap的示例,您需要针对您的用例进行调整:

 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:persistentVolume

您将需要创建一个persistentVolume并将其安装在两个吊舱中,例如,我将使用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和主Pod中的部署,例如:

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']