Permissions

如何在 Kubernetes Pod 中掛載具有特定 UID 的捲?

  • April 2, 2020

所以,我試圖讓 Nexus 基於Kubernetes中的這個圖像執行,但它失敗了:

mkdir: cannot create directory '../sonatype-work/nexus3/log': Permission denied
mkdir: cannot create directory '../sonatype-work/nexus3/tmp': Permission denied
Java HotSpot(TM) 64-Bit Server VM warning: Cannot open file ../sonatype-work/nexus3/log/jvm.log due to No such file or directory

從文件中可以看出,該程序使用 UID 200 執行,並且必須使用這些權限安裝卷:

A persistent directory, /nexus-data, is used for configuration,
logs, and storage. This directory needs to be writable by the Nexus
process, which runs as UID 200.

我試圖搜尋文件以找到一種方法來安裝具有這些權限的捲,但是,我找不到任何方法來做到這一點。

有誰知道您是否可以在 PVC/PV 或 Deployment 的配置中指定掛載卷的 UID?如果是這樣,怎麼做?

無法UID使用 的定義來設置Pod,但 Kubernetes 會保存UID源卷的。

因此,您可以設置在主容器之前啟動的UIDby InitContainer,只需將其添加containersDeployment:

initContainers:
- name: volume-mount-hack
 image: busybox
 command: ["sh", "-c", "chown -R 200:200 /nexus"]
 volumeMounts:
 - name: <your nexus volume>
   mountPath: /nexus

就像 Anton 說的,雖然我們不能使用 Pod 的定義來設置 UID。這是此主題的另一種解決方法。

請參考Kubernetes官方文件Configure a Security Context for a Pod or Container

我使用的 pod 定義:

apiVersion: v1
kind: Pod
metadata:
 name: nexus3
 labels:
   app: nexus3
spec:
 securityContext:
   fsGroup: 200
 volumes:
 - name: nexus-data-vol
   emptyDir: {}
 containers:
 - name: nexus3-container
   image: sonatype/nexus3
   volumeMounts:
   - name: nexus-data-vol
     mountPath: /nexus-data

服務定義:

apiVersion: v1
kind: Service
metadata:
 name: nexus3-service
spec:
 type: NodePort
 ports:
 - port: 8081
   nodePort: 30390
   protocol: TCP
   targetPort: 8081
 selector:
   app: nexus3

然後在沒有任何權限被拒絕或其他錯誤的情況下創建 pod 和服務:

# kubectl create -f nexus3.yaml
# kubectl create -f nexus3-svc.yaml

嘗試登錄 Nexus3 容器並檢查 /nexus-data 的所有者/權限:

# kubectl exec -it nexus3 -- sh
sh-4.2$ ls -ld /nexus-data/
drwxrwsrwx 16 root nexus 4096 Mar 13 09:00 /nexus-data/
sh-4.2$

可以看到,該目錄屬於root:nexus,也可以查看該目錄下的文件:

sh-4.2$ cd /nexus-data/
sh-4.2$ ls -l
total 72
drwxr-sr-x   3 nexus nexus  4096 Mar 13 09:00 blobs
drwxr-sr-x 269 nexus nexus 12288 Mar 13 08:59 cache
drwxr-sr-x   8 nexus nexus  4096 Mar 13 09:00 db
drwxr-sr-x   3 nexus nexus  4096 Mar 13 09:00 elasticsearch
drwxr-sr-x   3 nexus nexus  4096 Mar 13 08:59 etc
drwxr-sr-x   2 nexus nexus  4096 Mar 13 08:59 generated-bundles
drwxr-sr-x   2 nexus nexus  4096 Mar 13 08:59 instances
drwxr-sr-x   3 nexus nexus  4096 Mar 13 08:59 javaprefs
drwxr-sr-x   2 nexus nexus  4096 Mar 13 08:59 kar
drwxr-sr-x   3 nexus nexus  4096 Mar 13 08:59 keystores
-rw-r--r--   1 nexus nexus     8 Mar 13 08:59 lock
drwxr-sr-x   2 nexus nexus  4096 Mar 13 09:00 log
drwxr-sr-x   2 nexus nexus  4096 Mar 13 08:59 orient
-rw-r--r--   1 nexus nexus     5 Mar 13 08:59 port
drwxr-sr-x   2 nexus nexus  4096 Mar 13 08:59 restore-from-backup
drwxr-sr-x   7 nexus nexus  4096 Mar 13 09:00 tmp
sh-4.2$ touch test-file
sh-4.2$ ls -l test-file
-rw-r--r-- 1 nexus nexus 0 Mar 13 09:13 test-file
sh-4.2$ mkdir test-dir
sh-4.2$ ls -l test-dir
total 0
sh-4.2$ ls -ld test-dir
drwxr-sr-x 2 nexus nexus 4096 Mar 13 09:13 test-dir

這就是 SetGID 的力量 :)

現在讓我們檢查服務是否正常工作。我使用 minikube 執行 kubernetes 集群:

chris@XPS-13-9350 ~ $ minikube service nexus3-service --url
http://192.168.39.95:30390
chris@XPS-13-9350 ~ $ curl -u admin:admin123 http://192.168.39.95:30390/service/metrics/ping
pong

該服務按預期工作。

引用自:https://serverfault.com/questions/906083