技術共有

[K8s インストール redis] pvc を使用しない k8s 環境に redis Sentinel クラスターをインストールします

2024-07-11

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

導入

k8s クラスターでステートフル サービスを構築するのは比較的面倒です。現在の主流の Redis 構築アプローチは、共有ストレージ ceph と nas を使用して、ノード アフィニティとホストパスを使用して実装されています。ストレージ。この記事では、ホストパス アフィニティの加重複数コピーを使用して、既存の環境とさまざまなニーズに基づいて Redis クラスターを構築し、データの永続性と Redis サービスの高可用性を実現します。

1. 条件と環境の説明:

K8s バージョン k8s-1.29.4 では、環境は通信コンピュータ ルームに構築され、各ノードには非システム ディスク SSD が /data/ パスにマウントされています。現在、redis-operator は共有ストレージを使用します。

2. 要件の説明:

  • Redis センチネル クラスターを構築します。
  • 高可用性: k8s ノードが停止した場合、またはポッドが再起動された場合でも、使用には影響しません。
  • 高パフォーマンス: ローカル ディスクの読み取りおよび書き込みにより、高パフォーマンスの IO を実現します。共有ストレージのリソースとハードウェア パフォーマンスが十分でない場合、IO がパフォーマンスのボトルネックになります。
  • データのセキュリティ: スイッチオーバーまたはノード障害の後は、データが可能な限り完全である必要があります。
  • 簡単な設置、簡単な管理とメンテナンス

3. 実装の原則と指示

    1. 1 つのマスター、2 つのスレーブ、および 3 つのセンチネル プロセスで構成される Redis センチネル クラスターを構築します。
    1. Redis は 3 つの独立したステートフルセットと 1 つのコピーをビルドに使用しますが、センチネル プロセスは 1 つのデプロイメントと 3 つのコピーをビルドに使用します。
    1. Redis プロセスは、ノード アフィニティと重みを使用してプライマリ ノードとバックアップ ノードを実装します。
    1. Redis はサービス ヘッドレス サービスを使用し、sentinel はサービス サービスを使用します。
    1. 2 台のスレーブからなり、重みに応じてアクティブとバックアップを行うグループの場合、6 つのノードのラベル名を計画する必要があります。

注: このソリューションによって構築された Redis は、k8s クラスター内でのみ使用でき、LoadBlancer または NodePort を介してクラスター外で使用するために提供することはできません。これは、Sentinel で選択されたメイン Redis の IP がスイッチ時のポッドの IP であるためです。が発生した場合、どれがメイン Redis であるかを判断できません。

4. 詳細な手順

4.1.ノードラベルの計画
ノード名役割ラベル
k8s-ワーカー-120-81ホストストレージセレクター=ノードマスター
k8s-ワーカー-120-82ホストストレージセレクター=ノードbマスター
k8s-ワーカー-120-83ホストストレージセレクター=ノードcマスター
k8s-ワーカー-120-84準備するストレージセレクター=ノードスレーブ
k8s-ワーカー-120-85準備するストレージセレクター=ノードスレーブ
k8s-ワーカー-120-86準備するストレージセレクター=ノードスレーブ

注: ここでの役割分担とは、redis には 1 つのマスターと 2 つのスレーブがあるため、各 redis ポッドは 3 つのマスター ノードに属し、マスター ノードに障害が発生すると、バックアップ ノードに切り替えられます。例: 名前は、defaultapp- です。 redis-a-0 のポッドは、デフォルトで storage-selector=node-a-master というラベルの付いたノードに配置されます。ノードに障害が発生すると、storage-selector=node-a-slve というラベルの付いたノードの重みに基づいて照合されます。ノード上で。

4.2. configmap 設定の作成

構成には 4 つのファイルが含まれており、配布の説明は次のとおりです。
Sentinel.conf: Sentinel 設定ファイル。デフォルトでは、最初の statefulset がメイン Redis として使用され、設定:solve-hostnames がホスト名をサポートします。
redis-master.conf: メインの Redis 構成ファイル。メモリは 256M に構成され、構成ポートは 6379、構成パスワードは redis#123、ストレージ パスは /data/redis です。
redis.conf: redis 構成ファイルから、メモリを 256M に構成し、ポートを 6380 に構成し、パスワードを redis#123 に構成し、ストレージ パスを /data/redis-2 に構成し、データがメインのレディス。
run.sh: 主な機能は、さまざまな構成ファイルを実行する役割を決定し、ホスト名に基づいてディレクトリを作成し、ストレージ ディレクトリにソフト接続することです。この手順は主に、新しい Redis を作成するときに、各サービスの Redis データを独自のディレクトリに保存することで、ノード上でディレクトリの競合が発生しません。

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