K8s1.19.6上部署Redis5.0.8 集群(6台)

一、前言

在K8s1.19.6上部署Redis5.0.8 集群,采用StatefulSet模式进行部署

二、准备操作

本次部署主要基于该项目:

https://gitee.com/overroot/redis-cluster-on-k8s

这位大佬采取的是ceph存储,但自己的环境是nfs存储故进行改动

dockerfile也是引用这位大佬的,直接从dockerhub直接拉下来一个redis.5.0.8镜像直接用就行

三、StatefulSet简介

statefulset是为了解决有状态服务的问题,而产生的一种资源类型(deployment和replicaSets是解决无状态服务而设计的)

常见的有mysql、redis、elasticsearch等等,带数据的基本上都是有状态服务;无状态服务有nginx、tomcat等等

四、部署过程

1.创建namespace
2.创建redis使用的storageclass
3.创建存储nodeip的PVC
4.创建Configmap
5.创建headless服务和对外service服务
6.创建Redis StatefulSet
7.初始化Redis集群建立三主三从

1.创建namespace

apiVersion: v1
kind: Namespace
metadata:
  name: redis

2、创建redis使用的storageclass

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: redis-storageclass
provisioner: nfs-storage-01
allowVolumeExpansion: true
reclaimPolicy: Retain

3、创建存储nodeip的PVC

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: redis-cluster-data-ips-claim
  namespace: redis
spec:
  accessModes:
     - ReadWriteMany
  storageClassName: redis-storageclass
  resources:
    requests:
      storage: 100Mi

4、创建redis的Configmap

apiVersion: v1
kind: ConfigMap
metadata:
  name: redis-conf
  namespace: redis
data:
  redis.conf: | 
    port 6379
    dir /data
    daemonize yes
    cluster-enabled yes
    cluster-node-timeout 15000
    cluster-config-file nodes.conf
    appendonly yes
    appendfilename "appendonly.aof"
    protected-mode no

5.创建headless服务和对外service服务

kind: Service
apiVersion: v1
metadata:
  name: redis-cluster-svc
  namespace: redis
  labels:
    app: redis-cluster
spec:
  selector:
    app: redis-cluster
  clusterIP: None
  ports:
    - port: 6379
      targetPort: 6379
---
apiVersion: v1
kind: Service
metadata:
  name: redis-access-service
  namespace: redis
spec:
  selector:
    app: redis-cluster
  type: NodePort
  ports:
  - name: redis-port
    protocol: "TCP"
    port: 6379
    targetPort: 6379
    nodePort: 32000

6.创建Redis StatefulSet

apiVersion: apps/v1 
kind: StatefulSet
metadata:
  name: redis-cluster
  namespace: redis
spec:
  serviceName: redis-cluster-svc
  replicas: 6
  selector:
    matchLabels:
      app: redis-cluster
  # updateStrategy:
  #   type: RollingUpdate
  podManagementPolicy: Parallel
  template:
    metadata:
      labels:
        app: redis-cluster
    spec:
      containers:
      - name: redis-cluster
        image: 192.168.238.156/redis/redis508:latest
        imagePullPolicy: Always
        command: ["/usr/local/bin/start.sh"]
        resources:
            limits:
              cpu: "0.5"
              memory: 512Mi
            requests:
              cpu: "0.1"
              memory: 100Mi
        ports:
        - containerPort: 6379
          name: port1 
          protocol: TCP
        volumeMounts:
        - name: data
          mountPath: "/data"
        - name: redis-conf
          mountPath: "/etc/redis/"
        - name: data-ips
          mountPath: "/data-ips"
        env:
          - name: TZ
            value: "Asia/Shanghai"
          - name: MY_POD_IP
            valueFrom:
              fieldRef:
                fieldPath: status.podIP
      volumes:
      - name: data-ips
        persistentVolumeClaim:
          claimName: redis-cluster-data-ips-claim
      - name: redis-conf
        configMap:
          name: redis-conf
          items:
          - key: redis.conf
            path: redis.conf
      initContainers: 
      - name: init-redis
        image: 192.168.238.156/busybox/busybox:latest
        command: 
        - sh
        - -c
        - | 
          ulimit -n 65536
          echo 511 > /proc/sys/net/core/somaxconn
          echo 'vm.overcommit_memory=1' > /etc/sysctl.conf
          mount -o remount rw /sys
          echo 'never' > /sys/kernel/mm/transparent_hugepage/enabled
          echo 'never' > /sys/kernel/mm/transparent_hugepage/defrag
        securityContext:
          privileged: true
  volumeClaimTemplates:
  - metadata:
      name: data
      labels:
        app: redis-cluster
      namespace: redis
    spec:
      accessModes: [ "ReadWriteMany" ]
      storageClassName: redis-storageclass
      resources:
        requests:
          storage: 1Gi

7.初始化Redis集群建立三主三从

因为之前重启了模拟了掉电故障所有k8s节点宕机来看看redis集群是否恢复正常,所以pod节点ip可能有出入但不影响

1、先执行命令查看redis-podip我们好对集群进行配置 

kubectl get pods -n redis -owide

 

2、 等redispod起来后进入到redis-cluster-0

kubectl exec -ti -n redis redis-cluster-0 bash

3、 配置redis集群节点之间相互发现

互相发现只需要在一个节点上操作即可,我这里选择的是redis-cluster-0

6个redis节点已经全部发现

 4、配置cluster分配槽位,redis集群部署成功!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值