暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

k8s搭建redis集群

IT那活儿 2022-04-20
2560

点击上方“IT那活儿”,关注后了解更多内容,不管IT什么活儿,干就完了!!!

注意事项
本次演示为本地测试环境,k8s集群为单节点一主两从集群;
在生产环境需要按照需求搭建。

主机规划

安装步骤
1. 默认以安装好k8s集群就不做叙述,需要准备nfs单机环境,若k8s为多master集群,可以准备nfs集群环境。
# 在master上安装nfs服务,设置开机自启动:
[root@nfs ~]# yum install nfs-utils -y[root@nfs ~]# systemctl restart nfs[root@nfs ~]# systemctl enable nfs
# 在node上安装nfs服务,注意不需要启动。
[root@k8s-master01 ~]# yum install nfs-utils -y
2. 准备共享目录,将目录以读写权限暴露给192.168.158.0/24网段中的所有主机(在生产环境应该只将共享目录暴露给集群所在机器);必须暴漏共享目录,否则在创建pod时会出现报错无法找到pv!
# 创建共享目录:
for x in $(seq 1 6);\> do \> mkdir -p data/redis-cluster/pv${x}> done
# 将共享目录暴露,暴露给指定主机将“192.168.158.0/24”改成主机ip即可。
[root@master ~]# vim /etc/exports/data/redis-cluster/pv1 192.168.158.0/24(rw,no_root_squash)/data/redis-cluster/pv2 192.168.158.0/24(rw,no_root_squash)/data/redis-cluster/pv3 192.168.158.0/24(rw,no_root_squash)/data/redis-cluster/pv4 192.168.158.0/24(rw,no_root_squash)/data/redis-cluster/pv5 192.168.158.0/24(rw,no_root_squash)/data/redis-cluster/pv6 192.168.158.0/24(rw,no_root_squash)

3. 创建6个pv,kubectl apply -f redis-pv.yaml,下面为redis-pv.yaml内容:

apiVersion: v1kind: PersistentVolume # 创建pvmetadataname: redis-pv1 # 名称speccapacity:   storage: 3Gi # 3G磁盘空间 accessModes:  - ReadWriteOnce # 权限读写 persistentVolumeReclaimPolicy: Recycle # 回收策略,清除数据 storageClassName: "redis-cluster" # 存储类别为“redis-cluster”,只能允许存储类别相同的pvc使用 nfs:   path: data/redis-cluster/pv1   server: 192.168.158.136# ...

 # 中间省略一直到redis-pv6  修改metadata:name 和 spec:nfs:path即可。

---apiVersion: v1kind: PersistentVolumemetadata: name: redis-pv6spec: capacity:   storage: 3Gi accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Recycle storageClassName: "redis-cluster"  nfs:   path: data/redis-cluster/pv6   server: 192.168.158.136
[root@master ~]# kubectl apply -f redis-pv.yaml
# 创建成功可以通过kubectl命令看到下列6个pv:
[root@master ~]# kubectl get pv NAME CAPACITY   ACCESS MODES RECLAIM POLICY STATUS CLAIM                          STORAGECLASS REASON AGEredis-pv1 3Gi RWO Recycle Bound default/data-redis-cluster-0   redis-cluster 115mredis-pv2 3Gi RWO Recycle Bound default/data-redis-cluster-2   redis-cluster 115mredis-pv3 3Gi RWO Recycle Bound default/data-redis-cluster-3   redis-cluster 115mredis-pv4 3Gi RWO Recycle Bound default/data-redis-cluster-4   redis-cluster 115mredis-pv5 3Gi RWO Recycle Bound default/data-redis-cluster-1   redis-cluster 115mredis-pv6 3Gi RWO Recycle Bound default/data-redis-cluster-5   redis-cluster 115m
4. 创建ConfigMap和StatefulSet:
---apiVersion: v1kind: ConfigMapmetadata: name: redis-clusterdata: update-node.sh: |   #!/bin/sh   REDIS_NODES="/data/nodes.conf"   sed -i -e "/myself/ s/[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}/${POD_IP}/" ${REDIS_NODES}   exec "$@" redis.conf: |+   cluster-enabled yes   cluster-require-full-coverage no   cluster-node-timeout 15000   cluster-config-file /data/nodes   cluster-migration-barrier 1   Maxmemory 3GB   port 6379   appendonly yes   protected-mode no---apiVersion: apps/v1kind: StatefulSetmetadata: name: redis-clusterspec: serviceName: redis-cluster replicas: 6 selector: # 标签选择器   matchLabels:     app: redis-cluster template: # pod创建模板   metadata:     labels:       app: redis-cluster   spec:     containers:     - name: redis       image: redis:5.0.5-alpine       ports:       - containerPort: 6379         name: client       - containerPort: 16379         name: gossip       command: ["/conf/update-node.sh", "redis-server", "/conf/redis.conf"]       env:       - name: POD_IP         valueFrom:           fieldRef:             fieldPath: status.podIP       volumeMounts:       - name: conf         mountPath: /conf         readOnly: false       - name: data         mountPath: /data         readOnly: false     volumes:     - name: conf       configMap:         name: redis-cluster         defaultMode: 0755 volumeClaimTemplates: - metadata:     name: data   spec:     accessModes: [ "ReadWriteOnce" ]     resources:       requests:         storage: 3Gi     storageClassName: redis-cluster  YAML


[root@master ~]# kubectl apply -f redis-StatefulSets.yaml# 查看[root@master ~]# kubectl get podsNAME READY STATUS RESTARTS AGEnginx-58777cc9fd-cwj77 1/1     Running 1          29hredis-cluster-0          1/1     Running 0          76mredis-cluster-1          1/1     Running 0          76mredis-cluster-2          1/1     Running 0          76mredis-cluster-3          1/1     Running 0          75mredis-cluster-4          1/1     Running 0          74mredis-cluster-5          1/1     Running 0          74m
5. 创建service对外暴露端口,kubectl apply -f redis-svc.yaml,若需要集群外机器访问,将下列yaml中type值改为NodePort即可。
---apiVersion: v1kind: Servicemetadata: name: redis-clusterspec: type: ClusterIP # 集群内部机器可访问,如需要集群外部访问,将类型改为NodePort即可 clusterIP: 10.96.97.97 # 不写会自己分配 ports: - port: 6379   targetPort: 6379   name: client - port: 16379   targetPort: 16379   name: gossip selector:   app: redis-cluster[root@master ~]# kubectl apply -f redis-svc.yaml[root@master ~]# kubectl get svcNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEredis-cluster ClusterIP 10.96.97.97     <none>        6379/TCP,16379/TCP 124m
6. 初始化redis,创建redis集群:
kubectl exec -it redis-cluster-0 -- redis-cli --cluster create --cluster-replicas 1 $(kubectl get pods -l app=redis-cluster -o jsonpath='{range.items[*]}{.status.podIP}:6379 ')[root@master ~]# kubectl exec -it redis-cluster-0 -- redis-cli --cluster create --cluster-replicas 1 $(kubectl get pods -l app=redis-cluster -o jsonpath='{range.items[*]}{.status.podIP}:6379 ')>>> Performing hash slots allocation on 6 nodes...Master[0] -> Slots 0 - 5460Master[1] -> Slots 5461 - 10922Master[2] -> Slots 10923 - 16383Adding replica 10.244.2.10:6379 to 10.244.2.8:6379Adding replica 10.244.1.10:6379 to 10.244.1.8:6379Adding replica 10.244.1.9:6379 to 10.244.2.9:6379M: aaf12abf3906e40d7c1084fa7228e99a49fc02df 10.244.2.8:6379  slots:[0-5460] (5461 slots) masterM: 547619c817623c71502e52413e46bf33bfb307bc 10.244.1.8:6379  slots:[5461-10922] (5462 slots) masterM: cd3abc406759315a814820dc0a6ce53b93a919a8 10.244.2.9:6379  slots:[10923-16383] (5461 slots) masterS: b0e40a1d30b397bacefd0f4c4d8584246ce52fc6 10.244.1.9:6379  replicates cd3abc406759315a814820dc0a6ce53b93a919a8S: d8f1a35fc156598c4d9871a607f2639206072782 10.244.2.10:6379  replicates aaf12abf3906e40d7c1084fa7228e99a49fc02dfS: 372b0086cccdcdea81be571df557b958712529a5 10.244.1.10:6379  replicates 547619c817623c71502e52413e46bf33bfb307bcCan I set the above configuration? (type 'yes' to accept): yes>>> Nodes configuration updated>>> Assign a different config epoch to each node>>> Sending CLUSTER MEET messages to join the clusterWaiting for the cluster to join......>>> Performing Cluster Check (using node 10.244.2.8:6379)M: aaf12abf3906e40d7c1084fa7228e99a49fc02df 10.244.2.8:6379  slots:[0-5460] (5461 slots) master  1 additional replica(s)S: 372b0086cccdcdea81be571df557b958712529a5 10.244.1.10:6379  slots: (0 slots) slave  replicates 547619c817623c71502e52413e46bf33bfb307bcS: d8f1a35fc156598c4d9871a607f2639206072782 10.244.2.10:6379  slots: (0 slots) slave  replicates aaf12abf3906e40d7c1084fa7228e99a49fc02dfM: 547619c817623c71502e52413e46bf33bfb307bc 10.244.1.8:6379  slots:[5461-10922] (5462 slots) master  1 additional replica(s)S: b0e40a1d30b397bacefd0f4c4d8584246ce52fc6 10.244.1.9:6379  slots: (0 slots) slave  replicates cd3abc406759315a814820dc0a6ce53b93a919a8M: cd3abc406759315a814820dc0a6ce53b93a919a8 10.244.2.9:6379  slots:[10923-16383] (5461 slots) master  1 additional replica(s)[OK] All nodes agree about slots configuration.>>> Check for open slots...>>> Check slots coverage...[OK] All 16384 slots covered.
7. 验证集群 redis-cli cluster info,可以看到集群有6个节点,创建成功。
[root@master ~]# kubectl exec -it redis-cluster-0 -- redis-cli cluster infocluster_state:okcluster_slots_assigned:16384cluster_slots_ok:16384cluster_slots_pfail:0cluster_slots_fail:0cluster_known_nodes:6cluster_size:3cluster_current_epoch:6cluster_my_epoch:1cluster_stats_messages_ping_sent:6454cluster_stats_messages_pong_sent:6664cluster_stats_messages_sent:13118cluster_stats_messages_ping_received:6664cluster_stats_messages_pong_received:6438cluster_stats_messages_received:13102
8. 配置修改,将configmap中的redis.conf修改即可,重启pod可将配置生效。
[root@master ~]# kubectl delete pods redis-cluster-0[root@master ~]# kubectl delete pods redis-cluster-1[root@master ~]# kubectl delete pods redis-cluster-2[root@master ~]# kubectl delete pods redis-cluster-3[root@master ~]# kubectl delete pods redis-cluster-4[root@master ~]# kubectl delete pods redis-cluster-5



本文作者:刘川陵

本文来源:IT那活儿(上海新炬王翦团队)

文章转载自IT那活儿,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论