Berbagi teknologi

[Redis instalasi K8s] Instal cluster sentinel redis di lingkungan k8s tanpa pvc

2024-07-11

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Perkenalan

Membangun layanan stateful di kluster k8s relatif merepotkan. Pendekatan utama saat ini untuk membangun redis adalah dengan menggunakan ceph dan nas penyimpanan bersama untuk mencapai penyimpanan data yang persisten. Beberapa diimplementasikan dengan menggunakan afinitas node dan jalur host penyimpanan. Artikel ini akan menggunakan beberapa salinan afinitas jalur host yang tertimbang untuk membangun kluster redis berdasarkan lingkungan yang ada dan kebutuhan yang berbeda untuk mencapai persistensi data dan ketersediaan layanan redis yang tinggi.

1. Deskripsi kondisi dan lingkungan:

K8s versi k8s-1.29.4, lingkungan dibangun di ruang komputer telekomunikasi, dengan enam node pekerja. Setiap node memiliki disk SSD non-sistem yang dipasang ke jalur /data/ penyimpanan bersama seperti ceph atau nas digunakan. Tidak ada operator yang digunakan. Saat ini, operator redis pada dasarnya menggunakan penyimpanan bersama.

2. Deskripsi persyaratan:

  • Membangun kluster sentinel redis.
  • Ketersediaan tinggi: Jika node k8s mati atau pod di-restart, penggunaannya tidak akan terpengaruh.
  • Kinerja tinggi: Membaca dan menulis disk lokal untuk mencapai IO berkinerja tinggi. Jika sumber daya dan kinerja perangkat keras penyimpanan bersama tidak mencukupi, IO akan menjadi hambatan kinerja.
  • Keamanan data: Setelah peralihan atau kegagalan node, data harus selengkap mungkin
  • Instalasi sederhana, manajemen dan pemeliharaan mudah

3. Prinsip dan petunjuk pelaksanaan

    1. Bangun kluster sentinel redis, dengan satu proses master, dua budak, dan tiga proses sentinel.
    1. Redis menggunakan tiga statefulset independen dan satu salinan untuk dibuat, sedangkan proses sentinel menggunakan satu penerapan dan tiga salinan untuk dibuat.
    1. Proses redis menggunakan afinitas dan bobot simpul untuk mengimplementasikan simpul utama dan cadangan.
    1. Redis menggunakan layanan tanpa kepala, dan sentinel menggunakan layanan layanan.
    1. Untuk grup yang terdiri dari dua budak dan aktif serta cadangan sesuai dengan bobotnya, nama label enam node perlu direncanakan.

Catatan: Redis yang dibangun oleh solusi ini hanya dapat digunakan di dalam cluster k8s dan tidak dapat disediakan untuk digunakan di luar cluster melalui LoadBlancer atau NodePort, karena IP redis utama yang dipilih di Sentinel adalah IP pod Saat switch terjadi, tidak dapat ditentukan mana redis utamanya.

4. Langkah-langkah detail

4.1.Merencanakan label simpul
Nama simpulPeranLabel
k8s-pekerja-120-81tuan rumahpemilih-penyimpanan=simpul-a-master
k8s-pekerja-120-82tuan rumahpemilih-penyimpanan=simpul-b-master
k8s-pekerja-120-83tuan rumahpemilih-penyimpanan=simpul-c-master
k8s-pekerja-120-84Mempersiapkanpemilih-penyimpanan=simpul-a-slve
k8s-pekerja-120-85Mempersiapkanpemilih-penyimpanan=simpul-a-slve
pekerja-k8s-120-86Mempersiapkanpemilih-penyimpanan=simpul-a-slve

Catatan: Pembagian peran di sini mengacu pada: Karena redis memiliki satu master dan dua budak, setiap pod redis berada pada tiga node master. Ketika node master gagal, maka node tersebut dialihkan ke node cadangan pod redis-a-0 jatuh pada node berlabel storage-selector=node-a-master secara default. Ketika node gagal, maka node tersebut akan dicocokkan berdasarkan bobot pada node berlabel storage-selector=node-a-slve .

4.2. Buat konfigurasi configmap

Konfigurasi berisi empat file dan deskripsi distribusinya adalah sebagai berikut:
sentinel.conf: File konfigurasi sentinel. Secara default, statefulset pertama digunakan sebagai redis utama, dan konfigurasi: nama host-resolve mendukung nama host.
redis-master.conf: File konfigurasi redis utama, memori dikonfigurasikan ke 256M, port konfigurasi adalah 6379, kata sandi konfigurasi adalah redis#123, dan jalur penyimpanan adalah /data/redis.
redis.conf: Dari file konfigurasi redis, konfigurasikan memori ke 256M, konfigurasikan port ke 6380, konfigurasikan kata sandi: redis#123, jalur penyimpanan adalah /data/redis-2, dan konfigurasikan data yang akan disinkronkan dari redis utama.
run.sh: Fungsi utamanya adalah menentukan peran untuk menjalankan file konfigurasi yang berbeda, membuat direktori berdasarkan nama host, dan kemudian menyambungkan secara lembut ke direktori penyimpanan. Langkah ini terutama untuk menyimpan data redis setiap layanan di direktorinya sendiri. Saat membuat redis baru, tidak akan menyebabkan konflik direktori pada node.

apiVersion: v1
kind: ConfigMap
metadata:
  name: defaultapp-redis-config
  namespace: default-ns
  labels:
    appname: default-app
    app: defaultapp-redis-config
data:
  sentinel.conf: |
    sentinel monitor mymaster defaultapp-redis-a-0.defaultapp-redis-a.default-ns.svc.cluster.local 6379 2
    sentinel auth-pass mymaster redis#123
    sentinel down-after-milliseconds mymaster 30000
    sentinel parallel-syncs mymaster 1
    sentinel failover-timeout mymaster 180000
    SENTINEL resolve-hostnames yes
    SENTINEL announce-hostnames yes
  redis-master.conf: |
    maxmemory 256mb
    requirepass redis#123
    save 3600 1 300 10 60 100
    dir /data/redis
    masterauth redis#123
  redis.conf: |
    maxmemory 256mb
    requirepass redis#123
    save 3600 1 300 10 60 100
    dir /data/redis
    replicaof defaultapp-redis-a-0.defaultapp-redis-a.default-ns.svc.cluster.local 6379
    masterauth redis#123
  run.sh: |
    #!/bin/sh
    role=$1
    hname=$(hostname)
    if [ $role == "master" ];then
        echo "run redis master"
        [ -d /home/redis/$hname ] || mkdir -p /home/redis/$hname
        [ -d /data ] || mkdir /data
        ln -s /home/redis/$hname /data/redis
        redis-server /etc/redis/redis-master.conf
    elif [ $role == "sentinel" ];then
        echo "run redis sentinel"
        mkdir -p /etc/redis
        cp /home/redis/sentinel.conf /etc/redis/
        redis-sentinel /etc/redis/sentinel.conf
    else
        echo "run redis slave"
        [ -d /home/redis/$hname ] || mkdir -p /home/redis/$hname
        [ -d /data ] || mkdir /data
        ln -s /home/redis/$hname /data/redis
        redis-server /etc/redis/redis.conf
    fi