如何将一个文件从一个秘密挂载到一个容器?



我正在尝试将秘密挂载为文件

apiVersion: v1
data:
credentials.conf: >-
dGl0bGU6IHRoaYWwpCg==
kind: Secret
metadata:
name: address-finder-secret
type: Opaque
kind: DeploymentConfig
apiVersion: v1
metadata:
name: app-sample
spec:
replicas: 1
selector:
app: app-sample
template:
metadata:
labels:
app: app-sample
spec:
volumes:
- name: app-sample-vol
configMap:
name: app-sample-config
- name: secret
secret:
secretName: address-finder-secret
containers:
- name: app-sample
volumeMounts:
- mountPath: /config
name: app-sample-vol
- mountPath: ./secret/credentials.conf
name: secret
readOnly: true
subPath: credentials.conf

我需要将credentials.conf文件添加到已经有其他文件的目录中。我想用subPath,但我得到了'Error: failed to create subPath directory for volumeMount "secret" of container "app-sample"'如果我删除子路径,我将丢失目录中的所有其他文件。

我哪里做错了?

你好,希望你喜欢你的kubernetes之旅!

如果你给你的图像名称来尝试它会更好,但是,我决定创建一个自定义的图像。

我创建了一个简单的文件file1.txt并复制到图像中,这是我的dockefile:

FROM nginx
COPY file1.txt /secret/

我简单地用:

❯ docker build -t test-so-mount-file .

我只是检查了我的文件是否在这里,然后再继续:

❯ docker run -it test-so-mount-file bash
root@1c9cebc4884c:/# ls
bin                   etc    mnt   sbin    usr
boot                  home   opt   secret  var
dev                   lib    proc  srv
docker-entrypoint.d   lib64  root  sys
docker-entrypoint.sh  media  run   tmp
root@1c9cebc4884c:/# cd secret/
root@1c9cebc4884c:/secret# ls
file1.txt
root@1c9cebc4884c:/secret#

完美。现在我们把它部署到kubernetes上。

对于这个测试,因为我使用kind (kubernetes in docker),我只使用这个命令将我的映像上传到集群:

❯ kind load docker-image test-so-mount-file --name so-cluster-1

看起来你正在openshift上部署你的"deploymentconfig"。种类但是,一旦我的映像被添加到我的集群中,我就用它修改了您的部署:

首先不带卷,检查文件是否在容器中:

apiVersion: apps/v1
kind: Deployment
metadata:
name: app-sample
spec:
replicas: 1
selector:
matchLabels:
app: app-sample
template:
metadata:
labels:
app: app-sample
spec:
containers:
- name: app-sample
image: test-so-mount-file
imagePullPolicy: Never
# volumeMounts:

yes it is:

❯ k exec -it app-sample-7b96558fdf-hn4qt -- ls /secret
file1.txt

在继续之前,当我试图部署你的秘密时,我得到了这个:

Error from server (BadRequest): error when creating "manifest.yaml": Secret in version "v1" cannot be handled as a Secret: illegal base64 data at input byte 20

这是链接到base64字符串,实际上包含非法的base64数据,在这里:

❯ base64 -d <<< "dGl0bGU6IHRoaYWwpCg=="
title: thi���(base64: invalid input

不,我在b64中使用了另一个字符串:

❯ base64 <<< test
dGVzdAo=

并将其添加到secret中。因为我想把这些数据放在一个文件中,所以我用一个'|-'替换了'>-' ('>-'和& # 39;| & # 39;在yaml?)中,无论是否使用它都可以工作。现在,让我们将秘密添加到部署中。我把"/secret/credentials.conf"由"/机密/credentials.conf"(它可以使用或不使用,但我更喜欢删除")。因为我没有你的确认数据,所以我把这部分注释掉了。但是,下面是我的文件manifest.yaml的部署清单:

apiVersion: v1
kind: Secret
type: Opaque
metadata:
name: address-finder-secret
data:
credentials.conf: |-
dGVzdAo=
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: app-sample
spec:
replicas: 1
selector:
matchLabels:
app: app-sample
template:
metadata:
labels:
app: app-sample
spec:
containers:
- name: app-sample
image: test-so-mount-file
imagePullPolicy: Never
volumeMounts:
# - mountPath: /config
#   name: app-sample-vol
- mountPath: /secret/credentials.conf
name: secret
readOnly: true
subPath: credentials.conf
volumes:
# - name: app-sample-vol
#   configMap:
#     name: app-sample-config
- name: secret
secret:
secretName: address-finder-secret

让我们部署这个:

❯ kaf manifest.yaml
secret/address-finder-secret created
deployment.apps/app-sample created

❯ k get pod
NAME                                READY   STATUS    RESTARTS   AGE
app-sample-c45ff9d58-j92ct          1/1     Running   0          31s

❯ k exec -it app-sample-c45ff9d58-j92ct -- ls /secret
credentials.conf  file1.txt

❯ k exec -it app-sample-c45ff9d58-j92ct -- cat /secret/credentials.conf
test

它工作得很完美,因为我没有修改你的manifest,我认为pb来自deploymentConfig,我建议你使用deployment而不是deploymentConfig,这样它就会起作用(我希望),如果有一天你决定从openshift迁移到另一个kubernetes集群,你的manifest将是兼容的。

bguess

相关内容

  • 没有找到相关文章

最新更新