Kubernetes之搭建redis集群

1.  准备工作

    采用StatefulSet方式,创建三主三从的redis集群    

2.  部署过程

    1.  创建gluster存储

        1.  创建好gluster集群

        2.  在建好的集群中创建指定卷

            gluster volume create k8s_redis replica 2 node1:/gluster_data/k8s_redis node2:/gluster_data/k8s_redis node3:/gluster_data/k8s_redis node4:/gluster_data/k8s_redis

        3.  客户端挂载指定卷

            mount -t glusterfs node1:/k8s_redis /data/k8s_redis

        4.  使用客户单创建多个文件夹

            cd /data/k8s_redis/ ; mkdir redis_pv{1..6}

    2.  创建GlusterFS端点定义,指定对应的gluster集群的IP地址        

apiVersion: v1
kind: Endpoints
metadata:
  name: glusterfs-cluster
  namespace: default
subsets:
- addresses:
  - ip: 192.168.2.191
  - ip: 192.168.2.192
  - ip: 192.168.2.193
  - ip: 192.168.2.194
  ports:
  - port: 24007
    protocol: TCP  

    3.  创建glusterfs的service

kind: Service
apiVersion: v1
metadata:
  name: glusterfs-cluster
spec:
  ports:
  - port: 24007

    4.  为每个redis pod创建一个pv

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv000
spec:
  capacity:
    storage: 2Gi
  accessModes:
    - ReadWriteMany
  glusterfs:
    endpoints: "glusterfs-cluster"
    path: "/k8s_redis/redis_pv1"
    readOnly: false
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv001
spec:
  capacity:
    storage: 2Gi
  accessModes:
    - ReadWriteMany
  glusterfs:
    endpoints: "glusterfs-cluster"
    path: "/k8s_redis/redis_pv2"
    readOnly: false
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv002
spec:
  capacity:
    storage: 2Gi
  accessModes:
    - ReadWriteMany
  glusterfs:
    endpoints: "glusterfs-cluster"
    path: "/k8s_redis/redis_pv3"
    readOnly: false
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv003
spec:
  capacity:
    storage: 2Gi
  accessModes:
    - ReadWriteMany
  glusterfs:
    endpoints: "glusterfs-cluster"
    path: "/k8s_redis/redis_pv4"
    readOnly: false
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv004
spec:
  capacity:
    storage: 2Gi
  accessModes:
    - ReadWriteMany
  glusterfs:
    endpoints: "glusterfs-cluster"
    path: "/k8s_redis/redis_pv5"
    readOnly: false
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv005
spec:
  capacity:
    storage: 2Gi
  accessModes:
    - ReadWriteMany
  glusterfs:
    endpoints: "glusterfs-cluster"
    path: "/k8s_redis/redis_pv6"
    readOnly: false  

    5.  创建redis.conf文件

appendonly yes
cluster-enabled yes
cluster-config-file /var/lib/redis/nodes.conf
cluster-node-timeout 5000
dir /var/lib/redis
port 6379

    6.  创建configmap文件

        kubectl create configmap redis-conf --from-file=redis.conf 

    7.  创建Headless service,为创建下面的redis集群做好基础      

[root@master redis]# cat headless-service.yaml 
apiVersion: v1
kind: Service
metadata:
  name: redis-service
  labels:
    app: redis
spec:
  ports:
  - name: redis-port
    port: 7379
  clusterIP: None
  selector:
    app: redis
    appCluster: redis-cluster

    8.  创建redis集群

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: redis-app
spec:
  serviceName: "redis-service"
  replicas: 6
  selector:
    matchLabels:
      app: redis
  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: redis
        command:
          - "redis-server"
        args:
      - "/etc/redis/redis.conf" - "--protected-mode" - "no" resources: requests: cpu: "100m" memory: "100Mi" ports: - name: redis containerPort: 7379 protocol: "TCP" - name: cluster containerPort: 17379 protocol: "TCP" volumeMounts: - name: "redis-data" mountPath: "/data"
- name: "redis-conf"
mountPath: "/etc/redis"
volumes:
- name: "redis-conf"
configMap:
name: "redis-conf"
items:
- key: "redis-conf"
path: "redis-conf" volumeClaimTemplates: - metadata: name: redis-data spec: accessModes: ["ReadWriteMany"] resources: requests: storage: 2Gi

    9.  查看创建的pod是否安装成功

        kubectl get pods  

    10.  查看pv是否被成功绑定

[root@k8s-master redis]# kubectl get pv
NAME    CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                            STORAGECLASS   REASON   AGE
pv000   2Gi        RWX            Retain           Bound    default/redis-data-redis-app-0                           44h
pv001   2Gi        RWX            Retain           Bound    default/redis-data-redis-app-4                           44h
pv002   2Gi        RWX            Retain           Bound    default/redis-data-redis-app-1                           44h
pv003   2Gi        RWX            Retain           Bound    default/redis-data-redis-app-2                           44h
pv004   2Gi        RWX            Retain           Bound    default/redis-data-redis-app-3                           44h
pv005   2Gi        RWX            Retain           Bound    default/redis-data-redis-app-5                           44h                 

    11.  启动一个单独的容器,在该容器中安装redis-trib,专门管理redis集群

        1.  启动一个ubuntu启动

            kubectl run -it ubuntu --image=ubuntu --restart=Never /bin/bash

        2.  进入该容器,使用阿里云的ubuntu源            

root@ubuntu:/# cat > /etc/apt/sources.list << EOF
deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse

deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse

deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse

deb http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
 
deb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
EOF

        3.  安装软件环境

            apt-get update

            apt-get install -y vim wget python2.7 python-pip redis-tools dnsutils

        4.  安装redis-trib

            pip install redis-trib==0.5.1

        5.  先创建三个主节点

            redis-trib.py create `dig +short redis-app-0.redis-service.default.svc.cluster.local`:7379 `dig +short redis-app-1.redis-service.default.svc.cluster.local`:7379 `dig +short redis-app-2.redis-service.default.svc.cluster.local`:7379

        6.  为三个主节点分别创建从节点

            redis-trib.py replicate --master-addr `dig +short redis-app-0.redis-service.default.svc.cluster.local`:7379 --slave-addr `dig +short redis-app-3.redis-service.default.svc.cluster.local`:7379

            redis-trib.py replicate --master-addr `dig +short redis-app-1.redis-service.default.svc.cluster.local`:7379 --slave-addr `dig +short redis-app-4.redis-service.default.svc.cluster.local`:7379

            redis-trib.py replicate --master-addr `dig +short redis-app-2.redis-service.default.svc.cluster.local`:7379 --slave-addr `dig +short redis-app-5.redis-service.default.svc.cluster.local`:7379

    12.  创建用于访问redis集群的service        

apiVersion: v1
kind: Service
metadata:
  name: redis-access-service
  labels:
    app: redis
spec:
  ports:
  - name: redis-port
    protocol: "TCP"
    port: 7379
    targetPort: 7379
  selector:
    app: redis
    appCluster: redis-cluster

3.  测试主从切换

    1.  先登录到一台pod中,查看一下role        

127.0.0.1:7379> role
1) "master"
2) (integer) 18144
3) 1) 1) "10.244.3.9"
      2) "7379"
      3) "18144"     

    2.  将这台pod删除,然后启动之后,再登录,查看角色

        kubectl delete pod redis-app-1

root@redis-app-1:/data# redis-cli -p 7379
127.0.0.1:7379> role
1) "slave"
2) "10.244.3.9"
3) (integer) 7379
4) "connected"
5) (integer) 18298                            
posted @ 2022-07-20 16:20  奋斗史  阅读(616)  评论(0)    收藏  举报