k8s部署redis cluster

环境信息:

k8s:

k8s版本:1.23.17

master01:192.168.66.50

master02:192.168.66.55

master03:192.168.66.56

etcd01:192.168.66.58

etcd02:192.168.66.59

etcd03:192.168.66.57

ingress01:192.168.66.52

node01:192.168.66.51

node02:192.168.66.53

存储节点使用nfs存储:

192.168.66.40

redis是有状态的服务,所以我们在k8s部署redis cluster需要statefuset控制器部署,准备部署reids cluster是三主三从的集群

1:部署reids cluster的前期准备:

创建nfs共享存储

 在192.168.66.40服务器上部署nfs

yum  install nfs-utils rpcbind

创建共享存储目录,存储路径:

mkdir -pv /date/redis{0..5}

ls  -lh /data

[root@docker ~]# ls -lh /data
total 0
drwxr-xr-x. 2 root root 59 Jul 24 21:53 redis0
drwxr-xr-x. 2 root root 59 Jul 24 21:54 redis1
drwxr-xr-x. 2 root root 59 Jul 24 21:54 redis2
drwxr-xr-x. 2 root root 59 Jul 24 21:53 redis3
drwxr-xr-x. 2 root root 59 Jul 24 21:54 redis4
drwxr-xr-x. 2 root root 59 Jul 24 21:54 redis5

验证:在k8s上的node节点上测试,是否可以挂在nfs共享盘

# showmount -e 192.168.66.40

 

2:在k8s上面开始部署redis cluster:

a:创建pv,sc,headless service和comfigmap

pv创建,编写yaml文件,需要创建6个pv,每个redis节点挂在一个pv

---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: nfs-redis-pv0
spec:
  storageClassName: redis-sc
  capacity:
    storage: 2Gi
  accessModes:
    - ReadWriteMany
  nfs:
    server: 192.168.66.40
    path: "/data/redis0"

#kubectl apply -f redis-pv.yaml

b:创建sc,即StorageCluster类型存储,之后的pvc就是依赖于StorageCluster创建

[root@master03 redis_cluster_yaml]# vim redis-sc.yaml

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: redis-sc
provisioner: nfs-storage
~                        

c:创建 headless service,headless service是redis依赖访问的方式,必须创建

apiVersion: v1
kind: Service
metadata:
  name: redis-service
  labels:
    app: redis
spec:
  ports:
  - name: redis-service
    port: 6379
  clusterIP: None
  selector:
    app: redis
    appCluster: redis-cluster

d:创建configmap,创建的configmap主要是挂在redis配置文件

#vim redis.config

[root@master03 redis_cluster_yaml]# vim 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
bind 0.0.0.0
daemonize no

基于redis.conf创建configmap,作为redis cluster的配置文件

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

d:查看创建的svc,pv,sc,configmap

[root@master03 redis_cluster_yaml]# kubectl get pv,svc,sc,cm
NAME                             CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
persistentvolume/nfs-redis-pv0   2Gi        RWX            Retain           Available           redis-sc                27s
persistentvolume/nfs-redis-pv1   2Gi        RWX            Retain           Available           redis-sc                27s
persistentvolume/nfs-redis-pv2   2Gi        RWX            Retain           Available           redis-sc                27s
persistentvolume/nfs-redis-pv3   2Gi        RWX            Retain           Available           redis-sc                27s
persistentvolume/nfs-redis-pv4   2Gi        RWX            Retain           Available           redis-sc                27s
persistentvolume/nfs-redis-pv5   2Gi        RWX            Retain           Available           redis-sc                27s

NAME                    TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)    AGE
service/kubernetes      ClusterIP   10.96.0.1    <none>        443/TCP    33h
service/redis-service   ClusterIP   None         <none>        6379/TCP   41s

NAME                                   PROVISIONER   RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
storageclass.storage.k8s.io/redis-sc   nfs-storage   Delete          Immediate           false                  2m41s

NAME                         DATA   AGE
configmap/kube-root-ca.crt   1      33h
configmap/redis-config       1      103s

 3:创建redis pods,编写yaml文件

            podAffinityTerm:
              labelSelector:
                matchExpressions:
                - key: app
                  operator: In
                  values:
                  - redis
              topologyKey: kubernetes.io/hostname
      containers:
      - name: redis
        image: redis:6.2.6
        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"
          - name: localtime                                               #挂载本地时间
            mountPath: "/etc/localtime"
      volumes:
      - name: "redis-conf"
        configMap:
          name: "redis-config"
          items:
            - key: "redis.conf"
              path: "redis.conf"
      - name: "localtime"                                         #挂载本地时间
        hostPath:
          path: "/usr/share/zoneinfo/Asia/Shanghai"
          type: File
  volumeClaimTemplates:
  - metadata:

      name: redis-data
    spec:
      accessModes: [ "ReadWriteMany" ]
      resources:
        requests:
          storage: 2Gi
      storageClassName: redis-sc

# kubectl apply -f redis-cluster.yaml

#kubectl get pods

在default的名称空间下,创建出6个redis pods

4:在同一名称空间下,再起一个ubuntu pods,来让redis节点加入redis cluster中

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

ubuntu的版本是22.04,更换镜像仓库源,安装必须的软件包

root@ubuntu:/# cat << EOF > /etc/apt/sources.list && apt update
deb http://mirrors.ustc.edu.cn/ubuntu/ jammy main restricted universe multiverse
deb-src http://mirrors.ustc.edu.cn/ubuntu/ jammy main restricted universe multiverse
deb http://mirrors.ustc.edu.cn/ubuntu/ jammy-updates main restricted universe multiverse
deb-src http://mirrors.ustc.edu.cn/ubuntu/ jammy-updates main restricted universe multiverse
deb http://mirrors.ustc.edu.cn/ubuntu/ jammy-backports main restricted universe multiverse
deb-src http://mirrors.ustc.edu.cn/ubuntu/ jammy-backports main restricted universe multiverse
deb http://mirrors.ustc.edu.cn/ubuntu/ jammy-security main restricted universe multiverse
deb-src http://mirrors.ustc.edu.cn/ubuntu/ jammy-security main restricted universe multiverse
deb http://mirrors.ustc.edu.cn/ubuntu/ jammy-proposed main restricted universe multiverse
deb-src http://mirrors.ustc.edu.cn/ubuntu/ jammy-proposed main restricted universe multiverse
EOF

安装软件包:

# apt-get install -y libncursesw5 libreadline6 libtinfo5 --allow-remove-essential

# apt-get install -y libpython2.7-stdlib python2.7 python-pip redis-tools dnsutils

使用pip2安装组件reids cluster的工具redis-trib.py

# pip2 install redis-trib==0.5.1

使用nslookup,测试redis pods的是否能被解析

#nslookup -A redis-0.redis-service

5:使用redis-trib.py添加集群节点

/# redis-trib.py create \
  `dig +short redis-0.redis-service.default.svc.cluster.local`:6379 \
  `dig +short redis-1.redis-service.default.svc.cluster.local`:6379 \
  `dig +short redis-2.redis-service.default.svc.cluster.local`:6379

给master节点分别添加slave节点:

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

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

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

 

6:验证redis cluster是否正常

# redis-cli

127.0.0.1:6379> cluster nodes

127.0.0.1:6379> cluster info

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在 Kubernetes部署 Redis Cluster 集群,可以按照以下步骤进行: 1. 创建 Redis ConfigMap 首先,需要创建一个 Redis 配置文件 ConfigMap。可以使用以下命令创建: ``` kubectl create configmap redis-conf --from-file=redis.conf ``` 其中,`redis.conf` 是 Redis 配置文件的名称。可以根据实际情况进行修改。 2. 创建 Redis StatefulSet 接下来,可以创建 Redis StatefulSet。可以使用以下 YAML 文件作为模板: ``` apiVersion: apps/v1 kind: StatefulSet metadata: name: redis-cluster spec: serviceName: redis-cluster replicas: 6 selector: matchLabels: app: redis-cluster template: metadata: labels: app: redis-cluster spec: containers: - name: redis image: redis:6.0.9 ports: - containerPort: 6379 name: client - containerPort: 16379 name: gossip volumeMounts: - name: config mountPath: /usr/local/etc/redis/redis.conf subPath: redis.conf command: - sh - -c - | if [ -n "${POD_NAME}" ]; then sed -i "s/%cluster-name%/redis-cluster/g" /usr/local/etc/redis/redis.conf sed -i "s/%node-name%/${POD_NAME}/g" /usr/local/etc/redis/redis.conf fi volumes: - name: config configMap: name: redis-conf volumeClaimTemplates: - metadata: name: data spec: accessModes: [ "ReadWriteOnce" ] resources: requests: storage: 1Gi ``` 在上述 YAML 文件中,`replicas` 字段指定了 Redis 集群的节点数,`volumeClaimTemplates` 字段指定了每个节点的数据卷大小。另外,还需要注意以下几点: - `serviceName` 字段需要与 `metadata.name` 字段相同。 - `selector.matchLabels` 字段需要与 `metadata.labels` 字段相同。 - `command` 字段用于修改 Redis 配置文件中的节点名称和集群名称。 3. 创建 Redis Service 最后,需要创建 Redis Service。可以使用以下 YAML 文件作为模板: ``` apiVersion: v1 kind: Service metadata: name: redis-cluster labels: app: redis-cluster spec: ports: - name: client port: 6379 targetPort: 6379 - name: gossip port: 16379 targetPort: 16379 clusterIP: None selector: app: redis-cluster ``` 在上述 YAML 文件中,`clusterIP` 字段需要设置为 `None`,以便创建一个 Headless Service,让每个 Redis 节点可以通过 DNS 解析到自己的 IP 地址。 4. 部署 Redis Cluster 完成以上步骤后,可以使用以下命令部署 Redis Cluster: ``` kubectl apply -f redis-cluster.yaml ``` 其中,`redis-cluster.yaml` 是包含 Redis StatefulSet 和 Redis Service 的 YAML 文件。可以根据实际情况进行修改。 部署完成后,可以使用以下命令查看 Redis Cluster 的状态: ``` kubectl exec -it redis-cluster-0 -- redis-cli cluster nodes ``` 其中,`redis-cluster-0` 是 Redis Cluster 中的一个节点名称。可以根据实际情况进行修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值