基于 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 #会进行自动的故障切换