我正在尝试将秘密挂载为文件
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