Bu konu, ACK ve ACS kümelerindeki Network Attached Storage (NAS) birimleriyle ilgili yaygın sorunları kapsar. Bağlama hataları, izin sorunları ve bağlantı kesme zaman aşımları ele alınmaktadır.
Hızlı gezinme
Mounting
chown: Operation not permitted during mount
Konteyner işlemi, NAS biriminde dosya sahipliğini değiştirmek için gerekli izne sahip değildir. Bu sorunu aşağıdaki yaklaşımlardan birini kullanarak çözebilirsiniz:
Root olarak çalıştırın veya
fsGroupkullanın:accessModesdeğeriReadWriteOnceolarak ayarlanmışsa, pod için birim sahipliğini belirlemek üzeresecurityContext.fsGroupparametresini yapılandırın. Ayrıntılar için bkz. Configure a security context for a pod or container.NAS izin grubunu kontrol edin: Root olarak çalıştırırken hata devam ediyorsa, bağlama hedefinin izin kuralı root kullanıcısını anonim bir kullanıcıyla eşliyor olabilir. Bunu önlemek için izin kuralını no_squash olarak ayarlayın. Ayrıntılar için bkz. Manage permission groups.
Controller task queue is full when mounting a dynamically provisioned NAS volume
StorageClass içinde reclaimPolicy değeri Delete ve archiveOnDelete değeri false olarak ayarlandığında, alt dizin silme işlemleri oluşturma işlemlerinden daha yavaş gerçekleşir. Bu durum denetleyicinin görev kuyruğunu engeller ve yeni kalıcı birimlerin (PV) oluşturulmasını önler.
StorageClass içinde archiveOnDelete değerini true olarak ayarlayın. Bu ayarla, bir PV silindiğinde ilgili alt dizinin içeriği silinmek yerine yeniden adlandırılır; bu çok daha hızlı bir işlemdir. Yeniden adlandırılan dizinleri ayrıca temizleyin; örneğin, zamanlanmış bir temizleme işi çalıştırarak veya belirli bir adlandırma desenine uyan alt dizinleri eşzamanlı olarak silen birden fazla pod kullanarak bunu yapabilirsiniz.
Mount times are longer than expected
Aşağıdaki iki koşul da sağlandığında Kubernetes, bağlı birim üzerinde yinelemeli olarak chmod ve chown komutlarını çalıştırır; bu da bağlama işlemlerini önemli ölçüde yavaşlatır:
Kalıcı birimde (PV) ve Kalıcı Birim Talebinde (PVC)
accessModesdeğeriReadWriteOnceolarak ayarlanmıştır.Pod belirtiminde
securityContext.fsGroupyapılandırılmıştır.
Aşağıdaki yaklaşımlardan birini seçin:
fsGroupöğesini kaldırın: İş yükünüz buna ihtiyaç duymuyorsasecurityContextiçindenfsGroupalanını kaldırın.İzinleri manuel olarak önceden ayarlayın: Hedef dizini bir ECS örneğine bağlayın, gerekli izinleri ayarlamak için
chownveyachmodkomutlarını çalıştırın, ardından NAS birimini Container Storage Interface (CSI) üzerinden kullanın. Bkz. Mount a statically provisioned NAS volume veya Use dynamically provisioned NAS volumes.fsGroupChangePolicykullanın (Kubernetes 1.20+): Pod'unsecurityContextbölümündefsGroupChangePolicydeğeriniOnRootMismatcholarak ayarlayın. Kubernetes bu durumdachmodvechownkomutlarını yalnızca birim ilk kez bağlandığında çalıştırır; sonraki bağlamalar çok daha hızlı olur. Ayrıntılar için bkz. Configure a security context for a pod or container.
unknown filesystem type "xxx" error during mount
Pod'un zamanlandığı düğümde gerekli depolama bağımlılıkları eksiktir. Birim yapılandırmasının doğru olduğunu doğrulayın.
Pod stuck in ContainerCreating when mounting two NAS PVCs
Bir pod, aynı NAS dosya sistemini işaret eden iki PVC'yi bağlarken ContainerCreating durumunda takılı kalıyorsa, iki PV muhtemelen aynı spec.csi.volumeHandle değerini paylaşıyor demektir. Kubelet bunları aynı PV olarak algılar ve bu da bir bağlama çakışmasına neden olur; oysa her bir PVC ayrı ayrı bağlanabilir.
Her PV için benzersiz bir spec.csi.volumeHandle değeri ayarlayın. Önerilen yaklaşım, bu değeri PV adı ile aynı olacak şekilde ayarlamaktır (metadata.name).
How do I mount a NAS file system with TLS using CSI?
NAS birimleri için TLS şifreleme, trafiği Alibaba Cloud NAS istemcisi üzerinden yönlendiren alinas bağlama protokolünü kullanır.
NAS istemcisi TLS şifreleme için Stunnel kullanır. Yüksek aktarım hızına sahip iş yükleri için bu durum önemli CPU kaynakları tüketebilir; aşırı durumlarda tek bir bağlama noktası tam bir CPU çekirdeğini kullanabilir. Ayrıntılar için bkz. Encryption in transit for NFS file systems.
Add-ons sayfasında,
AlinasMountProxy=trueFeatureGate özelliğini etkinleştirmek içincsi-pluginyapılandırmasını düzenleyin.-
Aşağıdaki YAML dosyasını kümenize uygulayın. Her iki örnek de
mountProtocol: alinasvetlsbağlama seçeneğini kullanır.Dynamically provisioned volume
apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: alicloud-nas-tls mountOptions: - nolock,tcp,noresvport - vers=3 - tls # Enable TLS encryption. parameters: volumeAs: subpath server: "0cd8b4a576-g****.cn-hangzhou.nas.aliyuncs.com:/k8s/" mountProtocol: alinas # Use the Alibaba Cloud NAS client. provisioner: nasplugin.csi.alibabacloud.com reclaimPolicy: Retain --- kind: PersistentVolumeClaim apiVersion: v1 metadata: name: nas-tls spec: accessModes: - ReadWriteMany storageClassName: alicloud-nas-tls resources: requests: storage: 20GiParameter Description parameters.mountProtocolBağlama istemcisini belirtir. Alibaba Cloud NAS istemcisini kullanmak için alinasolarak ayarlayın. Varsayılan değer""(standart NFS protokolü) şeklindedir.mountOptionsBağlama seçeneklerinin listesi. TLS şifrelemeyi etkinleştirmek için tlsekleyin.tlsseçeneği yalnızcamountProtocoldeğerialinasolarak ayarlandığında etkili olur.Statically provisioned volume
apiVersion: v1 kind: PersistentVolume metadata: name: pv-nas-tls labels: alicloud-pvname: pv-nas-tls spec: capacity: storage: 5Gi accessModes: - ReadWriteMany csi: driver: nasplugin.csi.alibabacloud.com volumeHandle: pv-nas # Must match the PV name. volumeAttributes: server: "2564f4****-ysu87.cn-shenzhen.nas.aliyuncs.com" path: "/csi" mountProtocol: alinas # Use the Alibaba Cloud NAS client. mountOptions: - nolock,tcp,noresvport - vers=3 - tls # Enable TLS encryption. --- kind: PersistentVolumeClaim apiVersion: v1 metadata: name: pvc-nas-tls spec: accessModes: - ReadWriteMany resources: requests: storage: 5Gi selector: matchLabels: alicloud-pvname: pv-nas-tlsParameter Description spec.csi.volumeAttributes.mountProtocolBağlama istemcisini belirtir. Alibaba Cloud NAS istemcisini kullanmak için alinasolarak ayarlayın. Varsayılan değer""(standart NFS protokolü) şeklindedir.spec.mountOptionsBağlama seçeneklerinin listesi. TLS şifrelemeyi etkinleştirmek için tlsekleyin.tlsseçeneği yalnızcamountProtocoldeğerialinasolarak ayarlandığında etkili olur.
How do I implement user or group isolation on NAS?
Paylaşılan bir NAS biriminde farklı kullanıcılar ve gruplar arasındaki erişimi yalıtmak için konteyner işlemlerini nobody kullanıcısı (UID/GID 65534) olarak çalıştırın.
-
İş yükü manifestinize
securityContextalanlarını ekleyin:apiVersion: apps/v1 kind: StatefulSet metadata: name: nas-sts spec: selector: matchLabels: app: nginx serviceName: "nginx" replicas: 1 template: metadata: labels: app: nginx spec: securityContext: fsGroup: 65534 # New files and directories get UID/GID 65534 (nobody). fsGroupChangePolicy: "OnRootMismatch" # Only update ownership when root directory permissions don't match. containers: - name: nginx image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6 securityContext: runAsUser: 65534 # Run all processes as UID 65534 (nobody). runAsGroup: 65534 # Run all processes with primary GID 65534 (nobody). allowPrivilegeEscalation: false volumeMounts: - name: nas-pvc mountPath: /data volumeClaimTemplates: - metadata: name: nas-pvc spec: accessModes: [ "ReadWriteOnce" ] storageClassName: "alicloud-nas-subpath" resources: requests: storage: 100Gi -
Konteyner işlemlerinin
nobodyolarak çalıştığını doğrulayın:kubectl exec nas-sts-0 -- "top"Beklenen çıktı:
Mem: 11538180K used, 52037796K free, 5052K shrd, 253696K buff, 8865272K cached CPU: 0.1% usr 0.1% sys 0.0% nic 99.7% idle 0.0% io 0.0% irq 0.0% sirq Load average: 0.76 0.60 0.58 1/1458 54 PID PPID USER STAT VSZ %VSZ CPU %CPU COMMAND 49 0 nobody R 1328 0.0 9 0.0 top 1 0 nobody S 1316 0.0 10 0.0 sleep 3600 -
NAS bağlama yolundaki yeni dosya ve dizinlerin
nobodysahipliğine sahip olduğunu doğrulayın:kubectl exec nas-sts-0 -- sh -c "touch /data/test; mkdir /data/test-dir; ls -arlth /data/"Beklenen çıktı:
total 5K drwxr-xr-x 1 root root 4.0K Aug 30 10:14 .. drwxr-sr-x 2 nobody nobody 4.0K Aug 30 10:14 test-dir -rw-r--r-- 1 nobody nobody 0 Aug 30 10:14 test drwxrwsrwx 3 root nobody 4.0K Aug 30 10:14 .
Can multiple applications share the same NAS volume?
Evet. NAS paylaşılan depolama sağladığından tek bir PVC aynı anda birden fazla pod tarafından bağlanabilir.
Eşzamanlı yazma davranışı ve bilinen sınırlamalar için bkz. How do I prevent exceptions that may occur when multiple processes or clients concurrently write data to a log file? ve How do I resolve the latency in writing data to an NFS file system?
Bağlama talimatları için bkz. Use CNFS to manage NAS file systems (recommended), Mount a statically provisioned NAS volume ve Use dynamically provisioned NAS volumes.
failed to do setup volume error when mounting a NAS volume in ACS
Bu hata genellikle NAS bağlama hedefinin kümenizden farklı bir sanal özel bulut (VPC) içinde bulunduğunu gösterir. Doğrulamak için şu adımları izleyin.
-
Kümenin VPC kimliğini alın.
ACS konsolu üzerinde oturum açın. Sol gezinme bölmesinde Clusters seçeneğine tıklayın.
Küme adına tıklayın. Sol gezinme bölmesinde Configurations > ConfigMaps seçeneklerini seçin.
kube-systemad alanına geçin veacs-profileöğesine tıklayın.vpcIddeğerini kaydedin (örneğin,vpc-gw87c9kdqs25al2z****).
-
NAS bağlama hedefinin VPC kimliğini alın.
NAS konsolu üzerinde oturum açın. Sol gezinme bölmesinde File System > File System List seçeneklerini seçin ve NAS adına tıklayın.NAS konsolu
Sol gezinme bölmesinde Mount Targets seçeneğine tıklayın. Mount Target bölümünde bağlama hedefiniz için VPC kimliğini bulun.
İki VPC kimliğini karşılaştırın. Eşleşmiyorsa NAS bağlama hedefine kümenizden erişilemiyor demektir. Doğru VPC'de bir bağlama hedefi oluşturmak veya StorageClass'ınızı doğru bağlama hedefi adresini kullanacak şekilde güncellemek için Mount NAS file systems on ACS içindeki talimatları izleyin.
Usage
Cannot create or modify directories on a NAS volume
Root olmayan bir konteyner işlemi, bağlı PV üzerinde yazma iznine sahip değildir. Bu sorunu aşağıdaki yaklaşımlardan birini kullanarak çözebilirsiniz:
Init konteyneri kullanın: PV'yi bağlayan ve bağlama dizininde gerekli izinleri ayarlamak için
chmodveyachownkomutlarını çalıştıran root izinlerine sahip bir init konteyneri başlatın.fsGroupChangePolicykullanın: Pod'unsecurityContextbölümündefsGroupChangePolicydeğeriniOnRootMismatcholarak ayarlayın. Kubernetes, birim ilk kez bağlandığında otomatik olarakchmodvechownkomutlarını çalıştırır.
NFS Stale File Handle error during read/write operations
Bu, standart NFS davranışıdır. Bir istemci bir dosyayı silerken başka bir istemci hâlâ o dosya için açık bir dosya tanımlayıcısı tutuyorsa ortaya çıkar:
A İstemcisi
/data/file.txtdosyasını açar.B İstemcisi
/data/file.txtdosyasını siler.A İstemcisi artık geçersiz olan dosya tanımlayıcısını kullanarak okuma veya yazma işlemi yapmaya çalışır ve hatayla karşılaşır.
NAS bu düzeyde veri tutarlılığını zorlamaz. Hatayı uygulama mantığınızda yönetin; örneğin, dosya kilitleme uygulayarak veya bu hata oluştuğunda dosya tanıtıcılarını yeniden açarak sorunu çözün.
Unmounting
Unmount times out and pod is stuck in Terminating state
Bağlı bir NAS birimine sahip bir pod silindiğinde ve Terminating durumunda takılı kaldığında, bunun nedeni genellikle /var/run dizininin hostPath birimi olarak bağlandığı csi-plugin DaemonSet içindeki yanlış bir yapılandırmadır.
Doğrulamak için aşağıdaki komutu çalıştırın:
kubectl get ds -n kube-system csi-plugin -ojsonpath='{.spec.template.spec.volumes[?(@.hostPath.path=="/var/run/")]}'
Komut herhangi bir çıktı döndürürse yanlış yapılandırma mevcuttur. Düzeltmek için DaemonSet'e yama uygulayın:
Bu yama csi-plugin pod'larının yeniden başlatılmasına neden olur. Bu değişikliği üretim ortamında uygulamadan önce iş yükleriniz üzerindeki etkisini değerlendirin.
kubectl patch -n kube-system daemonset csi-plugin -p '
spec:
template:
spec:
containers:
- name: csi-plugin
volumeMounts:
- mountPath: /host/var/run/efc
name: efc-metrics-dir
- mountPath: /host/var/run/ossfs
name: ossfs-metrics-dir
- mountPath: /host/var/run/
$patch: delete
volumes:
- name: ossfs-metrics-dir
hostPath:
path: /var/run/ossfs
type: DirectoryOrCreate
- name: efc-metrics-dir
hostPath:
path: /var/run/efc
type: DirectoryOrCreate
- name: fuse-metrics-dir
$patch: delete'
Yama uygulandıktan sonra csi-plugin pod'ları doğru yapılandırmayla yeniden başlar ve bağlantı kesme sorunu çözülür.