Lưu trữ trong Kubernetes

theanh

Administrator
Nhân viên
Dữ liệu không thể được lưu trữ trong pod, khi pod bị xóa hoặc bị chấm dứt, dữ liệu bên trong nó không còn trên hệ thống. Để cung cấp lưu trữ tạm thời và dài hạn cho các Pod trong cụm, Kubernetes cung cấp các loại cơ chế lưu trữ khác nhau.

Trong bài viết này, chúng ta sẽ xem các ví dụ về chỉ 2 loại cơ chế lưu trữ.
  1. hostPath:
    AhostPathvolume gắn một tệp hoặc thư mục từ hệ thống tệp của nút lưu trữ vào Pod của bạn. Loại ổ đĩa này có thể được sử dụng để cho phép Pod chỉ định liệu một hostPath nhất định có nên tồn tại trước khi Pod chạy hay liệu nó có nên được tạo hay không. Kiểu volume này không phải là thứ mà hầu hết các Pod cần. Kiểu DirectoryOrCreate sẽ tạo một thư mục rỗng nếu nó không tồn tại với quyền được đặt thành 0755 và kiểu Directory giúp đảm bảo rằng một thư mục tồn tại ở đường dẫn đã cho trước khi pod đó được tạo.
  2. emptyDir:
    Một emptyDirvolume được tạo lần đầu tiên khi một Pod được gán cho một Node và tồn tại miễn là Pod đó đang chạy trên node đó. Theo mặc định, emptyDirvolume được lưu trữ trên loại lưu trữ mà môi trường của chúng ta có. Chúng ta cũng có thể đặt trường emptyDir.medium thành Memory để yêu cầu Kubernetes gắn hệ thống tệp được RAM hỗ trợ
Để biết về các cơ chế lưu trữ khác trong Kubernetes, hãy nhấp vào đây.

Điều kiện tiên quyết​

  1. Cụm Kubernetes có ít nhất 1 nút worker.
    Nếu bạn muốn tìm hiểu cách tạo Cụm Kubernetes, hãy nhấp vào đây. Hướng dẫn này sẽ giúp bạn tạo cụm Kubernetes với 1 Master và 2 Node trên AWS Ubuntu 18.04 EC2 Instances.

Chúng ta sẽ làm gì?​

  1. Tạo một pod với một volume có nhiều loại khác nhau được gắn kết trong đó

Tạo apod với một volume có nhiều loại khác nhau được gắn kết trong đó​

Host path volume withtype: Directory​

Tạo tệp định nghĩa đối tượng để gắn kết thư mục hiện có trong pod.
Mã:
vim volume-hostpath-1.yml
Mã:
apiVersion: v1kind: Podmetadata: name: volume-hostpath-example-1spec: containers: - image: nginx name: my-container volumeMounts: - mountPath: /opt/mounted-here name: my-volume-1 volumes: - name: my-volume-1 hostPath: path: /dir type: Directory


Lấy danh sách các pod và tạo một pod sẽ mount "/opt/mounted-here" trong pod trên "/dir" từ máy chủ.
Mã:
kubectl get pods
Mã:
kubectl create -f volume-hostpath-1.yml
Mã:
kubectl get pods
Mã:
kubectl describe pod volume-hostpath-example-1


Bây giờ nếu bạn mô tả thepod, bạn sẽ thấy rằng việc tạo thepod đã thất bại. Mount không thành công vì thư mục "/dir" không tồn tại trên máy chủ. Để gắn một ổ đĩa vào pod với "type: Directory", thư mục máy chủ phải tồn tại.

Bây giờ chúng ta hãy tạo một thư mục "/dir" trên máy chủ tức là trên nút worker.
Mã:
sudo mkdir /dir
Sau khi đã tạo một thư mục trên các nút worker, chúng ta có thể xóa pod đã tạo trước đó và thử tạo lại một pod mới.
Mã:
kubectl delete -f volume-hostpath-1.yml
Mã:
kubectl create -f volume-hostpath-1.yml
Mã:
kubectl get pods
Mã:
kubectl describe pod volume-hostpath-example-1


Lần này bạn có thể thấy pod đã được tạo thành công và bên dưới các ổ đĩa, đường dẫn đã gắn kết "/dir" có thể được nhìn thấy.

Bây giờ chúng ta hãy đăng nhập vào pod và tạo một file
Mã:
kubectl get pods
Mã:
kubectl exec -it volume-hostpath-example-1 /bin/bash
Mã:
touch /opt/mounted-here/new-file
Bây giờ, bạn có thể xem tệp chúng ta đã tạo trong pod từ nút worker trong thư mục mounted "/dir"
Mã:
ll /dir/ #Thực thi lệnh này trên nút worker


Lần này, hãy xóa pod chúng ta đã tạo và xem tệp đó có còn tồn tại trên thư mục host "/dir" hay không.
Mã:
exit
Mã:
kubectl get pods
Mã:
kubectl delete pod volume-hostpath-example-1
Liệt kê các tệp trong "/dir" trên nút worker.
Mã:
ll /dir/#Thực hiện lệnh này trên nút worker


Chúng ta có thể thấy rằng ngay cả sau khi xóa pod, tệp vẫn tồn tại trong "/dir" trên nút worker. Điều này có nghĩa là dữ liệu vẫn tồn tại ngay cả sau khi pod bị xóa hoặc chấm dứt.

Trong ví dụ này, chúng ta quan sát thấy rằng thư mục máy chủ cần được gắn kết trong cổng phải tồn tại.

Host path volume withtype: DirectoryOrCreate​

Để đảm bảo rằng thư mục máy chủ khả dụng trước khi gắn kết, chúng ta có thể sử dụng "type: DirectoryOrCreate" thay vì "type: Directory" trong ổ đĩa hostpath.

Tạo một tệp mới với loại "type: DirectoryOrCreate".
Mã:
vim volume-hostpath-2.yml
Mã:
apiVersion: v1kind: Podmetadata: name: volume-hostpath-example-2spec: containers: - image: nginx name: my-container volumeMounts: - mountPath: /opt/mounted-here name: my-volume-2 volumes: - name: my-volume-2 hostPath: # vị trí thư mục trên đường dẫn máy chủ: /mount-this type: DirectoryOrCreate


Lấy danh sách các pod hiện có và tạo một pod mới với tệp được tạo ở trạng thái trên.
Mã:
kubectl get pods
Mã:
kubectl create -f volume-hostpath-2.yml
Mã:
kubectl get pods
Mã:
kubectl describe pod volume-hostpath-example-2


Khi chúng ta mô tả pod, có thể thấy rằng pod đã được tạo thành công. Và thư mục "/mount-this" không tồn tại trên nút host/worker đã được tạo trên máy chủ trong khi gắn kết nó vào ổ đĩa.

Đi đến các nút worker và kiểm tra xem thư mục đã được tạo hay chưa
Mã:
ll /mount-this/#Thực hiện lệnh này trên nút worker
Bây giờ hãy tạo một tệp mới trên các nút worker trong thư mục "/mount-this" được gắn kết trong pod.
Mã:
sudo touch /mount-this/created-on-host#Thực hiện lệnh này trên nút worker
Hãy đăng nhập vào pod và kiểm tra thư mục "/opt/mounted-here/" để xem tệp "/mount-this/created-on-host" mà chúng ta đã tạo trên nút work có tồn tại trong pod không.
Mã:
kubectl get pods
Mã:
kubectl exec -it volume-hostpath-example-2 /bin/bash
Mã:
ls -l /opt/mounted-here/


Bây giờ hãy xóa pod và xem tệp có còn tồn tại trên nút worker tại "/mount-this/" không
Mã:
exit
Mã:
kubectl get pods
Mã:
kubectl delete pod volume-hostpath-example-2
Thực hiện lệnh sau để liệt kê tệp trên nút worker tại "/mount-this/"
Mã:
sudo ls -lt /mount-this/#Thực hiện lệnh này trên nút worker
Mã:
Trong ví dụ này, chúng ta thấy rằng ngay cả khi thư mục host không tồn tại, nó vẫn được tạo trên máy host trước khi được mount vào pod.

emptyDir volume​

Tạo một tệp định nghĩa đối tượng bằng cách sử dụng lệnh sau.
Mã:
vim volume-emptydir.yml
Mã:
apiVersion: v1kind: Podmetadata: name: volume-emptydir-examplespec: containers: - image: nginx name: my-container volumeMounts: - mountPath: /opt/this name: my-volume-3 volumes: - name: my-volume-3 emptyDir: {}


Lấy danh sách các pod và tạo một pod mới để gắn một volume có kiểu "emptyDir"
Mã:
kubectl get pods
Mã:
kubectl create -f volume-emptydir.yml #Tạo một đối tượng bằng cách sử dụng tệp
Mã:
kubectl get pods
Mã:
kubectl describe pod volume-emptydir-example #Lấy thông tin chi tiết về pod đã chỉ định


Trong ảnh chụp màn hình ở trên, có thể thấy pod đã được tạo và volume đã khả dụng.

Bây giờ hãy đăng nhập vào pod và tạo một thư mục theo đường dẫn gắn kết "/opt/this". Lần này, chúng ta không có bất kỳ volume nào từ máy chủ.
Mã:
kubectl exec -it volume-emptydir-example /bin/bash #Đăng nhập vào Pod


Bây giờ chúng ta có thể xóa pod nếu không còn cần thiết nữa.
Mã:
kubectl get pods #Lấy danh sách các Pod
Mã:
kubectl delete pod volume-emptydir-example #Xóa pod đã chỉ định

Kết luận​

Trong bài viết này, chúng ta đã xem các bước và tệp ví dụ để tạo pod với một volume có kiểu hostPath và emptyDir. Chúng ta đã thấy cách "type:DirectoryOrCreate" trong loại ổ đĩa hostPath có thể giúp chúng ta gắn kết một thư mục không tồn tại trên nút/máy chủ của worker.
 
Back
Bên trên