Kubernetes: Heketi ile Ubuntu 22.04’te GlusterFS’yi Yapılandırma

GlusterFS, Gluster Inc tarafından geliştirilen ve şu anda Redhat tarafından sürdürülen açık kaynaklı bir yazılımdır.  Nesne, blok ve dosya depolama arayüzlerini sağlamak için kullanılır.  Yapılandırılmamış veriler için uygun maliyetli ve esnek depolama sağlar ve genellikle bulut depolama ortamı akışı ve CDN’yi içeren yüksek veri yoğunluklu iş yüklerinde kullanılır.  Şirket içinde veya bulutta dağıtılabilir ve NFS, SMB, CIFS, HTTP ve FTP dahil sayısız protokolü destekler.

Heketi, RESTful yönetim arayüzü sağlayarak Gluster Storage birimlerinin yaşam döngüsünü yönetmek için kullanılabilir.  Bu, birimlerin dinamik tedariği için GlusterFS’nin Kubernetes, OpenStack Manila ve OpenShift gibi bulut hizmetleriyle entegre olmasını kolaylaştırır.  Heketi, kümedeki tuğlaların konumlarını otomatik olarak belirler ve bunları ve kopyalarını farklı arıza alanlarına yerleştirir.  Aynı zamanda sayısız GlusterFS kümesini de destekleyerek tek bir GlusterFS kümesi sınırlaması olmaksızın ağ dosya depolaması sağlamayı mümkün kılar.  Genel olarak Heketi, sistem yöneticisinin tuğlaları, diskleri veya güvenilir depolama havuzlarını yönetmesini veya yapılandırmasını kolaylaştırır.  Bu hizmet, isteğe bağlı olarak depolama konumunun belirlenmesini sağlayan yönetici için tüm donanımı yönetir.

Bugün Heketi ile Ubuntu 22.04 üzerinde GlusterFS’nin nasıl yapılandırılacağını öğreneceğiz.

Başlangıç

Bu kılavuz için gösterildiği gibi yapılandırılmış bir ortamımız olacak:

  • GlusterFS için 3 Ubuntu 22.04 sunucusu
  • Her sunucuya bağlı 10 GB’lık 3 ikincil disk bulunur
  • sudo erişimi
  • Heketi sunuculardan birinde kurulacak

DNS sunucusu olmayanlar için her sunucuda DNS çözünürlüğü /etc/hosts konumunda yapılandırılabilir.

$ sudo vim /etc/hosts
192.168.200.90 gluster01.computingforgeeks.com  gluster01
192.168.200.91 gluster02.computingforgeeks.com  gluster02
192.168.200.92  gluster03.computingforgeeks.com  gluster03

1. NTP zaman senkronizasyonunu yapılandırma

Başlamadan önce, 3 sunucunun tümünün saatlerinin senkronize olması önemlidir.  Bu, Ağ Zaman Protokolü (NTP) veya Chrony arka plan programı kullanılarak yapılabilir.

Bunu başarmak için Chrony’nin kurulu olduğundan emin olun:

sudo apt -y install chrony

Hizmeti başlatın ve etkinleştirin:

sudo systemctl enable --now chronyd

3 sunucunun tümünde Saat Dilimini ayarlayın:

sudo timedatectl set-timezone Africa/Nairobi --adjust-system-clock
sudo timedatectl set-ntp yes

Değişiklikleri doğrulayın:

$ timedatectl 
               Local time: J5 2023-06-14 14:44:50 EAT
           Universal time: J5 2023-06-14 11:44:50 UTC
                 RTC time: J5 2023-06-14 11:44:50
                Time zone: Africa/Nairobi (EAT, +0300)
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no

2. GlusterFS paketlerini yükleyin

GlusterFS, varsayılan Ubuntu 22.04 depolarında mevcuttur.  Bu, kurulumu çok kolaylaştırır.  GlusterFS’yi Ubuntu 22.04’e kurmak için aşağıdaki komutu yürütün:

sudo apt install glusterfs-server

Kurulduktan sonra hizmetin başlatıldığından ve etkinleştirildiğinden emin olun:

sudo systemctl enable --now glusterd

Hizmetin durumunu görüntüleyin:

$ systemctl status glusterd
● glusterd.service - GlusterFS, a clustered file-system server
     Loaded: loaded (/lib/systemd/system/glusterd.service; enabled; vendor preset: enabled)
     Active: active (running) since Wed 2023-06-14 14:46:22 EAT; 4s ago
       Docs: man:glusterd(8)
    Process: 14472 ExecStart=/usr/sbin/glusterd -p /var/run/glusterd.pid --log-level $LOG_LEV>
   Main PID: 14473 (glusterd)
      Tasks: 9 (limit: 4617)
     Memory: 11.0M
        CPU: 1.481s
     CGroup: /system.slice/glusterd.service
             └─14473 /usr/sbin/glusterd -p /var/run/glusterd.pid --log-level INFO

Jun 14 14:46:21 gluster01.computingforgeeks.com systemd[1]: Starting GlusterFS,

Etkinleştirilmiş bir güvenlik duvarınız varsa, hizmetin bunun üzerinden geçmesine izin verin:

sudo ufw allow 24007/tcp

Kurulum 3 düğümün tamamında tamamlandıktan sonra kümedeki diğer düğümleri araştıracağız.  Bir düğüm gluster01 diyelim, aşağıdaki komutları yürütün:

# Perform on Node 01
sudo gluster peer probe gluster02
sudo gluster peer probe gluster03

Durumu görüntüle:

sudo gluster peer status

Örnek Çıktı:

3. Heketi’yi yükleyin

Daha önce de belirtildiği gibi Heketi, kümedeki yalnızca bir düğüme kurulacak.  Bu kılavuz için gluster01’e kuracağız.  Heketi’nin en son sürümünü GitHub sürümler sayfasından indirin.

Dosyayı şu komutla da çekebilirsiniz:

wget https://github.com/heketi/heketi/releases/download/v10.4.0/heketi-v10.4.0-release-10.linux.amd64.tar.gz

Arşivi çıkartın:

for i in `ls | grep heketi | grep .tar.gz`; do tar xvf $i; done

Çıkarılan  dosyaları PATH’inize kopyalayın:

sudo cp heketi/{heketi,heketi-cli} /usr/local/bin

Şimdi kurulumu doğrulayın:

$ heketi --version
Heketi v10.4.0-release-10 (using go: go1.15.14)

$ heketi-cli --version
heketi-cli v10.4.0-release-10

4. Heketi’yi yapılandırma

Heketi’nin kullanılabilmesi için yapmamız gereken birkaç konfigürasyon var.  Öncelikle Heketi için özel bir kullanıcı oluşturun:

sudo groupadd --system heketi
sudo useradd -s /sbin/nologin --system -g heketi heketi

Ardından Heketi için konfigürasyonları ve veri yollarını oluşturun ve oluşturun:

sudo mkdir -p /var/lib/heketi /etc/heketi /var/log/heketi
sudo cp heketi/heketi.json /etc/heketi

Artık oluşturulan yapılandırma dosyasını istediğimiz gibi değiştirebiliriz:

sudo vim /etc/heketi/heketi.json

Dosyada değiştirilebilecek çeşitli değişkenler vardır; bunlar arasında şunlar bulunur:

##Set service port##
"port": "8080"

##Set admin and use secrets##
"_jwt": "Private keys for access",
  "jwt": {
    "_admin": "Admin has access to all APIs",
    "admin": {
      "key": "jvd7df8RN7QNeKV1"
    },
    "_user": "User only has access to /volumes endpoint",
    "user": {
      "key": "lMPgdZ8NtFNj6jgk"
    }
  },

##Configure glusterfs executor##
_sshexec_comment": "SSH username and private key file information",
    "sshexec": {
      "keyfile": "/etc/heketi/heketi_key",
      "user": "root",
      "port": "22",
      "fstab": "/etc/fstab",
......
},

##database path settings
"_db_comment": "Database file name",
    "db": "/var/lib/heketi/heketi.db",
....
},

Ayrıca dosyada, gösterildiği gibi (_) ekleyerek aşağıdaki satırları yorumlayın:

    "_sshexec_comment": "SSH username and private key file information",
....
      "_xfs_sw": "Optional: Specify number of data disks in the underlying RAID device",
      "_xfs_su": "Optional: Specifies a stripe unit or RAID chunk size.",
      "_gluster_cli_timeout": "Optional: Timeout, in seconds, passed to the gluster cli invocations",
      "_debug_umount_failures": "Optional: boolean to capture more details in case brick unmounting fails",

    "_kubeexec_comment": "Kubernetes configuration",
      "_xfs_sw": "Optional: Specify number of data disks in the underlying RAID device.",
      "_xfs_su": "Optional: Specifies a stripe unit or RAID chunk size.",
      "_gluster_cli_timeout": "Optional: Timeout, in seconds, passed to the gluster cli invocations",
      "_debug_umount_failures": "Optional: boolean to capture more details in case brick unmounting fails",
.....

Root dışında bir SSH kullanıcısı kullanıyorsanız sudo için şifresiz yapılandırma yaptığınızdan emin olun.  İstenilen değişiklikler yapıldıktan sonra dosyayı kaydedin ve kullanıcı için sağlanan SSH anahtarlarını (örneğin kök) oluşturun:

sudo -i
ssh-keygen -f /etc/heketi/heketi_key -t rsa -N ''
chown heketi:heketi /etc/heketi/heketi_key*

Öncelikle, kullanıcı olarak root kullanılıyorsa 3 sunucunun tümünde root oturum açma iznine izin verildiğinden emin olun:

$ vim /etc/ssh/sshd_config
PermitRootLogin yes

Hizmeti yeniden başlatın:

sudo systemctl restart sshd

Oluşturulan ortak anahtarı şu komutu kullanarak diğer tüm GlusterFS düğümlerine kopyalayın:

for i in gluster01 gluster02 gluster03; do
 ssh-copy-id -i /etc/heketi/heketi_key.pub root@$i
done

Gluster01’den GlusterFS düğümlerine erişimi özel anahtarla doğrulayın:

root@gluster01:~# ssh -i /etc/heketi/heketi_key root@gluster02
Welcome to Ubuntu 22.04 LTS (GNU/Linux 5.19.0-41-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

460 updates can be applied immediately.
255 of these updates are standard security updates.
To see these additional updates run: apt list --upgradable

Last login: Wed Jun 14 17:10:36 2023 from 192.168.200.90
root@gluster02:~# exit

Bu SSH anahtarlarının istenildiği gibi çalıştığını gösterir.  Oturumdan çıkın ve aşağıdaki yapılandırmalara devam edin.

Heketi için bir hizmet dosyası oluşturun:

sudo vim /etc/systemd/system/heketi.service

Bu satırları dosyaya ekleyin:

[Unit]
Description=Heketi Server

[Service]
Type=simple
WorkingDirectory=/var/lib/heketi
EnvironmentFile=-/etc/heketi/heketi.env
User=heketi
ExecStart=/usr/local/bin/heketi --config=/etc/heketi/heketi.json
Restart=on-failure
StandardOutput=syslog
StandardError=syslog

[Install]
WantedBy=multi-user.target

Dosyayı kaydedin ve bir ortam dosyası indirin:

sudo wget -O /etc/heketi/heketi.env https://raw.githubusercontent.com/heketi/heketi/master/extras/systemd/heketi.env

Heketi kullanıcısı için gerekli tüm izinleri atayın:

sudo chown -R heketi:heketi /var/lib/heketi /var/log/heketi /etc/heketi

Heketi’nin ihtiyaç duyduğu tüm Çekirdek modüllerini yükleyin:

for i in dm_snapshot dm_mirror dm_thin_pool; do
  sudo modprobe $i
done

Daemon’u yeniden yükleyin ve hizmeti başlatın:

sudo systemctl daemon-reload
sudo systemctl enable --now heketi

Hizmetin çalışır durumda olup olmadığını doğrulayın:

$ systemctl status heketi
● heketi.service - Heketi Server
     Loaded: loaded (/etc/systemd/system/heketi.service; enabled; vendor preset: enabled)
     Active: active (running) since Wed 2023-06-14 17:48:36 EAT; 4s ago
   Main PID: 4545 (heketi)
      Tasks: 7 (limit: 4617)
     Memory: 5.7M
        CPU: 16ms
     CGroup: /system.slice/heketi.service
             └─4545 /usr/local/bin/heketi --config=/etc/heketi/heketi.json

Jun 14 17:48:36 gluster01.computingforgeeks.com heketi[4545]: Heketi v10.4.0-release-10 (using go: go1.15.14)
Jun 14 17:48:36 gluster01.computingforgeeks.com heketi[4545]: [heketi] INFO 2023/06/14 17:48:36 Loaded mock executor
....
Jun 14 17:48:36 gluster01.computingforgeeks.com heketi[4545]: Listening on port 8080

5. Heketi Topolojisi dosyasını oluşturun

Bu kılavuzda, JSON dosyasını manuel olarak düzenlemek yorucu olabileceğinden, Heketi topoloji dosyasını oluşturmak ve sürdürmek için Ansible komut dosyalarını kullanacağız.

Bunu kolaylaştırmak için sisteminize Ansible’ı yükleyin:

sudo apt update
sudo apt install software-properties-common
sudo apt-add-repository --yes --update ppa:ansible/ansible
sudo apt install ansible

Sonra bir proje klasörü oluşturun:

mkdir -p ~/projects/ansible/roles/heketi/{tasks,templates,defaults}

Şimdi Topoloji dosyası için şablonu oluşturun:

$ vim ~/projects/ansible/roles/heketi/templates/topology.json.j2
{
  "clusters": [
    {
      "nodes": [
      {% if gluster_servers is defined and gluster_servers is iterable %}
      {% for item in gluster_servers %}
        {
          "node": {
            "hostnames": {
              "manage": [
                "{{ item.servername }}"
              ],
              "storage": [
                "{{ item.serverip }}"
              ]
            },
            "zone": {{ item.zone }}
          },
          "devices": [
            "{{ item.disks | list | join ("\",\"") }}"
          ]
        }{% if not loop.last %},{% endif %}
    {% endfor %}
    {% endif %}
      ]
    }
  ]
}

Bu dosyayı kaydedin ve tanımlanan değerlerle eşleşen bir değişkenler dosyası oluşturun:

vim ~/projects/ansible/roles/heketi/defaults/main.yml

Gerektiğinde doğru şekilde değiştirerek aşağıdaki satırları ekleyin:

---
# GlusterFS nodes
gluster_servers:
  - servername: gluster01
    serverip: 192.168.200.90
    zone: 1
    disks:
      - /dev/sdb
      - /dev/sdc
      - /dev/sdd
  - servername: gluster02
    serverip: 192.168.200.91
    zone: 1
    disks:
      - /dev/sdb
      - /dev/sdc
      - /dev/sdd
  - servername: gluster03
    serverip: 192.168.200.92
    zone: 1
    disks:
      - /dev/sdb
      - /dev/sdc
      - /dev/sdd

Bir Ansible görevi oluşturun:

vim ~/projects/ansible/roles/heketi/tasks/main.yml

Dosyada aşağıdaki içeriği sağlayın:

---
- name: Copy heketi topology file
  template:
    src: topology.json.j2
    dest: /etc/heketi/topology.json

- name: Set proper file ownership
  file:
   path:  /etc/heketi/topology.json
   owner: heketi
   group: heketi

Ansible oynatma kitabı dosyasını oluşturun:

vim ~/projects/ansible/heketi.yml

Bu satırları dosyaya ekleyin:

---
- name: Generate Heketi topology file and copy to Heketi Server
  hosts: gluster01
  become: yes
  become_method: sudo
  roles:
    - heketi

Host dosyasını oluşturun:

$ vim ~/projects/ansible/hosts
gluster01

Dizine gidin:

cd ~/projects/ansible

Oluşturulan her şeyi görüntüleyin:

$ tree
.
├── heketi.yml
├── hosts
└── roles
    └── heketi
        ├── defaults
        │   └── main.yml
        ├── tasks
        │   └── main.yml
        └── templates
            └── topology.json.j2

5 directories, 5 files

Şimdi Ansible playbook’unu şu komutu kullanarak çalıştırın:

ansible-playbook -i hosts --user myuser --ask-pass --ask-become-pass heketi.yml

Alternatif olarak, root kullanıcısını veya sudo Passwordless kullanıcısını şu komutla kullanabilirsiniz:

ansible-playbook -i hosts --user myuser heketi.yml

Örnek Çıktı:

Artık gösterildiği gibi oluşturulmuş bir topoloji dosyanız olacak:

$ cat /etc/heketi/topology.json 
{
  "clusters": [
    {
      "nodes": [
                    {
          "node": {
            "hostnames": {
              "manage": [
                "gluster01"
              ],
              "storage": [
                "192.168.200.90"
              ]
            },
            "zone": 1
          },
          "devices": [
            "/dev/sdb","/dev/sdc","/dev/sdd"
          ]
        },            {
          "node": {
            "hostnames": {
              "manage": [
                "gluster02"
              ],
              "storage": [
                "192.168.200.91"
              ]
            },
            "zone": 1
          },
          "devices": [
            "/dev/sdb","/dev/sdc","/dev/sdd"
          ]
        },            {
          "node": {
            "hostnames": {
              "manage": [
                "gluster03"
              ],
              "storage": [
                "192.168.200.92"
              ]
            },
            "zone": 1
          },
          "devices": [
            "/dev/sdb","/dev/sdc","/dev/sdd"
          ]
        }              ]
    }
  ]
}

6. Heketi Topoloji Dosyasını Yükleme

Yukarıdaki adımlarla topoloji dosyası oluşturulduktan sonra Heketi’ye yükleyip kullanabiliriz.  CI kullanarak yüklemek için komutu aşağıdaki sözdizimiyle çalıştırın.

heketi-cli topology load --user admin --secret <heketi_admin_secret> --json=/etc/heketi/topology.json

Örneğin heketi_admin_secret’i değiştirin:

heketi-cli topology load --user admin --secret jvd7df8RN7QNeKV1 --json=/etc/heketi/topology.json

Örnek Çıktı:

Şimdi değişkenleri dışa aktarın:

$ vim ~/.bashrc
export HEKETI_CLI_SERVER=http://heketiserverip:8080
export HEKETI_CLI_USER=admin
export HEKETI_CLI_KEY="Adminsecret"

Profilin kaynağı:

source ~/.bashrc

Şimdi kümeyi görüntüleyin:

$ heketi-cli cluster list
Clusters:
Id:e36f3593c6abde17ff69665043765e17 [file][block]

Mevcut düğümleri göster:

$ heketi-cli node list
Id:111dcab88510035789f3551a359e27fe	Cluster:e36f3593c6abde17ff69665043765e17
Id:3649b21cb354e55c3588868ddfa7ff92	Cluster:e36f3593c6abde17ff69665043765e17
Id:b9dbcd4773319d28e3f265d6ab6b52b6	Cluster:e36f3593c6abde17ff69665043765e17

Düğümleri görüntülemek için aşağıdaki komutu da kullanabilirsiniz:

$ sudo gluster pool list
UUID					Hostname 	State
44c4384a-313b-4726-87c7-89622250ab83	gluster02	Connected 
d1f8f291-f2cd-4a8b-8b26-91243d192ecf	gluster03	Connected 
d1f8f291-f2cd-4a8b-8b26-91243d192ece	localhost	Connected 

Kümenin daha fazla ayrıntısını görüntüleyin

heketi-cli node info <NODE_ID>

Örneğin:

$ heketi-cli node info 111dcab88510035789f3551a359e27fe
Node Id: 111dcab88510035789f3551a359e27fe
State: online
Cluster Id: e36f3593c6abde17ff69665043765e17
Zone: 1
Management Hostname: gluster03
Storage Hostname: 192.168.200.92
Devices:
Id:1072f75242b8f7cd32d450344c2bf9b4   Name:/dev/sdd            State:online    Size (GiB):500     Used (GiB):0       Free (GiB):500     Bricks:0       
Id:49e832b9834ec185b21960f411891292   Name:/dev/sdc            State:online    Size (GiB):500     Used (GiB):0       Free (GiB):500     Bricks:0       
Id:a8aca352fb2d742e9bda4d04e48877a9   Name:/dev/sdb            State:online    Size (GiB):500     Used (GiB):0       Free (GiB):500     Bricks:0    

Gluster birimlerinin istendiği gibi çalışıp çalışmadığını doğrulamak için bir birim oluşturmak üzere Heketi’yi kullanacağız:

# heketi-cli volume create --size=1
Name: vol_e3791aa3f720f8e1e50c3d433326030f
Size: 1
Volume Id: e3791aa3f720f8e1e50c3d433326030f
Cluster Id: e36f3593c6abde17ff69665043765e17
Mount: 192.168.200.92:vol_e3791aa3f720f8e1e50c3d433326030f
Mount Options: backup-volfile-servers=192.168.200.91,192.168.200.90
Block: false
Free Size: 0
Reserved Size: 0
Block Hosting Restriction: (none)
Block Volumes: []
Durability Type: replicate
Distribute Count: 1
Replica Count: 3

Oluşturulan birimi görüntüleyin:

# heketi-cli volume list
Id:e3791aa3f720f8e1e50c3d433326030f    Cluster:e36f3593c6abde17ff69665043765e17    Name:vol_e3791aa3f720f8e1e50c3d433326030f

Topolojiyi görüntülemek için şunu yürütün:

heketi-cli topology info

Artık oyuncak ilerleyebilir ve GlusterFS’yi istediği gibi kullanabilir.

 

 

Yazının orijianlini buradan okuyabilirsiniz.

 

 

 

 

 

 

 

 

Skip to content