GlusterFS sebagai penyimpanan eksternal untuk Kubernetes

gambar
Menemukan penyimpanan yang optimal adalah proses yang agak rumit, semuanya memiliki pro dan kontra. Tentu saja, pemimpin dalam kategori ini adalah CEPH, tetapi ini adalah sistem yang agak rumit, meskipun dengan fungsionalitas yang sangat kaya. Bagi kami, sistem seperti itu berlebihan, mengingat kami membutuhkan penyimpanan sederhana yang direplikasi dalam mode master-master untuk beberapa terabyte. Setelah mempelajari banyak bahan, diputuskan untuk menguji produk paling modis di pasar untuk rangkaian yang kami minati. Karena kenyataan bahwa tidak ada solusi siap dari rencana seperti itu ditemukan, saya ingin berbagi praktik terbaik saya tentang topik ini dan menggambarkan masalah yang kami temui dalam proses penyebaran.

Tujuan


Apa yang kami harapkan dari repositori baru:

  • Kemampuan untuk bekerja dengan sejumlah genap untuk replikasi.
  • Instalasi mudah, pengaturan, dukungan
  • Sistem harus dewasa, teruji waktu, dan pengguna
  • Kemampuan untuk memperluas ruang penyimpanan tanpa downtime
  • Penyimpanan harus kompatibel dengan Kubernetes
  • Seharusnya ada failover otomatis ketika salah satu node crash

Pada poin terakhir kita punya banyak pertanyaan.

Penyebaran


Untuk penyebaran, dua mesin virtual diciptakan pada CentOs 8. Masing-masing terhubung melalui disk tambahan dengan penyimpanan.

Persiapan awal


Untuk GlusterFS, Anda perlu mengalokasikan disk terpisah dengan XFS sehingga tidak mempengaruhi sistem dengan cara apa pun.

Pilih partisi:

$ fdisk /dev/sdb
Command (m for help): n
Partition type
   p   primary (0 primary, 0 extended, 4 free)
   e   extended (container for logical partitions)
Select (default p): p
Partition number (1-4, default 1):  1
First sector (2048-16777215, default 2048): 
Last sector, +sectors or +size{K,M,G,T,P} (2048-16777215, default 16777215): 
 
Created a new partition 1 of type β€˜Linux’ and of size 8 GiB.
Command (m for help): w 

The partition table has been altered.
Calling ioctl() to re-read partition table. Syncing disks.

Format dalam XFS dan mount:

$ mkfs.xfs /dev/sdb1
$ mkdir /gluster
$ mount /dev/sdb1 /gluster

Dan to top it off, letakkan entri di / etc / fstab untuk secara otomatis me-mount direktori saat startup sistem:

/dev/sdb1       /gluster        xfs     defaults        0       0

Instalasi


Mengenai instalasi, banyak artikel telah ditulis, dalam hubungan ini kita tidak akan masuk jauh ke dalam proses, kita hanya akan mempertimbangkan apa yang perlu diperhatikan.

Di kedua node, instal dan jalankan glusterfs versi terbaru:

$ wget -P /etc/yum.repos.d  https://download.gluster.org/pub/gluster/glusterfs/LATEST/CentOS/glusterfs-rhel8.repo
$ yum -y install yum-utils
$ yum-config-manager --enable PowerTools
$ yum install -y glusterfs-server
$ systemctl start glusterd

Selanjutnya, Anda perlu memberi tahu glaster di mana simpul tetangganya berada. Ini dilakukan hanya dengan satu simpul. Poin penting: jika Anda memiliki jaringan domain, maka Anda harus menentukan nama server dengan domain, jika tidak di masa depan Anda harus mengulang semuanya.

$ gluster peer probe gluster-02.example.com

Jika berhasil, maka kami memeriksa koneksi dengan perintah dari kedua server:

$ gluster peer status
Number of Peers: 1

Hostname: gluster-02.example.com
Uuid: a6de3b23-ee31-4394-8bff-0bd97bd54f46
State: Peer in Cluster (Connected)
Other names:
10.10.6.72

Sekarang Anda dapat membuat Volume di mana kami akan menulis.

gluster volume create main replica 2 gluster-01.example.com:/gluster/main gluster-02.example.com:/gluster/main force

Dimana:

  • volume nama utama
  • replika - tipe Volume (lebih jelasnya dapat ditemukan di dokumentasi resmi )
  • 2 - jumlah replika

Jalankan Volume dan periksa kinerjanya:

gluster volume start main
gluster volume status main

Untuk Volume yang direplikasi, Anda disarankan untuk mengatur parameter berikut:

$ gluster volume set main network.ping-timeout 5
$ gluster volume set main cluster.quorum-type fixed
$ gluster volume set main cluster.quorum-count 1
$ gluster volume set main performance.quick-read on

Dengan langkah-langkah sederhana ini, kami telah membangun cluster GlusterFS. Masih terhubung ke sana dan periksa kinerjanya. Ubuntu diinstal pada mesin klien, untuk pemasangan Anda perlu menginstal klien:

$ add-apt-repository ppa:gluster/glusterfs-7
$ apt install glusterfs-client
$ mkdir /gluster
$ mount.glusterfs gluster-01.example.com:/main /gluster

Gluster, ketika terhubung ke salah satu node, memberikan alamat semua node dan secara otomatis terhubung ke semua node. Jika klien telah terhubung, kegagalan salah satu node tidak akan menyebabkan berhenti. Tetapi jika node pertama tidak tersedia, itu tidak akan mungkin untuk terhubung jika terjadi sesi istirahat. Untuk melakukan ini, saat pemasangan, Anda dapat melewati parameter backupvolfile yang menunjukkan simpul kedua.
mount.glusterfs gluster-01.example.com:/main /gluster -o backupvolfile-server=gluster-02.example.com

Poin penting: gluster menyinkronkan file antar node hanya jika perubahannya melalui volume yang dipasang. Jika Anda membuat perubahan langsung pada node, file akan tidak sinkron.

Terhubung ke Kubernetes


Pada tahap ini, pertanyaan dimulai: "Bagaimana menghubungkannya?". Dan ada beberapa opsi. Pertimbangkan mereka.

Heketi


Yang paling populer dan direkomendasikan adalah menggunakan layanan eksternal: heketi. heketi adalah lapisan antara kubernetes dan gluster, yang memungkinkan Anda untuk mengelola dan bekerja dengan penyimpanan melalui http. Tapi heketi akan menjadi titik kegagalan itu, karena layanan tidak berkerumun. Contoh kedua dari layanan ini tidak akan dapat bekerja secara mandiri, karena setiap perubahan disimpan dalam database lokal. Menjalankan layanan ini di kubernetes juga tidak cocok, karena ia membutuhkan disk statis tempat database-nya akan disimpan. Dalam hal ini, opsi ini ternyata paling tidak pantas.

Titik akhir di Kubernetes


Jika Anda memiliki Kubernet pada sistem dengan manajer paket, maka ini adalah pilihan yang sangat nyaman. Intinya adalah bahwa untuk semua server GlusteFS di Kubernetes, Endpoint umum dibuat. Suatu layanan digantung pada Titik Akhir ini dan kami akan sudah terpasang pada layanan ini. Agar opsi ini berfungsi, perlu menginstal glusterfs-client pada setiap simpul Kubernetes dan memastikan bahwa ia dapat dipasang. Di Kubernetes, gunakan konfigurasi berikut:

apiVersion: v1
kind: Endpoints
metadata: 
  name: glusterfs-cluster
subsets:
  - addresses:
      #  ip  
      - ip: 10.10.6.71
    ports:
      #    1,    
      - port: 1
  - addresses:
      - ip: 10.10.6.72
    ports:
      - port: 1

---
apiVersion: v1
kind: Service
metadata:
  name: glusterfs-cluster
spec:
  ports:
  - port: 1

Sekarang kita dapat membuat penyebaran uji sederhana dan memeriksa cara kerja pemasangan. Di bawah ini adalah contoh penyebaran tes sederhana:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: gluster-test
spec:
  replicas: 1
  selector:
    matchLabels:
      app: gluster-test
  template:
    metadata:
      labels:
        app: gluster-test
    spec:
      volumes:
      - name: gluster
        glusterfs:
          endpoints: glusterfs-cluster
          path: main
      containers:
      - name: gluster-test
        image: nginx
        volumeMounts:
        - name: gluster
          mountPath: /gluster

Opsi ini tidak cocok untuk kami, karena kami memiliki container-linux di semua node Kubernetes. Pengelola paket tidak ada di sana, jadi itu tidak mungkin untuk menginstal gluster-client untuk pemasangan. Dalam hal ini, opsi ketiga ditemukan, yang diputuskan untuk digunakan.

GlusterFS + NFS + terus disimpan


Sampai baru-baru ini, GlusterFS menawarkan server NFS sendiri, tetapi sekarang layanan eksternal nfs-ganesha digunakan untuk NFS. Cukup banyak yang telah ditulis tentang ini, sehubungan dengan ini kita akan mencari cara untuk mengkonfigurasinya.

Repositori harus didaftarkan secara manual. Untuk melakukan ini, dalam file /etc/yum.repos.d/nfs-ganesha.repo kita tambahkan:

[nfs-ganesha]
name=nfs-ganesha
baseurl=https://download.nfs-ganesha.org/2.8/2.8.0/RHEL/el-8/$basearch/
enabled=1
gpgcheck=1
[nfs-ganesha-noarch]
name=nfs-ganesha-noarch
baseurl=https://download.nfs-ganesha.org/2.8/2.8.0/RHEL/el-8/noarch/
enabled=1
gpgcheck=1

Dan instal:

yum -y install nfs-ganesha-gluster --nogpgcheck

Setelah instalasi, kami melakukan konfigurasi dasar pada file /etc/ganesha/ganesha.conf.

# create new
NFS_CORE_PARAM {
    # possible to mount with NFSv3 to NFSv4 Pseudo path
    mount_path_pseudo = true;
    # NFS protocol
    Protocols = 3,4;
}
EXPORT_DEFAULTS {
    # default access mode
    Access_Type = RW;
}
EXPORT {
    # uniq ID
    Export_Id = 101;
    # mount path of Gluster Volume
    Path = "/gluster/main";
    FSAL {
        # any name
        name = GLUSTER;
        # hostname or IP address of this Node
        hostname="gluster-01.example.com";
        # Gluster volume name
        volume="main";
    }
    # config for root Squash
    Squash="No_root_squash";
    # NFSv4 Pseudo path
    Pseudo="/main";
    # allowed security options
    SecType = "sys";
}
LOG {
    # default log level
    Default_Log_Level = WARN;
}

Kita perlu memulai layanan, mengaktifkan nfs untuk volume kita dan memeriksa apakah sudah dinyalakan.

$ systemctl start nfs-ganesha
$ systemctl enable nfs-ganesha
$ gluster volume set main nfs.disable off
$ gluster volume status main

Akibatnya, statusnya harus menunjukkan bahwa server nfs telah mulai untuk volume kami. Anda perlu melakukan mount dan periksa.

mkdir /gluster-nfs
mount.nfs gluster-01.example.com:/main /gluster-nfs

Tetapi opsi ini tidak toleran terhadap kesalahan, jadi Anda perlu membuat alamat VIP yang akan melakukan perjalanan antara dua node kami dan membantu mengalihkan lalu lintas jika salah satu dari node tersebut jatuh.

Menginstal keepalived di CentOs dilakukan segera melalui manajer paket.

$ yum install -y keepalived

Kami mengkonfigurasi layanan di file /etc/keepalived/keepalived.conf:

global_defs {
    notification_email {
        admin@example.com
    }
    notification_email_from alarm@example.com
    smtp_server mail.example.com
    smtp_connect_timeout 30

    vrrp_garp_interval 10
    vrrp_garp_master_refresh 30
}

#C   ,   .    , VIP .
vrrp_script chk_gluster {
    script "pgrep glusterd"
    interval 2
}

vrrp_instance gluster {
    interface ens192
    state MASTER #     BACKUP
    priority 200 #      ,  100
    virtual_router_id 1
    virtual_ipaddress {
        10.10.6.70/24
    }

    unicast_peer {
        10.10.6.72 #        
    }

    track_script {
        chk_gluster
    }
}

Sekarang kita dapat memulai layanan dan memeriksa apakah VIP pada node muncul:

$ systemctl start keepalived
$ systemctl enable keepalived
$ ip addr
1: ens192: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:50:56:97:55:eb brd ff:ff:ff:ff:ff:ff
    inet 10.10.6.72/24 brd 10.10.6.255 scope global noprefixroute ens192
       valid_lft forever preferred_lft forever
    inet 10.10.6.70/24 scope global secondary ens192
       valid_lft forever preferred_lft forever

Jika semuanya bekerja untuk kami, maka tetap menambahkan PersistentVolume ke Kubernetes dan membuat layanan pengujian untuk memverifikasi operasi.

---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: gluster-nfs
spec:
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Retain
  nfs:
    server: 10.10.6.70
    path: /main

---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
 name: gluster-nfs
spec:
 accessModes:
 - ReadWriteMany
 resources:
   requests:
     storage: 10Gi
 volumeName: "gluster-nfs"

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: gluster-test
  labels:
    app: gluster-test
spec:
  replicas: 1
  selector:
    matchLabels:
      app: gluster-test
  template:
    metadata:
      labels:
        app: gluster-test
    spec:
      volumes:
      - name: gluster
        persistentVolumeClaim:
          claimName: gluster-nfs
      containers:
      - name: gluster-test
        image: nginx
        volumeMounts:
        - name: gluster
          mountPath: /gluster

Dengan konfigurasi ini, jika terjadi penurunan simpul utama, ia akan diam selama sekitar satu menit sampai mount jatuh dalam batas waktu dan beralih. Sederhana selama satu menit untuk penyimpanan ini, katakanlah ini bukan situasi biasa dan kita jarang akan bertemu dengannya, tetapi dalam kasus ini sistem akan secara otomatis beralih dan terus bekerja, dan kita akan dapat menyelesaikan masalah dan melakukan pemulihan tanpa khawatir tentang yang sederhana.

Ringkasan


Pada artikel ini, kami memeriksa 3 opsi yang memungkinkan untuk menghubungkan GlusterFS ke Kubernetes, dalam versi kami dimungkinkan untuk menambahkan revisioner ke Kubernetes, tetapi kami belum membutuhkannya. Masih menambahkan hasil tes kinerja antara NFS dan Gluster pada node yang sama.

File di 1Mb:

sync; dd if=/dev/zero of=tempfile bs=1M count=1024; sync
Gluster: 1073741824 bytes (1.1 GB, 1.0 GiB) copied, 2.63496 s, 407 MB/s
NFS: 1073741824 bytes (1.1 GB, 1.0 GiB) copied, 5.4527 s, 197 MB/s

File di 1Kb:

sync; dd if=/dev/zero of=tempfile bs=1K count=1048576; sync
Gluster: 1073741824 bytes (1.1 GB, 1.0 GiB) copied, 70.0508 s, 15.3 MB/s
NFS: 1073741824 bytes (1.1 GB, 1.0 GiB) copied, 6.95208 s, 154 MB/s

NFS bekerja sama untuk ukuran file apa pun, perbedaan kecepatan tidak terlalu terlihat, tidak seperti GlusterFS, yang sangat terdegradasi dengan file kecil. Tetapi pada saat yang sama, dengan ukuran file besar, NFS menunjukkan kinerja 2-3 kali lebih rendah dari Gluster.

All Articles