KubernetesでPODを介して実行するアプリケーションがあります。永続ストレージボリュームにいくつかの出力ファイルログを保存したいと思います。
そのために、NFSを介してボリュームを作成し、関連するボリュームクレームを介してPODにバインドしました。共有フォルダに書き込みまたはアクセスしようとすると、NFSは明らかに読み取り専用であるため、「permission denied」メッセージが表示されました。
以下は、ボリュームの作成に使用したjsonファイルです。
{
"kind": "PersistentVolume",
"apiVersion": "v1",
"metadata": {
"name": "task-pv-test"
},
"spec": {
"capacity": {
"storage": "10Gi"
},
"nfs": {
"server": <IPAddress>,
"path": "/export"
},
"accessModes": [
"ReadWriteMany"
],
"persistentVolumeReclaimPolicy": "Delete",
"storageClassName": "standard"
}
}
以下はPOD構成ファイルです
kind: Pod
apiVersion: v1
metadata:
name: volume-test
spec:
volumes:
- name: task-pv-test-storage
persistentVolumeClaim:
claimName: task-pv-test-claim
containers:
- name: volume-test
image: <ImageName>
volumeMounts:
- mountPath: /home
name: task-pv-test-storage
readOnly: false
許可を変更する方法はありますか?
更新
PVCとNFSの構成は次のとおりです。
PVC:
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: task-pv-test-claim
spec:
storageClassName: standard
accessModes:
- ReadWriteMany
resources:
requests:
storage: 3Gi
NFS構成
{
"kind": "Pod",
"apiVersion": "v1",
"metadata": {
"name": "nfs-client-provisioner-557b575fbc-hkzfp",
"generateName": "nfs-client-provisioner-557b575fbc-",
"namespace": "default",
"selfLink": "/api/v1/namespaces/default/pods/nfs-client-provisioner-557b575fbc-hkzfp",
"uid": "918b1220-423a-11e8-8c62-8aaf7effe4a0",
"resourceVersion": "27228",
"creationTimestamp": "2018-04-17T12:26:35Z",
"labels": {
"app": "nfs-client-provisioner",
"pod-template-hash": "1136131967"
},
"ownerReferences": [
{
"apiVersion": "extensions/v1beta1",
"kind": "ReplicaSet",
"name": "nfs-client-provisioner-557b575fbc",
"uid": "3239b14a-4222-11e8-8c62-8aaf7effe4a0",
"controller": true,
"blockOwnerDeletion": true
}
]
},
"spec": {
"volumes": [
{
"name": "nfs-client-root",
"nfs": {
"server": <IPAddress>,
"path": "/Kubernetes"
}
},
{
"name": "nfs-client-provisioner-token-fdd2c",
"secret": {
"secretName": "nfs-client-provisioner-token-fdd2c",
"defaultMode": 420
}
}
],
"containers": [
{
"name": "nfs-client-provisioner",
"image": "quay.io/external_storage/nfs-client-provisioner:latest",
"env": [
{
"name": "PROVISIONER_NAME",
"value": "<IPAddress>/Kubernetes"
},
{
"name": "NFS_SERVER",
"value": <IPAddress>
},
{
"name": "NFS_PATH",
"value": "/Kubernetes"
}
],
"resources": {},
"volumeMounts": [
{
"name": "nfs-client-root",
"mountPath": "/persistentvolumes"
},
{
"name": "nfs-client-provisioner-token-fdd2c",
"readOnly": true,
"mountPath": "/var/run/secrets/kubernetes.io/serviceaccount"
}
],
"terminationMessagePath": "/dev/termination-log",
"terminationMessagePolicy": "File",
"imagePullPolicy": "Always"
}
],
"restartPolicy": "Always",
"terminationGracePeriodSeconds": 30,
"dnsPolicy": "ClusterFirst",
"serviceAccountName": "nfs-client-provisioner",
"serviceAccount": "nfs-client-provisioner",
"nodeName": "det-vkube-s02",
"securityContext": {},
"schedulerName": "default-scheduler",
"tolerations": [
{
"key": "node.kubernetes.io/not-ready",
"operator": "Exists",
"effect": "NoExecute",
"tolerationSeconds": 300
},
{
"key": "node.kubernetes.io/unreachable",
"operator": "Exists",
"effect": "NoExecute",
"tolerationSeconds": 300
}
]
},
"status": {
"phase": "Running",
"hostIP": <IPAddress>,
"podIP": "<IPAddress>,
"startTime": "2018-04-17T12:26:35Z",
"qosClass": "BestEffort"
}
}
Nfs configからステータス情報を削除して短くしました
ポッド構成に適切なsecurityContext
を設定すると、ボリュームが適切な権限でマウントされていることを確認できます。
例:
apiVersion: v1
kind: Pod
metadata:
name: demo
spec:
securityContext:
fsGroup: 2000
volumes:
- name: task-pv-test-storage
persistentVolumeClaim:
claimName: task-pv-test-claim
containers:
- name: demo
image: example-image
volumeMounts:
- name: task-pv-test-storage
mountPath: /data/demo
上記の例では、ストレージはfsGroup
で設定される2000グループIDで/data/demo
にマウントされます。使用しているユーザーのグループIDを見つける必要があります。そのためには、コンテナを実行してid
と入力し、gid
を探します。
コンテナを実行してid
の結果を取得するには、次のように入力します。docker run --rm -it example-image id
ポッドセキュリティコンテキストの詳細については、こちらをご覧ください: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/
tip をくれた白栋天に感謝します。たとえば、ポッドsecurityContextが次のように設定されている場合:
securityContext:
runAsUser: 1000
fsGroup: 1000
nFSホストにsshして実行します
chown 1000:1000 -R /some/nfs/path
User:groupがわからない場合、または多くのポッドがマウントする場合は、次を実行できます。
chmod 777 -R /some/nfs/path
簡単な方法は、nfsストレージ、およびchmod 777にアクセスするか、ボリュームテストコンテナー内のユーザーIDでchownすることです。
私はあなたが物事を成し遂げようとしている方法から少し混乱していますが、私があなたを正しく理解しているなら、この例を試してください:
volumeClaimTemplates:
- metadata:
name: data
namespace: kube-system
labels:
k8s-app: something
monitoring: something
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
そして、おそらくinitコンテナが何かをします:
initContainers:
- name: prometheus-init
image: /something/bash-Alpine:1.5
command:
- chown
- -R
- 65534:65534
- /data
volumeMounts:
- name: data
mountPath: /data
それとも、あなたが逃しているvolumeMountsですか:
volumeMounts:
- name: config-volume
mountPath: /etc/config
- name: data
mountPath: /data
私の最後のコメントは、コンテナに注意することです。あなたは/tmp
またはCoreOS専用でしたか?私はそれを調べなければなりません。
ディレクトリの権限を確認しましたか?すべてのユーザーが読み取りアクセス権を使用できることを確認してください。