kubernetes配備redis cluster


kubernetes配備redis cluster
前言
Redis clusterのクラスタ関係の維持は、ipに依存するのではなく、cluster内部の唯一のidに依存し、ipはクラスタ関係が初めて確立されたときに接続同士が使用され、メンバー接続の証明書として使用されず、代わりにidである.画外音:idを持つ限り、コンテナ再起動ipがどのように変化してもredis clusterのメンバー関係を維持することには影響しません.
ではidはどのように保存されていますか?redis clusterは、確立後、各プライマリ・スタンバイ・ノードにclusterノードのメタデータ・ファイルを保存するため、kubernetes内でpodが再起動した後、クラスタ関連のロール構成などが失われないように、このファイルを永続化する必要があるため、statefulSetを使用して配置するのに適しています.
配置
配置されたyamlファイルを直接貼り付けます.
apiVersion: v1
data:
  redis.conf: |2
        appendonly no
        save 900 1
        save 300 10
        save 60 300
        maxmemory 4GB
        maxmemory-policy allkeys-lru
        cluster-enabled yes
        cluster-config-file  /var/lib/redis/nodes.conf  # cluster node     
        #cluster-node-timeout 5000 #            
        cluster-node-timeout 500 #        500ms,            
        dir /var/lib/redis
        port 6379
kind: ConfigMap
metadata:
  name: app-rds-cluster
  namespace: default
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: app-rds-cluster
spec:
  accessModes:
  - ReadWriteMany
  resources:
    requests:
      storage: 50Gi
  storageClassName: cephfs
---
#     redis cluster       
apiVersion: v1
kind: Service
metadata:
  name: app-rds-cluster
  labels:
    app: redis
spec:
  ports:
  - name: redis-port
    port: 6379
  selector:
    app: app-rds-cluster
    appCluster: redis-cluster
---
apiVersion: apps/v1beta1
kind: StatefulSet
metadata:
  name: app-rds-cluster
spec:
  serviceName: "app-rds-cluster"
  replicas: 6
  template:
    metadata:
      labels:
        app: app-rds-cluster
        appCluster: redis-cluster
    spec:
      terminationGracePeriodSeconds: 5
      affinity:
        podAntiAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
          - weight: 100
            podAffinityTerm:
              labelSelector:
                matchExpressions:
                - key: app
                  operator: In
                  values:
                  - app-rds-cluster
              topologyKey: kubernetes.io/hostname
      containers:
      - name: redis
        env:
        - name: POD_NAME
          valueFrom:
            fieldRef:
              apiVersion: v1
              fieldPath: metadata.name
        image: redis:v4.0.14
        command:
          - "redis-server"                  #redis    
        args:
          - "/etc/redis/redis.conf"         #     
        # command: redis-server /etc/redis/redis.conf
        resources:                          #  
          requests:                         #     
            cpu: "100m"                     #m     ,   0.1  cpu  
            memory: "100Mi"                 #  100m  
          limits:                         
            cpu: "1"                        # 1  1 
            memory: "4096Mi"                 #  100m              
        ports:
            - name: redis
              containerPort: 6379
              protocol: "TCP"
            - name: cluster
              containerPort: 16379
              protocol: "TCP"
        volumeMounts:
          - name: "redis-conf"              #   configmap     
            mountPath: "/etc/redis"         
          - name: pvc
            mountPath: "/var/lib/redis"
            subPathExpr: $(POD_NAME)/data/
      nodeSelector:
        RDSDB: ''
      volumes:
      - name: "redis-conf"
        configMap:
          name: app-rds-cluster
      - name: pvc
        persistentVolumeClaim:
          claimName: app-rds-cluster


導入の説明:
  • redisプロファイルconfigmapを使用して
  • をマウント
  • には6つのノードが配置され、3つのマスター3は、公式ドキュメントで推奨される最小のクラスタ規模でもある.
  • redis cluster nodeメタデータファイルは重要です.詳細は後述します.このファイルは、pvc/hostPathなどの方法で永続化する必要があります.
  • redis-tribツールを使用してclusterを構築し、clusterを構築した後、後続のcluster関係の維持には必要ありません.
  • ネット上には、headlessサービスを含む2つのサービスが配置されており、clusterを構築する際にサービス発見として使用される.正常なサービスと、クライアントに接続して使用します.しかし、このheadlessサービスは実際には必要ありません.clusterを建てるときは手動でpod ipを1回取ればいいです.無駄なサービス
  • をもっと作る必要はありません.
    永続化に問題がないと仮定すると、正常なpodが6つあるはずです.
    [root@008019 redis-cluster]# kubectl get pods -o wide --all-namespaces | grep app-rds-cluster
    default       app-rds-cluster-0                                 1/1     Running   0          5m1s    172.36.4.43      008031   <none>           <none>
    default       app-rds-cluster-1                                 1/1     Running   0          4m58s   172.36.1.30      008020   <none>           <none>
    default       app-rds-cluster-2                                 1/1     Running   0          4m56s   172.36.6.21      020203   <none>           <none>
    default       app-rds-cluster-3                                 1/1     Running   0          4m53s   172.36.5.25      008032   <none>           <none>
    default       app-rds-cluster-4                                 1/1     Running   0          4m51s   172.36.0.198     008019   <none>           <none>
    default       app-rds-cluster-5                                 1/1     Running   0          4m48s   172.36.3.134     020204   <none>           <none>
    
    #      pod  ip,     
    [root@008019 redis-cluster]# echo `kubectl get pods -o wide --all-namespaces | grep app-rds-cluster | awk '{print $7":6379"}'`
    
    172.36.4.43:6379 172.36.1.30:6379 172.36.6.21:6379 172.36.5.25:6379 172.36.0.198:6379 172.36.3.134:6379
    

    クラスタの作成
    そのため、クラスタを構築する操作は一度だけ実行する必要があります.後続のクラスタ関係redisノード間では、ノードメタデータファイルに基づいて自動的にメンテナンスされます.そのため、クラスタの構成を初期化するための環境を専門に配置します.配置ファイルは以下の通りです.
    apiVersion: extensions/v1beta1
    kind: Deployment
    metadata:
      labels:
        app: redis-cluster-manager
      name: redis-cluster-manager
      namespace: default
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: redis-cluster-manager
      template:
        metadata:
          labels:
            app: redis-cluster-manager
        spec:
          containers:
          - command:
              - tail
            args:
              - -f
              - /dev/null
            env:
            - name: DB_NAME
              value: redis-cluster-manager
            image: centos:centos7
            imagePullPolicy: Always
            name: redis-cluster-manager
            resources:
              limits:
                cpu: 500m
                memory: 300Mi
              requests:
                cpu: 100m
                memory: 100Mi
            terminationMessagePath: /dev/termination-log
            terminationMessagePolicy: File
          dnsPolicy: ClusterFirst
          restartPolicy: Always
          schedulerName: default-scheduler
          securityContext: {}
          terminationGracePeriodSeconds: 30
    
    [root@008019 redis-cluster]# kubectl get pods -o wide --all-namespaces | grep redis-cluster-manager
    default       redis-cluster-manager-5468b99f7f-lxpw7            1/1     Running   0          87m     172.36.4.42      008031   <none>           <none>
    [root@008019 redis-cluster]# kubectl exec -it redis-cluster-manager-5468b99f7f-lxpw7 bash
    [root@redis-cluster-manager-5468b99f7f-lxpw7 /]#
    

    クラスタ構成ツールのインストール:
    cat >> /etc/yum.repos.d/epel.repo<<'EOF'
    [epel]
    name=Extra Packages for Enterprise Linux 7 - $basearch
    baseurl=https://mirrors.tuna.tsinghua.edu.cn/epel/7/$basearch
    #mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-7&arch=$basearch
    failovermethod=priority
    enabled=1
    gpgcheck=0
    gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
    EOF
    
    
    yum -y install redis-trib.noarch
    

    クラスタの初期化:
    #         pod ip,    ,      yes,    ,       
    #     ,   6   ,--replicas 1, 3   master, 3    3  slave
    redis-trib create --replicas 1 \
    172.36.4.43:6379 172.36.1.30:6379 172.36.6.21:6379 172.36.5.25:6379 172.36.0.198:6379 172.36.3.134:6379
    
    ...
    [OK] All nodes agree about slots configuration.
    >>> Check for open slots...
    >>> Check slots coverage...
    [OK] All 16384 slots covered.
    

    せつぞく
    どちらかを選択
    [root@008019 redis-cluster]# kubectl exec -it redis-cluster-manager-5468b99f7f-lxpw7 bash
    [root@redis-cluster-manager-5468b99f7f-lxpw7 /]#
    [root@redis-cluster-manager-5468b99f7f-lxpw7 /]# exit
    exit
    [root@008019 redis-cluster]# kubectl exec -it app-rds-cluster-0 bash
    
    # redis-cli  cluster   -c  
    root@app-rds-cluster-0:/var/lib/redis# redis-cli -c
    #    key
    127.0.0.1:6379> get a
    -> Redirected to slot [15495] located at 172.36.6.21:6379
    (nil)
    172.36.6.21:6379> set a 1
    OK
    172.36.6.21:6379> get a
    "1"
    #     
    172.36.6.21:6379> role
    1) "master"
    2) (integer) 1954
    3) 1) 1) "172.36.3.134"
          2) "6379"
          3) "1954"
    172.36.6.21:6379> quit
    
    #            ,    id ,    ip     , myself     
    root@app-rds-cluster-0:/var/lib/redis# cat nodes.conf
    bdcda6ce963add5bc9706e912b6fcf4b355e2add 172.36.3.134:6379@16379 slave d24da6b03aa3b614a1429847b3a47836f89dbc07 0 1578042761171 6 connected
    f85ce96851823832a9bda4233cc6e3066e97c050 172.36.5.25:6379@16379 slave 561f70b2c94c6e46f7b9588705f2cb48861b1e89 0 1578042760571 4 connected
    561f70b2c94c6e46f7b9588705f2cb48861b1e89 172.36.4.43:6379@16379 myself,master - 0 1578042760000 1 connected 0-5460
    e5c64aa60dcc73746e196b6c1630019ec0c10ad5 172.36.0.198:6379@16379 slave 7e2a3fa95ef9402bfba7b2e08a27812272640179 0 1578042760000 5 connected
    7e2a3fa95ef9402bfba7b2e08a27812272640179 172.36.1.30:6379@16379 master - 0 1578042760000 2 connected 5461-10922
    d24da6b03aa3b614a1429847b3a47836f89dbc07 172.36.6.21:6379@16379 master - 0 1578042759569 3 connected 10923-16383
    vars currentEpoch 6 lastVoteEpoch 0
    root@app-rds-cluster-0:/var/lib/redis#
    root@app-rds-cluster-0:/var/lib/redis#
    

    サービスを使用してip接続を固定するには、次の手順に従います.
    [root@008019 ~]# kubectl get service --all-namespaces | grep app-rds-cluster
    default       app-rds-cluster                        ClusterIP   10.123.80.163    <none>        6379/TCP                   48m
    
    [root@008019 ~]# kubectl exec -it redis-cluster-manager-5468b99f7f-lxpw7 bash
    [root@redis-cluster-manager-5468b99f7f-lxpw7 /]# redis-cli -h 10.123.80.163 -c
    10.123.80.163:6379> get a
    -> Redirected to slot [15495] located at 172.36.6.22:6379
    "1"
    

    プライマリ・スタンバイ・スイッチ
    高可用性クラスタとして、プライマリ・スタンバイ・スイッチングは基本的な機能であり、スイッチング・プロセスで何が起こったかを見てみましょう.
    #     master
    [root@008019 ~]# kubectl delete pod app-rds-cluster-0
    pod "app-rds-cluster-0" deleted
    [root@008019 ~]#
    [root@008019 ~]# kubectl get pods -o wide --all-namespaces | grep app-rds-cl
    default       app-rds-cluster-0                                 1/1     Running   0          20s     172.36.4.44      008031   <none>           <none>
    default       app-rds-cluster-1                                 1/1     Running   0          31m     172.36.1.30      008020   <none>           <none>
    default       app-rds-cluster-2                                 1/1     Running   0          31m     172.36.6.21      020203   <none>           <none>
    default       app-rds-cluster-3                                 1/1     Running   0          31m     172.36.5.25      008032   <none>           <none>
    default       app-rds-cluster-4                                 1/1     Running   0          31m     172.36.0.198     008019   <none>           <none>
    default       app-rds-cluster-5                                 1/1     Running   0          31m     172.36.3.134     020204   <none>           <none>
    
    #         ,redis-0 ip 172.36.4.43   172.36.4.44,           
    #     ,  master     slave,  nodes.conf  ip      ip     ,            。  ,       。
    root@app-rds-cluster-0:/var/lib/redis# cat nodes.conf
    7e2a3fa95ef9402bfba7b2e08a27812272640179 172.36.1.31:6379@16379 master - 1578044978612 1578044978607 2 connected 5461-10922
    e5c64aa60dcc73746e196b6c1630019ec0c10ad5 172.36.0.199:6379@16379 slave 7e2a3fa95ef9402bfba7b2e08a27812272640179 0 1578044978614 5 connected
    561f70b2c94c6e46f7b9588705f2cb48861b1e89 172.36.4.43:6379@16379 myself,slave f85ce96851823832a9bda4233cc6e3066e97c050 0 1578044978608 9 connected
    bdcda6ce963add5bc9706e912b6fcf4b355e2add 172.36.3.135:6379@16379 slave d24da6b03aa3b614a1429847b3a47836f89dbc07 1578044978612 1578044978608 10 connected
    f85ce96851823832a9bda4233cc6e3066e97c050 172.36.5.26:6379@16379 master - 0 1578044978614 11 connected 0-5460
    d24da6b03aa3b614a1429847b3a47836f89dbc07 172.36.6.22:6379@16379 master - 1578044978612 1578044978608 10 connected 10923-16383
    vars currentEpoch 11 lastVoteEpoch 10
    root@app-rds-cluster-0:/var/lib/redis# redis-cli -c
    127.0.0.1:6379> get a
    -> Redirected to slot [15495] located at 172.36.6.22:6379
    "1"
    

    興味があれば、複数のノードを同時に削除してみてください.6ノード、3つを主とし、raftのアルゴリズムに従って、主が掛けられた後にバックアップがあります.そのため、2主+2備以上のノードが同時に掛けられない限り、redisのサービスには影響しません.