我想知道是否仍然可以定义kubernate或openshift模板来从一个卷中的文件加载环境变量。
我要实现的目标是:
如果有人知道允许主容器读取从initContainer生成的环境变量的替代方法,它也将解决我的问题
谢谢
答案 0 :(得分:0)
我可以看到两种方法来满足您的需求:
1-使用configMap:您需要授予initContainer运行权限kubectl
,以创建具有所需值的configmap
或secret
并设置您的主容器读取configmap并配置为环境变量。
2-使用persistentVolume::在initContainer中写入文件,然后它们将相同的卷装载到pod上,读取文件并根据需要使用。
first 方法比优雅 IMO多得多,因为您可以配置权限级别并隔离configMap对象以使用角色权限。
与第二个方法相比,第二个方法更容易并且所需的步骤更少。但是取决于明智的存储类型。数据,我建议转到第二种方法。
这种方式包括使用所需变量创建一个kubernetes configMap
,并使用此configMap中的值在主容器中配置环境变量。
这需要一些额外的步骤:
在这种情况下,initContainer
将负责创建/更新configmap
,并且您的主容器将读取此configmap并将值配置为env vars。
注意:在此示例中,我使用了 myns 名称空间中的所有资源。 您应该进行适当的更改以使其最适合您的环境,例如:Role / ClusterRole权限,您可以使用
resourceNames
来限制ir。看到这里
envFrom
:这将负责从Kubernetes读取configMap并设置环境变量。更多信息here。
以下规范将创建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
现在,您需要在部署模板中进行适当的更改,并添加其他参数:
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']
您将需要创建一个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']