k8s容器化搭建redis集群

这篇具有很好参考价值的文章主要介绍了k8s容器化搭建redis集群。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

服务器资源

k8s中有三台worker节点

192.168.1.100

192.168.1.101

192.168.1.102

配置文件

创建配置字典,挂载redis的配置文件

key为redis.conf

value为:

appendonly yes
cluster-enabled yes
cluster-config-file /data/nodes.conf
cluster-require-full-coverage no
cluster-migration-barrier 1
cluster-node-timeout 60000
protected-mode no
daemonize no     #让redis前台运行
port 6379
#下面的认证需要在集群搭建成功后添加,然后重启redis集群
requirepass XXX@2022   #开启密码认证
masterauth XXX@2022	#开启认证

创建redis服务

通过statefulset创建redis集群,有状态应用可以是副本之间有主从关系,数据需要做持久化。

在项目空间的 工作负载-有状态副本集-创建 进行 Redis 的创建。

k8s容器化搭建redis集群

基本信息定义

k8s容器化搭建redis集群

容器组设置,从自己的镜像仓库选择redis的版本,设置副本数为6,设置启动命令如下

k8s容器化搭建redis集群

存储设置,先是声明持久卷声明,再是挂载配置文件字典

k8s容器化搭建redis集群

PVC声明,挂载到容器的/data路径

k8s容器化搭建redis集群

配置文件的挂载,挂载到conf目录(依据自己使用的redis容器读取配置文件位置挂载)

k8s容器化搭建redis集群

创建

k8s容器化搭建redis集群

redis集群资源清单

kind: StatefulSet
apiVersion: apps/v1
metadata:
  name: ipaas-redis-cluster-v1
  namespace: xiaoyu
  labels:
    app: ipaas-redis-cluster
    version: v1
  annotations:
    kubesphere.io/creator: admin
spec:
  replicas: 6
  selector:
    matchLabels:
      app: ipaas-redis-cluster
      version: v1
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: ipaas-redis-cluster
        version: v1
      annotations:
        kubesphere.io/restartedAt: '2022-11-03T02:20:00.393Z'
        logging.kubesphere.io/logsidecar-config: '{}'
    spec:
      volumes:
        - name: host-time
          hostPath:
            path: /etc/localtime
            type: ''
        - name: volume-tdz1y1
          configMap:
            name: redis-conf
            items:
              - key: redis.conf
                path: redis.conf
            defaultMode: 420
      containers:
        - name: redis-cluster
          image: 'harbor.leadchina.cn/ipaas/ipaas-redis:5.0.14'
          command:
            - redis-server
          args:
            - /conf/redis.conf
            - '--cluster-announce-ip'
            - $(POD_IP)  
          ports:
            - name: tcp-6379
              containerPort: 6379
              protocol: TCP
          env: #环境变量需要在yml中创建
            - name: POD_IP
              valueFrom:
                fieldRef:
                  apiVersion: v1
                  fieldPath: status.podIP
          resources:
            limits:
              cpu: 200m
              memory: 512Mi
            requests:
              cpu: 100m
              memory: 128Mi
          volumeMounts:
            - name: host-time
              mountPath: /etc/localtime
            - name: redis-pvc
              mountPath: /data
            - name: volume-tdz1y1
              mountPath: /conf
          terminationMessagePath: /dev/termination-log
          terminationMessagePolicy: File
          imagePullPolicy: IfNotPresent
      restartPolicy: Always
      terminationGracePeriodSeconds: 30
      dnsPolicy: ClusterFirst
      serviceAccountName: default
      serviceAccount: default
      securityContext: {}
      imagePullSecrets:
        - name: ipaas-repo
      affinity:
        podAntiAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
            - weight: 100
              podAffinityTerm:
                labelSelector:
                  matchLabels:
                    app: ipaas-redis-cluster
                    version: v1
                topologyKey: kubernetes.io/hostname
      schedulerName: default-scheduler
  volumeClaimTemplates:
    - kind: PersistentVolumeClaim
      apiVersion: v1
      metadata:
        name: redis-pvc
        namespace: ipaas
        creationTimestamp: null
      spec:
        accessModes:
          - ReadWriteOnce
        resources:
          requests:
            storage: 10Gi
        storageClassName: csi-rbd-sc
        volumeMode: Filesystem
      status:
        phase: Pending
  serviceName: ipaas-redis-cluster
  podManagementPolicy: OrderedReady
  updateStrategy:
    type: RollingUpdate
    rollingUpdate:
      partition: 0
  revisionHistoryLimit: 10

初始化集群

上面创建的redis副本之间并没什么关联,只是单个的redis服务,而通过容器化部署的redis不能通过副本的虚拟ip进行初始化,使用 ip 地址的方式在每次 K8s 调度 redisip 都会发生变化,所以在 K8s 集群中使用 ip 方式初始化集群并不太合适,但是如果使用内部 DNS 直接跟上面一样初始化集群会出现错误,因为 redis 对域名的支持并不太好,所以这时候可以用 Redis-tribe

创建部署
k8s容器化搭建redis集群

通过yaml创建

apiVersion: apps/v1
kind: Deployment
metadata:
  namespace: xiaoyu
  labels:
    app: redis-cluster-tools
  name: redis-cluster-tools
spec:
  replicas: 1
  selector:
    matchLabels:
      app: redis-cluster-tools
  template:
    metadata:
      labels:
        app: redis-cluster-tools
      name: pos-redis
    spec:
     containers:
     - name: pos-redis
       image: sunnywang/redis-tools-ubuntu:v0.5.1
       imagePullPolicy: IfNotPresent
       args:
       - /bin/bash
       - -c
       - sleep 3600

k8s容器化搭建redis集群

进入到redis-cluster-tools的终端,分别进行master节点的初始化和slave节点的关联

首先进入到redis集群副本的终端查看容器的DNS
k8s容器化搭建redis集群

进入redis-cluster-tools的终端,先利用上面查看到的redis集群副本的DNS进行master节点的初始化

#执行以下命令初始化 master 节点,这时候之前的内部 DNS 的域名可以用了
redis-trib.py create `dig +short redis-cluster-0.redis-cluster-49ag.yek.svc.cluster.local`:6379 `dig +short redis-cluster-1.redis-cluster-49ag.yek.svc.cluster.local`:6379 `dig +short redis-cluster-2.redis-cluster-49ag.yek.svc.cluster.local`:6379

k8s容器化搭建redis集群

给每个master节点绑定对应的副本节点

#给master节点0绑定5
redis-trib.py replicate --master-addr `dig +short redis-cluster-0.redis-cluster-49ag.yek.svc.cluster.local`:6379 --slave-addr `dig +short redis-cluster-5.redis-cluster-49ag.yek.svc.cluster.local`:6379
#给master节点1绑定3
redis-trib.py replicate --master-addr `dig +short redis-cluster-1.redis-cluster-49ag.yek.svc.cluster.local`:6379 --slave-addr `dig +short redis-cluster-3.redis-cluster-49ag.yek.svc.cluster.local`:6379
#给master节点2绑定4
redis-trib.py replicate --master-addr `dig +short redis-cluster-2.redis-cluster-49ag.yek.svc.cluster.local`:6379 --slave-addr `dig +short redis-cluster-4.redis-cluster-49ag.yek.svc.cluster.local`:6379

#注意点,这里在进行主从绑定时,要注意交叉绑定,最终的结果就是不要把一对主从绑定完被调度到同一台节点上,这样的话,当发生机器节点宕机时,副本没有及时调度会造成redis集群缺少哈希槽而不可用。

不合适的结构

k8s容器化搭建redis集群

合适的结构

k8s容器化搭建redis集群

绑定成功输出信息
k8s容器化搭建redis集群

集群验证

进入redis集群的任意一个副本中,查看集群状态

redis-cli
127.0.0.1:6379>cluster info

k8s容器化搭建redis集群
此时的集群是没有设置密码的,需要在配置字典中redis.conf添加参数然后重新创建redis集群让其生效

验证方式一

使用基础命令进行验证,验证集群模式的 redis-cli 需要加-c
如果已经设置密码的话,需要使用 redis-cli -a 密码 -c 来进入redis集群

k8s容器化搭建redis集群

验证方式二

验证集群是否可以正常主从切换,在带密码认证的情况下

#进入容器0,通过以下命令查看是否为主节点
cat nodes.conf
#然后删除该容器让其重新创建,正常情况下副本5应该会变为master节点,而新的副本0会变为slave

集群使用

集群暴露

上面方式创建的redis集群是产生的服务是headless类型的,就是对应的服务是没有ClusterIP的,不过一样可以通过该服务的DNS在集群内进行该服务的访问。只需在连接redis集群的微服务那里配置 DNS:6379就可以,这个DNS会被解析为一串对应的6个redis副本的虚拟IP。

还可以将其通过具有ClusterIP的服务暴露,k8s集群内需要连接redis集群的微服务只需配置ClusterIP:6379也是可以的

上面俩种方式都是只能在k8s集群内进行访问redis集群,如果要想让k8s集群外部也可以使用,可以把服务的访问类型改为NodePord类型,那么就可以通过集群内任一节点的ip:主机端口进行访问了。除了修改服务的访问类型还可以通过配置ingress来暴露redis集群到外部访问。

连接redis集群

当应用连接redis集群时,应用会通过redis集群的主节点进行写操作,而从节点进行读操作;需要注意的是当集群内发生任意一对主从的切换,要保证代码中可以做到自动刷新redis集群的拓扑结构,防止发生主从切换时代码内还会连接旧master的IP。

如果是java代码,在确保springboot的版本为2.3.0以上的情况下,配置文件中添加如下配置文章来源地址https://www.toymoban.com/news/detail-462248.html

spring.redis.timeout=60s
spring.redis.lettuce.cluster.refresh.period=60s
spring.redis.lettuce.cluster.refresh.adaptive=true

到了这里,关于k8s容器化搭建redis集群的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 微服务 & 云原生:搭建 K8S 集群

    为节约时间和成本,仅供学习使用,直接在两台虚拟机上模拟 K8S 集群搭建 踩坑之旅 系统环境:CentOS-7-x86_64-Minimal-2009 镜像,为方便起见,直接在 root 账户下操作,现实情况最好不要这样做。 关闭防火墙 关闭 selinux 禁用 Swap 设置存储库 安装配置 Docker 安装 Docker Compose 最好使

    2024年02月16日
    浏览(39)
  • 云原生之容器编排实践-在K8S集群中使用Registry2搭建私有镜像仓库

    基于前面搭建的3节点 Kubernetes 集群,今天我们使用 Registry2 搭建私有镜像仓库,这在镜像安全性以及离线环境下运维等方面具有重要意义。 Note: 由于是测试环境,以下创建了一个 local-storage 的 StorageClass ,并使用本地磁盘的方式创建使用 PV ,实际建议使用 NFS 。 共用到了三台

    2024年02月19日
    浏览(36)
  • K8S查看服务器日志

    现在越来越多的服务通过K8S进行部署,所以这里简单记录下在我们日常工作中,使用k8s进行查看服务器的相关日志命令。 首先需要使用账号密码进入到服务器中 第一个命令 kubetctl get pod -A 这个是查看所有的服务信息 其中NAMESPACE是命名空间,name则是你服务节点的名称,注意,

    2024年02月12日
    浏览(35)
  • ubuntu单服务器部署k8s

    初学k8s,看到网上的教程非常杂乱,并且环境什么的都没说清楚,对于初学者很不友好,导致安装的过程总是出错,并且不能安装到符合自己要求的版本或者相应的环境,所以此文对环境做了详细的说明,前前后后安装了两三天几十遍,把所有的问题都解决了,本人亲测安装

    2024年04月15日
    浏览(28)
  • 基于k8s的web服务器构建

    项目描述/项目功能: 模拟企业里的k8s生产环境,部署web,nfs,harbor,Prometheus,granfa等应用,构建一个高可用高性能的web系统,同时能监控整个k8s集群的使用。 CentOS 7.9,ansible 2.9.27,Docker 2.6.0.0,Docker Compose 2.18.1,Kubernetes 1.20.6,Harbor 2.1.0,nfs v4,metrics-server 0.6.0,ingress-ngi

    2024年04月11日
    浏览(35)
  • 服务器-Kubernetes (K8S)单机部署实战 -- 001

         本篇博文是 centos 7 系统安装 kubernetes 单机 master 节点操作。 一: 查看 服务器 配置信息       1. 执行命令查看服务器cpu信息。安装 kubernetes 服务,cpu核心数必须大于2,内存大于2G。       2.  修改服务器设置信息,避免安装出现问题。         a.  临时关闭swap,防止

    2024年02月19日
    浏览(44)
  • 基于k8s的综合的web服务器构建

    目录 项目架构图: 项目环境: 项目描述: 项目步骤: ip规划: 一.在三台k8s机器上安装部署好k8s,一台作为master,两台node 安装部署k8s node节点加入集群: master节点初始化:  安装Calico网络插件: 二,部署nfs服务,让所有的web业务pod都取访问,通过pv,pvc和卷挂载实现 1.搭建

    2024年04月13日
    浏览(39)
  • 概述、搭建Redis服务器、部署LNP+Redis、创建Redis集群、连接集群、集群工作原理

    Top 案例1:搭建redis服务器 案例2:常用命令限 案例3:部署LNP+Redis 案例4:创建redis集群 1.1 具体要求如下 在主机redis64运行redis服务 修改服务运行参数 ip 地址192.168.88.64 服务监听的端口6364 redis服务的连接密码为 tarenaplj 1.2 方案 准备1台新虚拟机,要求如表-1所示。   1.3 步骤 实

    2024年02月12日
    浏览(51)
  • k8s容器集群管理

    k8s容器集群管理 k8s简介 容器技术的发展 使用kubeadm安装k8s kubectl Kubernetes 架构 k8s节点 节点与控制面之间的通信 控制器 k8s容器 Kubernetes 对象 Kubernetes 对象管理 Kubernetes 对象管理 指令式命令 Kubernetes 对象管理 指令式对象配置 k8s对象管理 声明式对象配置 使用 Kustomize 对 Kubern

    2024年02月10日
    浏览(26)
  • 重启某个节点、重启电脑服务器后,kubernetes无法运行,k8s无法运行

    环境:ubuntu18.04 LTS 现象:按步骤安装kubernetes后,正常启动,各个命令均可正常使用。服务器重启后,执行命令错误信息如下: The connection to the server 127.0.0.1:6443 was refused - did you specify the right host or port? 排查防火墙设置 查看端口是否打开 如果无法连接,可以关闭防火墙 重新

    2024年02月05日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包