Düğüm günlüklerine, yapılandırma dosyalarına veya paylaşılan geliştirme verilerine doğrudan erişim sağlamak için ana bilgisayar dosyalarını veya dizinlerini pod'lara bağlayın.
Nasıl çalışır
İşlem genel bakışı
Bir pod bir düğüme zamanlandıktan sonra kubelet, kapsayıcı başlamadan önce HostPath birimini bağlar. hostPath yapılandırmasındaki type değerine göre path içinde tanımlanan ana bilgisayar yolunu doğrular ve hazırlar.
DirectoryOrCreate: Ana bilgisayarpathdeğerinin var olup olmadığını kontrol eder. Yoksa kubelet ile aynı sahiplik ve gruba sahip, 0755 izinlerine sahip boş bir dizin oluşturur.Directory: Ana bilgisayarpathdeğerinin var olduğunu ve bir dizin olduğunu kontrol eder. Değilse pod başlatılamaz.FileOrCreate: Ana bilgisayarpathdeğerinin var olup olmadığını kontrol eder. Yoksa kubelet ile aynı sahiplik ve gruba sahip, 0644 izinlerine sahip boş bir dosya oluşturur.File: Ana bilgisayarpathdeğerinin var olduğunu ve bir dosya olduğunu kontrol eder. Değilse pod başlatılamaz.
Doğrulama tamamlandıktan sonra kubelet, ana bilgisayar path değerini kapsayıcıya bind-mount ile bağlar. Bağlama noktasındaki tüm okuma ve yazma işlemleri doğrudan ana bilgisayar düğümünün dosya sistemine gider.
Kullanım yöntemleri
Pod'da doğrudan HostPath birimi bağlama: Pod manifestosunun
volumesbölümündehostPathtanımını doğrudan belirtin. Basittir ancak depolamayı uygulamaya sıkıca bağlar. Uzun vadeli bakım gerektiren veya depolama değişikliklerine ihtiyaç duyabilecek üretim iş yükleri için önerilmez.PV ve PVC kullanarak HostPath birimi bağlama:
hostPathtanımını bağımsız bir PV'de belirtin; pod bu depolamayı bir PVC aracılığıyla talep eder. Depolamayı uygulamadan ayırarak pod yapılandırmasını değiştirmeden depolamayı bağımsız olarak yönetmenize olanak tanır.
Uygulanabilirlik
Yalnızca ECS düğümlerinde desteklenir. ECI ve ACS gibi sunucusuz hesaplama kaynaklarında kullanılamaz. Yerel disklerde kullanılması önerilmez.
Birinci yöntem: Doğrudan HostPath bağlama
-
pod-hostpath-direct.yamladlı bir dosya oluşturun.Düğümün
/datadizinini pod içindeki/testdizinine bağlar.apiVersion: v1 kind: Pod metadata: name: test-pod spec: containers: - image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6 name: test-container volumeMounts: - mountPath: /test name: test-volume volumes: - name: test-volume hostPath: # Specify the path on the host node. path: /data # Specify the volume type. type: DirectoryOrCreate -
Pod'u dağıtın.
kubectl apply -f pod-hostpath-direct.yaml -
Bağlamayı doğrulayın.
Pod içinde bir dosya oluşturun ve düğümde var olduğunu onaylayın.
-
Pod içinde bir dosya oluşturun.
Pod'un
/testdizininde (bağlama noktası)test.txtdosyasını oluşturun.kubectl exec test-pod -- sh -c 'echo "This file was created from within the Pod." > /test/test.txt' -
Pod'un çalıştığı düğümün adını alın.
NODE_NAME=$(kubectl get pod test-pod -o jsonpath='{.spec.nodeName}') echo "Pod is running on node: $NODE_NAME" -
Dosyayı düğümde doğrulayın.
Düğüme oturum açın ve
/datadizininde dosyanın var olup olmadığını kontrol etmek içinls /datakomutunu çalıştırın.Çıktıda
test.txtvarsa HostPath birimi başarıyla bağlanmıştır.
-
İkinci yöntem: PV ve PVC ile bağlama
-
pv-pvc-hostpath.yamladlı bir dosya oluşturun.Ana bilgisayarın
/datadizinini işaret eden bir PV, depolamayı talep eden bir PVC ve PVC'yi kullanan bir pod oluşturur.# --- PersistentVolume definition --- apiVersion: v1 kind: PersistentVolume metadata: name: hostpath-pv labels: type: local spec: capacity: storage: 10Gi accessModes: - ReadWriteOnce hostPath: path: "/data" --- # --- PersistentVolumeClaim definition --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: hostpath-pvc spec: accessModes: - ReadWriteOnce resources: requests: storage: 10Gi # Use a selector to bind the PVC to the PV created earlier. selector: matchLabels: type: local --- # --- Pod definition --- apiVersion: v1 kind: Pod metadata: name: test-pod-pvc spec: containers: - name: test-container image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6 ports: - containerPort: 80 volumeMounts: - mountPath: "/usr/share/nginx/html" name: storage volumes: - name: storage persistentVolumeClaim: # Reference the PVC defined earlier. claimName: hostpath-pvc -
PV'yi, PVC'yi ve pod'u oluşturun.
kubectl apply -f pv-pvc-hostpath.yaml -
Bağlamayı doğrulayın.
Pod içinde bir dosya oluşturun ve düğümde var olduğunu onaylayın.
-
Pod içinde bir dosya oluşturun.
Pod'un
/usr/share/nginx/htmldizininde (bağlama noktası)test.txtdosyasını oluşturun.kubectl exec test-pod-pvc -- sh -c 'echo "File from PV/PVC Pod." > /usr/share/nginx/html/test.txt' -
Pod'un çalıştığı düğümün adını alın.
NODE_NAME=$(kubectl get pod test-pod-pvc -o jsonpath='{.spec.nodeName}') echo "Pod is running on node: $NODE_NAME" -
Dosyayı düğümde doğrulayın.
Düğüme oturum açın ve
/datadizininde dosyanın var olup olmadığını kontrol etmek içinls /datakomutunu çalıştırın.Çıktıda
test.txtvarsa PV/PVC HostPath birimi başarıyla bağlanmıştır.
-
Üretim hususları
-
Güvenlik yalıtımını artırın
Salt okunur olarak bağlayın: Uygulama yalnızca düğüm verilerini okuyorsa ana bilgisayar düğümüne yanlışlıkla yazılmasını önlemek için
volumeMountsbölümündereadOnly: trueayarlayın.En az ayrıcalık ilkesini uygulayın: Kök dizini (
/) veya/etcve/vargibi hassas dizinleri bağlamaktan kaçının. Özel bir dizin kullanın.
-
Düğüm kaynaklarını izleyin
Ana bilgisayar diskini izleyin: HostPath birimine yazan kapsayıcılar düğüm disk alanını tüketir. Disk tükenmesini önlemek için disk bölümleri için izleme ve uyarı mekanizmaları kurun.
G/Ç etkisini değerlendirin: HostPath birimindeki sık okuma ve yazma işlemleri düğüm G/Ç kaynaklarını tüketir; bu durum diğer pod'ları veya kubelet kararlılığını etkileyebilir. HostPath'i üretim ortamında kullanmadan önce G/Ç etkisini değerlendirin.
-
HostPath birimi, bir pod'u belirli bir düğümün fiziksel depolama alanına bağlar. Veriler o düğüme bağlıdır ve pod başka bir yere yeniden zamanlanırsa kullanılamaz hale gelir.
-
Veritabanları veya önbellekler gibi yüksek kullanılabilirlik gerektiren durum bilgisi olan uygulamalar için uygun değildir.
Veriler yalnızca tek bir düğümde bulunur. Bir pod başka bir düğüme yeniden zamanlandığında orijinal verilere erişim kaybedilir.
Ana bilgisayar düğümünün dosya sistemine erişmek kapsayıcı yalıtımını bozar. Yanlış yapılandırılırsa (örneğin kök dizin
/bağlanırsa) veya kapsayıcıda bir güvenlik açığı varsa düğüm güvenliği ve kararlılığı tehlikeye girebilir.
ContainerOS gibi salt okunur kök dosya sistemine sahip düğümler için uygun değildir.
-
SSS
Pod yeniden oluşturulursa veriler kalıcı olur mu?
Bu, pod'un hangi düğüme zamanlandığına bağlıdır.
Aynı düğüme zamanlanırsa: Pod aynı dizini bağlar ve mevcut tüm verilere erişebilir.
Farklı bir düğüme zamanlanırsa: Pod boş bir dizini bağlar. Veriler özgün düğümde kalır ancak erişilemez hale gelir.