第6章 云原生应用实战-Kubernetes部署Redis集群

第6章 云原生应用实战-Kubernetes部署Redis集群

作者:王珂
邮箱:[49186456@qq.com



前言

本节课程主要给大家介绍如何在Kubernetes中搭建Redis集群。本章介绍自定义Yaml部署单节点的Redis, 下载Chart部署主从Redis,自定义Yaml安装分片集群Redis。

版本信息

Kubernetes 1.23.0

Redis 6.2.7


一、部署单节点Redis

以下是部署一个单节点Redis的Yaml,分别定义了ConfigMap, Service, StatefulSet。需要注意的是我们Redis数据的存储,这里采用StorageClass动态申请存储卷,如果你的Kubernetes尚未配置StorageClass,可参考第2章 云原生应用实战-搭建Kubernetes环境-CSDN博客 第四节 安装StorageClass。

single-redis.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: cm-sso-redis
  namespace: dev
data:
  redis-config: |
    appendonly yes
    protected-mode no
    dir /data
    port 6379
    requirepass 123456
---
apiVersion: v1
kind: Service
metadata:
  name: svc-sso-redis
  namespace: dev
spec:
  selector:
    app: sso-redis
  type: ClusterIP
  clusterIP: None
  ports:
    - port: 6379
      targetPort: 6379 
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: sts-sso-redis
  namespace: dev
  labels:
    app: sso-redis
spec:
  serviceName: svc-sso-redis 
  replicas: 1
  selector:
    matchLabels:
      app: sso-redis
  template:
    metadata:
      labels:
        app: sso-redis
    spec:
      containers:
      - name: pod-sso-redis
        image: docker.io/library/redis:6.2.7
        command:
          - "redis-server"
        args:
          - "/etc/redis/redis.conf"
        ports:
          - name: redis-6379
            containerPort: 6379
            protocol: TCP
        volumeMounts:
        - name: config
          mountPath: /etc/redis
        - name: data
          mountPath: /data
        resources:
          limits:
            cpu: 1
            memory: 4000Mi
          requests:
            cpu: 100m
            memory: 500Mi
      volumes:
      - name: config
        configMap:
          name: cm-sso-redis
          items:
          - key: redis-config
            path: redis.conf
  volumeClaimTemplates:
  - metadata:
      name: data
      namespace: dev
    spec:
      accessModes: [ "ReadWriteOnce" ]
      storageClassName: nfs-storage 
      resources:
        requests:
          storage: 50Mi

二、部署Redis集群

2.1 部署Redis主从集群

这里我们使用helm包管理工具安装。helm库使用bitnami中的Redis。

1)添加bitnami库

helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo update

2)检索redis chart

helm search repo redis
# 结果如下
NAME                                    CHART VERSION   APP VERSION     DESCRIPTION                                       
aliyun/redis                            1.1.15          4.0.8           Open source, advanced key-value store. It is of...
aliyun/redis-ha                         2.0.1                           Highly available Redis cluster with multiple se...
bitnami/redis                           17.11.6         7.0.11          Redis(R) is an open source, advanced key-value ...
bitnami/redis-cluster                   8.6.6           7.0.11          Redis(R) is an open source, scalable, distribut...

查看安装说明

命令:helm show readme <chart名称>

helm show readme bitnami/redis-cluster
<!--- app-name: Redis® Cluster -->

# Bitnami package for Redis(R) Cluster

Redis(R) is an open source, scalable, distributed in-memory cache for applications. It can be used to store and serve data in the form of strings, hashes, lists, sets and sorted sets.

[Overview of Redis® Cluster](http://redis.io)
......

3)拉取chart

helm pull bitnami/redis

4)解压chart包

tar -xvf redis-17.11.6.tgz

5)修改配置

编辑values.yaml,修改以下几个点

global:
  storageClass: "nfs-storage" # 你的kubernetes中需要准备好storageClass
  redis:
    password: "123456"

service:
  type: NodePort

master:
  size: 10Mi

slave:
  size: 10Mi

6)创建命名空间

kubectl create ns ns-redis

7)执行安装

helm install ms-redis ./redis-17.11.6/ -n ns-redis

卸载命令

helm uninstall ms-redis -n ns-redis

helm delete ms-redis -n ns-redis

2.2.部署Redis分片集群

通过自定义Yaml文件部署Redis分片集群。需要事先安装StoarageClass, 可参考第2章 云原生应用实战-搭建Kubernetes环境-CSDN博客 第四节 安装StorageClass。

自定义redis-cluster.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: cm-sso-redis-cluster
  namespace: dev
data:
  redis-config: |
    appendonly yes
    protected-mode no
    dir /data
    port 6379
    requirepass 123456
    cluster-enabled yes
    cluster-config-file /data/nodes.conf
    masterauth 123456
    daemonize no
---
apiVersion: v1
kind: Service
metadata:
  name: svc-sso-redis-cluster
  namespace: dev
spec:
  selector:
    app: sso-redis-cluster
  type: ClusterIP
  clusterIP: None
  ports:
  - name: redis-6379
    port: 6379
    targetPort: 6379 
    protocol: TCP
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: sts-sso-redis-cluster
  namespace: dev
  labels:
    app: sso-redis-cluster
spec:
  serviceName: svc-sso-redis-cluster 
  replicas: 6
  selector:
    matchLabels:
      app: sso-redis-cluster
  template:
    metadata:
      labels:
        app: sso-redis-cluster
    spec:
      affinity:
        podAntiAffinity:
          preferredDuringSchedulingIgnoredDuringExecution: 
          - weight: 100
            podAffinityTerm:
              labelSelector:
                matchExpressions:
                - key: app
                  operator: In
                  values:
                  - sso-redis-cluster
              topologyKey: kubernetes.io/hostname
      containers:
      - name: pod-sso-redis
        image: docker.io/library/redis:6.2.7
        command:
          - "redis-server"
        args:
          - "/etc/redis/redis.conf"
          - "--protected-mode"
          - "no"
          - "--cluster-announce-ip"
          - "$(POD_IP)"
        env: # POD_IP的相关配置,如果不配置会导致线上POD重启换IP后,集群状态无法自动同步
        - name: POD_IP
          valueFrom:
            fieldRef:
              fieldPath: status.podIP
        ports:
        - name: redis-6379
          containerPort: 6379
          protocol: TCP
        volumeMounts:
        - name: config
          mountPath: /etc/redis
        - name: data
          mountPath: /data
        resources:
          limits:
            cpu: 1
            memory: 4000Mi
          requests:
            cpu: 100m
            memory: 500Mi
      volumes:
      - name: config
        configMap:
          name: cm-sso-redis-cluster 
          items:
          - key: redis-config
            path: redis.conf
  volumeClaimTemplates:
  - metadata:
      name: data
      namespace: dev
    spec:
      accessModes: [ "ReadWriteOnce" ]
      storageClassName: nfs-storage 
      resources:
        requests:
          storage: 50Mi

自动创建Redis集群

Pod创建完成之后默认不会自动创建Redis集群,需要手工执行执行集群初始化命令。

  • 自动配置3个master 3个slave集群,执行以下命令初始化集群
kubectl exec -it sts-sso-redis-cluster-0 -n dev -- redis-cli -a 123456 --cluster create --cluster-replicas 1 $(kubectl get pods -n dev -l app=sso-redis-cluster -o jsonpath='{range.items[*]}{.status.podIP}:6379 {end}')

执行之后输入yes

Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 10.244.1.59:6379 to 10.244.3.5:6379
Adding replica 10.244.2.58:6379 to 10.244.1.58:6379
Adding replica 10.244.3.6:6379 to 10.244.2.57:6379
M: 3917fd931667343b74bf8858cfb192f323dcd458 10.244.3.5:6379
   slots:[0-5460] (5461 slots) master
M: 1ed14676f99d954a485ab1329cad76e7ed23438c 10.244.1.58:6379
   slots:[5461-10922] (5462 slots) master
M: bd460c7d13105bcb922831d49eff8893ba54133f 10.244.2.57:6379
   slots:[10923-16383] (5461 slots) master
S: fdff3002903770160ac985fc0834362ac370e0df 10.244.3.6:6379
   replicates bd460c7d13105bcb922831d49eff8893ba54133f
S: 6c8c8e0bda9f8689670e8404273090003761fba8 10.244.1.59:6379
   replicates 3917fd931667343b74bf8858cfb192f323dcd458
S: 504df4d1d5b6f59e55c7b188b437fcd8ee80bdae 10.244.2.58:6379
   replicates 1ed14676f99d954a485ab1329cad76e7ed23438c
Can 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 cluster
Waiting for the cluster to join

查看集群

kubectl exec -it sts-sso-redis-cluster-0 -n dev -- redis-cli -a 123456 --cluster check $(kubectl get pods -n dev -l app=sso-redis-cluster -o jsonpath='{range.items[0]}{.status.podIP}:6379 {end}')

或者进入pod查看集群

root@sts-sso-redis-cluster-0:/data# redis-cli -a 123456
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
127.0.0.1:6379> cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:6
cluster_my_epoch:1
cluster_stats_messages_ping_sent:177
cluster_stats_messages_pong_sent:169
cluster_stats_messages_sent:346
cluster_stats_messages_ping_received:164
cluster_stats_messages_pong_received:177
cluster_stats_messages_meet_received:5
cluster_stats_messages_received:346
127.0.0.1:6379> cluster nodes
995064923579f0a997219f1319d9a9d917dc702f 10.244.3.61:6379@16379 myself,master - 0 1681661439000 1 connected 0-5460
2dc0ee3ee5b987b74d0fef55aeb4aaa284f276ee 10.244.2.84:6379@16379 master - 0 1681661441499 2 connected 5461-10922
613f53b2a3aca5ea49badd802c6c77724d5ff450 10.244.2.85:6379@16379 slave 995064923579f0a997219f1319d9a9d917dc702f 0 1681661440000 1 connected

验证pod挂掉,自动重新创建,redis集群是否正常

# 手动删除redis的一个pod
kubectl delete pod sts-sso-redis-cluster-0

查看redis集群是否正确

kubectl  get pods -l app=sso-redis-cluster -n dev -o wide

验证Server域名解析是否正常

# 使用nslookup命令验证redis的无头service是否能正常解析,如下所示,能正常解析(无头server解析返回的是后端全部pod的列表)
# service的域名表现形式:<servicename>.<namespace>.svc.<clusterdomain> 
[root@master pods]# kubectl exec -it busybox -- nslookup redis-svc.default.svc.cluster.local
Server:    10.96.0.10
Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local

Name:      redis-svc.default.svc.cluster.local
Address 1: 10.244.2.36 sts-sso-redis-cluster-0.svc-sso-redis-cluster.dev.svc.cluster.local
Address 2: 10.244.2.34 sts-sso-redis-cluster-1.svc-sso-redis-cluster.dev.svc.cluster.local
Address 3: 10.244.2.33 sts-sso-redis-cluster-2.svc-sso-redis-cluster.dev.svc.cluster.local
Address 4: 10.244.2.35 sts-sso-redis-cluster-3.svc-sso-redis-cluster.dev.svc.cluster.local
Address 5: 10.244.2.31 sts-sso-redis-cluster-4.svc-sso-redis-cluster.dev.svc.cluster.local
Address 6: 10.244.2.37 sts-sso-redis-cluster-5.svc-sso-redis-cluster.dev.svc.cluster.local

手动创建Redis集群


总结

以上就是在Kubernetes中部署Redis的内容,生产环境中在Kubernetes中部署Redis集群需要注意的事项还需根据实际情况进行处理。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是使用docker-compose部署Redis集群的步骤: 1.创建一个目录,例如redis-cluster,并在该目录中创建一个docker-compose.yaml文件。 2.在docker-compose.yaml文件中编写以下内容: ```yaml version: '3' services: redis-1: image: redis:6.0.9 command: redis-server /usr/local/etc/redis/redis.conf volumes: - ./redis.conf:/usr/local/etc/redis/redis.conf ports: - "6379" networks: - redis-cluster redis-2: image: redis:6.0.9 command: redis-server /usr/local/etc/redis/redis.conf volumes: - ./redis.conf:/usr/local/etc/redis/redis.conf ports: - "6380" networks: - redis-cluster redis-3: image: redis:6.0.9 command: redis-server /usr/local/etc/redis/redis.conf volumes: - ./redis.conf:/usr/local/etc/redis/redis.conf ports: - "6381" networks: - redis-cluster networks: redis-cluster: driver: bridge ``` 3.在redis-cluster目录中创建一个redis.conf文件,并将以下内容复制到文件中: ```conf bind 0.0.0.0 port 6379 cluster-enabled yes cluster-config-file nodes.conf cluster-node-timeout 5000 appendonly yes requirepass 1111 masterauth 1111 ``` 4.在终端中导航到redis-cluster目录,并运行以下命令启动Redis集群: ```shell docker-compose up -d ``` 5.使用以下命令进入redis-1容器: ```shell docker exec -it redis-cluster_redis-1_1 /bin/bash ``` 6.在redis-1容器中,使用以下命令创建Redis集群: ```shell redis-cli --cluster create 172.20.0.2:6379 172.20.0.3:6379 172.20.0.4:6379 --cluster-replicas 0 ``` 7.现在,您已经成功地使用docker-compose部署Redis集群
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值