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

浙公网安备 33010602011771号