ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

基于StatefulSet控制器运行Redis Cluster

2022-08-19 21:01:33  阅读:168  来源: 互联网

标签:StatefulSet name cluster Redis redis data Cluster usr local


redis集群规划

  redis0——>master

  redis1——>master

  redis2——>master

  redis3——>slave

  redis4——>slave

  redis5——>slave

 

构建镜像

       创建redis.conf

       新增集群配置和aof持久化,注意要将集群的配置文件nodes.conf放在nfs共享存储上,可以使用脚本动态修改pod ip

root@deploy:/dockerfile/project/redis-cluster# cat redis.conf 
bind 0.0.0.0
port 6379
daemonize no
pidfile /var/run/redis_6379.pid
loglevel warning
logfile "/usr/local/redis/logs/redis.log"
dbfilename dump.rdb
dir /usr/local/redis/data
save 900 1
save 5 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error no
requirepass 123456
cluster-enabled yes
cluster-config-file /usr/local/redis/data/nodes.conf
cluster-node-timeout 5000
appendonly yes
appendfilename "appendonly.aof"

 

  nfs server配置

       创建nfs共享目录

root@harbor:/data/k8sdata# mkdir redis-cluster/redis{0..5} -p

    

  配置nfs server

root@harbor:/data/k8sdata# cat /etc/exports
/data/k8sdata  *(rw,sync,no_root_squash)
root@harbor:/data/k8sdata# exportfs -r

 

  创建构建镜像脚本

root@master1:/dockerfile/project/redis-cluster# vim build-command.sh
#!/bin/bash
TAG=$1
nerdctl build -t harbor.cncf.net/project/redis:${TAG} .

nerdctl push harbor.cncf.net/project/redis:${TAG}

 

  创建Dockerfile

root@deploy:/dockerfile/project/redis-cluster# cat Dockerfile 
FROM harbor.cncf.net/os/ubuntu:20.04

ADD redis-6.2.6.tar.gz /usr/local/src

RUN cd /usr/local/src/redis-6.2.6 && \
make MALLOC=jemalloc && \
make PREFIX=/usr/local/redis install

RUN cd /usr/local/redis && \
mkdir /usr/local/redis/conf && \
mkdir /usr/local/redis/logs && \
mkdir /usr/local/redis/data

ENV PATH=$PATH:/usr/local/redis/bin

ADD redis.conf /usr/local/redis/conf/redis.conf

EXPOSE 6379

RUN rm -f /usr/local/src/redis-6.2.6.tar.gz

 

 

创建k8s资源

  使用statefulset控制器创建redis集群

       创建pv

root@master1:/dockerfile/project/redis-cluster/pv# cat redis-cluster-pv.yaml 
apiVersion: v1
kind: PersistentVolume
metadata:
  name: redis-cluster-pv0
spec:
  capacity:
    storage: 5Gi
  accessModes:
    - ReadWriteOnce
  nfs:
    server: 192.168.100.15
    path: /data/k8sdata/redis-cluster/redis0 

---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: redis-cluster-pv1
spec:
  capacity:
    storage: 5Gi
  accessModes:
    - ReadWriteOnce
  nfs:
    server: 192.168.100.15
    path: /data/k8sdata/redis-cluster/redis1

---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: redis-cluster-pv2
spec:
  capacity:
    storage: 5Gi
  accessModes:
    - ReadWriteOnce
  nfs:
    server: 192.168.100.15
    path: /data/k8sdata/redis-cluster/redis2

---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: redis-cluster-pv3
spec:
  capacity:
    storage: 5Gi
  accessModes:
    - ReadWriteOnce
  nfs:
    server: 192.168.100.15
    path: /data/k8sdata/redis-cluster/redis3 

---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: redis-cluster-pv4
spec:
  capacity:
    storage: 5Gi
  accessModes:
    - ReadWriteOnce
  nfs:
    server: 192.168.100.15
    path: /data/k8sdata/redis-cluster/redis4

---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: redis-cluster-pv5
spec:
  capacity:
    storage: 5Gi
  accessModes:
    - ReadWriteOnce
  nfs:
    server: 192.168.100.15
    path: /data/k8sdata/redis-cluster/redis5
root@master1:/dockerfile/project/redis-cluster/pv# kubectl apply -f redis-cluster-pv.yaml 
persistentvolume/redis-cluster-pv0 created
persistentvolume/redis-cluster-pv1 created
persistentvolume/redis-cluster-pv2 created
persistentvolume/redis-cluster-pv3 created
persistentvolume/redis-cluster-pv4 created
persistentvolume/redis-cluster-pv5 created

 

       查看pv

      

  创建redis statefulset控制器和svc

root@deploy:/dockerfile/project/redis-cluster# cat redis.yaml 
apiVersion: v1
kind: Service
metadata:
  name: redis
  namespace: redis-test
  labels:
    app: redis
spec:
  selector:
    app: redis
    appCluster: redis-cluster
  ports:
  - name: client
    port: 6379
    targetPort: 6379
  - name: cluster
    port: 16379
    targetPort: 16379
  clusterIP: None
  
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: redis
  namespace: redis-test
spec:
  serviceName: redis
  replicas: 6
  selector:
    matchLabels:
      app: redis
      appCluster: redis-cluster
  template:
    metadata:
      labels:
        app: redis
        appCluster: redis-cluster
    spec:
      terminationGracePeriodSeconds: 20
      affinity:
        podAntiAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
          - weight: 100
            podAffinityTerm:
              labelSelector:
                matchExpressions:
                - key: app
                  operator: In
                  values:
                  - redis
              topologyKey: kubernetes.io/hostname
      containers:
      - name: redis
        image: harbor.cncf.net/project/redis:6.2.6
        imagePullPolicy: Always
        command: ["redis-server", "/usr/local/redis/conf/redis.conf"]
        env:
        - name: POD_IP
          valueFrom:
            fieldRef:
              fieldPath: status.podIP
        resources:
          requests:
            cpu: "500m"
            memory: "500Mi"
        ports:
        - containerPort: 6379
          name: redis
          protocol: TCP
        - containerPort: 16379
          name: cluster
          protocol: TCP
        volumeMounts:
        - name: data
          mountPath: /usr/local/redis/data
  volumeClaimTemplates:
  - metadata:
      name: data
      namespace: redis-test
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 5Gi

 

       查看pods

     

    查看pvc

   初始化redis创建集群

       进入data-redis-0 pod

root@master1:/dockerfile/project/redis-cluster# kubectl exec -it redis-0 -- bash

 

       安装dig

root@redis-0:/# apt install dnsutils -y 

 

  初始化命令

redis-cli -a 123456 --cluster create --cluster-replicas 1 \
`dig +short redis-0.redis.redis-test.svc.cluster.local`:6379 \
`dig +short redis-1.redis.redis-test.svc.cluster.local`:6379 \
`dig +short redis-2.redis.redis-test.svc.cluster.local`:6379 \
`dig +short redis-3.redis.redis-test.svc.cluster.local`:6379 \
`dig +short redis-4.redis.redis-test.svc.cluster.local`:6379 \
`dig +short redis-5.redis.redis-test.svc.cluster.local`:6379

 

       创建redis集群

   

  验证node节点对应redis角色

   

  对应关系

  10.200.166.138——redis-0 master

  10.200.104.16——redis-1 master

  10.200.166.140——redis-2 master

  10.200.104.20——redis-3 slave

  10.200.166.141——redis-4 slave

  10.200.104.21——redis-5 slave

 

 

  

  查看集群状态信息

      

  登录集群节点验证写入数据

      

  故障测试:

       删除slave节点pod,验证redis集群自动更换pod ip。

       删除pod前,记录pod原IP

 

      

  删除后验证新pod ip已经从新加入集群

 

标签:StatefulSet,name,cluster,Redis,redis,data,Cluster,usr,local
来源: https://www.cnblogs.com/punchlinux/p/16603186.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有