kubernetes 实现Redis集群

基于 statefulset 与 pv 实现redis集群

创建NFS存储

yum install nfs-utils rpcbind -y
cat /etc/exports
/usr/local/redis/pv1 *(rw,sync,no_root_squash)
/usr/local/redis/pv2 *(rw,sync,no_root_squash)
/usr/local/redis/pv3 *(rw,sync,no_root_squash)
/usr/local/redis/pv4 *(rw,sync,no_root_squash)
/usr/local/redis/pv5 *(rw,sync,no_root_squash)
/usr/local/redis/pv6 *(rw,sync,no_root_squash)

mkdir /usr/local/redis/pv{1..6} -pv
chmod a+w -R /usr/local/redis
systemctl restart rpcbind nfs
systemctl enable nfs
exportfs -v   #查看分享目录

#客户端
yum install nfs-utils -y
showmount -e 10.61.187.24

K8S 实现 redis 集群

#创建PV,每个redis都需要一个独立的PV来存储自己的数据
vim redis-pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: nfs-pv1
spec:
  capacity:
    storage: 200M
  accessModes:
    - ReadWriteMany
  nfs:
    server: 10.61.187.24 
    path: "/usr/local/redis/pv1"
#以此类推,创建6个
 

#创建configmap 
vim redis-configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: redis-config
  namespace: default
data:
  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
 

#创建 service
#Headless service是StatefulSet实现稳定网络标识的基础,我们需要提前创建
vim redis-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: redis-service
  labels:
    app: redis
spec:
  ports:
  - name: redis-port
    port: 6379
  clusterIP: None   #无头服务
  selector:
    app: redis
    appCluster: redis-cluster
---
apiVersion: v1
kind: Service
metadata:
  name: redis-access-service   #此service用于外部访问
  labels:
    app: redis
spec:
  ports:
  - name: redis-port
    protocol: "TCP"
    port: 6379
    targetPort: 6379
  selector:
    app: redis
    appCluster: redis-cluster


#创建statefulset  Redis 集群节点
vim redis-statefulset.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: redis-app
spec:
  selector:
    matchLabels:
      app: redis
  serviceName: "redis-service"
  replicas: 6
  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:4.0.11 
        command:
          - "redis-server"
        args:
          - "/etc/redis/redis.conf"
          - "--protected-mode"
          - "no"
        resources:
          requests:
            cpu: "100m"
            memory: "100Mi"
        ports:
            - name: redis
              containerPort: 6379
              protocol: "TCP"
            - name: cluster
              containerPort: 16379
              protocol: "TCP"
        volumeMounts:
          - name: "redis-conf"
            mountPath: "/etc/redis"
          - name: "redis-data"
            mountPath: "/var/lib/redis"
      volumes:
      - name: "redis-conf"
        configMap:
          name: "redis-config"
  volumeClaimTemplates:
  - metadata:
      name: redis-data
    spec:
      accessModes: [ "ReadWriteMany" ]
      resources:
        requests:
          storage: 200M

kubectl apply -f .
kubectl get pod -o wide
kubectl get pv
kubectl get pvc
kubectl exec -it redis-app-0  cat /etc/redis/redis.conf   #导入了configmap配置

#进行集群初始化
docker pull ubuntu:18.04
mkdir /data/ubuntu/ -pv
cd /data/ubuntu/
cat sources.list    #配置好apt源
cat Dockerfile    #编写Dockerfile文件 
FROM ubuntu:18.04 
MAINTAINER  shishengyun 
ADD sources.list  /etc/apt/
RUN apt-get update 
RUN apt install -y vim wget python2.7 python-pip redis-tools dnsutils
RUN pip install redis-trib==0.5.1

docker build -t redis-trib .   #从当前目录读取dockerfile构建镜像
docker images 
kubectl run -it redis-trib --image=redis-trib --restart=Never /bin/bash
redis-trib.py create \
`dig +short redis-app-0.redis-service.default.svc.cluster.local`:6379 \
`dig +short redis-app-1.redis-service.default.svc.cluster.local`:6379 \
`dig +short redis-app-2.redis-service.default.svc.cluster.local`:6379
redis-trib.py replicate \
--master-addr `dig +short redis-app-0.redis-service.default.svc.cluster.local`:6379 \
--slave-addr `dig +short redis-app-3.redis-service.default.svc.cluster.local`:6379
redis-trib.py replicate \
--master-addr `dig +short redis-app-1.redis-service.default.svc.cluster.local`:6379 \
--slave-addr `dig +short redis-app-4.redis-service.default.svc.cluster.local`:6379
redis-trib.py replicate \
--master-addr `dig +short redis-app-2.redis-service.default.svc.cluster.local`:6379 \
--slave-addr `dig +short redis-app-5.redis-service.default.svc.cluster.local`:6379

kubectl exec -it redis-app-0 bash  
redis-cli -c 
cluster info   #k8s--redis集群搭建完毕
clusetr nodes

kubectl delete pod redis-app-2  #删除一个redis豌豆
cluster nodes  #会进行自动的故障切换
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值