我想知道是否有定义kubernate或openshift模板从其中一个卷中的文件加载环境变量的方法。
我想要达到的目标是:
启动主容器时
如果有人知道允许主容器读取从initContainer生成的环境变量的替代方法,它也将解决我的问题
谢谢
最佳答案
我可以看到两种方法来满足您的需求:
1-使用configMap:您需要授予initContainer运行kubectl
的权限,以创建具有所需值的configmap
或secret
,并使您的主容器读取configmap并将其配置为环境变量。
2-使用persistentVolume:在initContainer中写入文件,然后它们将相同的卷装载到pod上,读取文件并根据需要使用。
的第一个方法是更优雅的IMO,因为您可以配置权限级别并隔离configMap对象以使用Role权限。
第二个方法比第二个更为简单,所需的步骤更少,但取决于您需要存储哪种数据,如果它是明智的数据,我建议转到第二种方法。
方法1
这种方法包括使用所需变量创建一个kubernetes configMap
,并使用此configMap中的值在主容器中配置环境变量。
它需要一些额外的步骤:
在这种情况下,
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/