Permissions
如何在 Kubernetes Pod 中掛載具有特定 UID 的捲?
所以,我試圖讓 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
源卷的。因此,您可以設置在主容器之前啟動的
UID
byInitContainer
,只需將其添加containers
到Deployment
: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
該服務按預期工作。