基于StatefulSet控制器部署单机redis以及redis集群

目录

 简介:

一、部署单机版redis

1、制作redis镜像

1.1、创建Dockerfile文件

1.2、准备dockerfile所需的同级目录文件

2、构建镜像

3、测试镜像

4、创建存储卷

4.2、创建PVC

           5、创建redis服务

 5.1、创建redis.yaml文件

5.2、创建redis服务,并测试

二、部署集群版reids

1、修改redis.conf配置文件

2、创建PV

          3、创建configmap资源为redis服务提供配置文件

          4、布置redis集群



 简介:

众所周知pod控制器是K8S集群重要的资源,用于控制pod;Pod通过控制器实现容器的运维,如伸缩、升级等,控制器决定了创建pod资源的方式和类型

pod控制器分为两类:1、有状态应用控制器 deployment 2、无状态应用控制器statefulse

无状态应用控制器常用的deployment,在deployment控制下的pod都是一样的,没有序列关系;

statefulse与deployment不同的是,它会让每个容器有自己的唯一标识符,多用于数据库服务,因为数据库服务一般有主从关系,必须按照顺序进行扩缩容、删除和终止,进行有序的更新

有状态应用特点:

1)实例之间有差别,每个实例都有自己的独特性,元数据不同,例如etcd,zookeeper
2)实例之间不对等的关系,以及依靠外部存储的应用。

        

无状态应用特点:

1)deployment 认为所有的pod都是一样的
2)不用考虑顺序的要求
3)不用考虑在哪个node节点上运行
4)可以随意扩容和缩容

一、部署单机版redis

1、制作redis镜像

1.1、创建Dockerfile文件

redis的父镜像magedu-centos-base:7.9.2009制作过程可参见博客
https://blog.csdn.net/weixin_46476452/article/details/128164447

root@master1:/opt/k8s-data/dockerfile/web/magedu/redis# vim Dockerfile
#Redis Image
FROM harbor.magedu.net/baseimages/magedu-centos-base:7.9.2009
#之前做的基础镜像,安装了很多命令
MAINTAINER zhaoyang "zhangyang@163.com"

ADD redis-4.0.14.tar.gz /usr/local/src   #把redis源码解压到容器的/usr/local/src
RUN ln -sv /usr/local/src/redis-4.0.14 /usr/local/redis && cd /usr/local/redis && make && cp src/redis-cli /usr/sbin/ && cp src/redis-server  /usr/sbin/ && mkdir -pv /data/redis-data
#把redis软连接到/usr/local/reids,并且进入该目录进行make编译,然后把编译好的redis命令拷贝到/usr/sbin/,并且把redis-server命令也拷贝过去,最后创建一个数据目录,用于存放快照
ADD redis.conf /usr/local/redis/redis.conf
#把准备好的配置文件拷贝到容器的目录

EXPOSE 6379
#暴露一个端口

#ADD run_redis.sh /usr/local/redis/run_redis.sh
#CMD ["/usr/local/redis/run_redis.sh"]

ADD run_redis.sh /usr/local/redis/entrypoint.sh
#把脚本放到容器中
ENTRYPOINT ["/usr/local/redis/entrypoint.sh"]
#把脚本作为拉起容器的介质

1.2、准备dockerfile所需的同级目录文件

1、准备配置文件redis.conf内容,取消了注释行和空白行

root@master1:/opt/k8s-data/dockerfile/web/magedu/redis# grep -v "^#" redis.conf | grep -v ^$
bind 0.0.0.0
protected-mode yes
port 6379
tcp-backlog 511
timeout 0
tcp-keepalive 300
daemonize yes
supervised no
pidfile /var/run/redis_6379.pid
loglevel notice
logfile ""
databases 16
always-show-logo yes
save 900 1
save 5 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error no
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir /data/redis-data
slave-serve-stale-data yes
slave-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-disable-tcp-nodelay no
slave-priority 100
requirepass 123456
lazyfree-lazy-eviction no
lazyfree-lazy-expire no
lazyfree-lazy-server-del no
slave-lazy-flush no
appendonly no
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
aof-use-rdb-preamble no
lua-time-limit 5000
slowlog-log-slower-than 10000
slowlog-max-len 128
latency-monitor-threshold 0
notify-keyspace-events ""
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-size -2
list-compress-depth 0
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
aof-rewrite-incremental-fsync yes

配置文件解说:

触发快照条件设置

 快照存放路径

2、准备启动脚本内容

root@master1:/opt/k8s-data/dockerfile/web/magedu/redis# cat run_redis.sh
#!/bin/bash

/usr/sbin/redis-server /usr/local/redis/redis.conf
#通过这个redis-server命令加载这个配置文件
tail -f  /etc/hosts
#通过tail -f做一个守护进程

2、构建镜像

1、查看构建镜像,上传镜像脚本

root@master1:/opt/k8s-data/dockerfile/web/magedu/redis# cat build-command.sh
#!/bin/bash
TAG=$1
nerdctl build -t  harbor.magedu.net/magedu/redis:${TAG} .

nerdctl push harbor.magedu.net/magedu/redis:${TAG}

2、启动脚本构建镜像

root@master1:/opt/k8s-data/dockerfile/web/magedu/redis# bash build-command.sh v4.0.14

3、查看本地镜像和harbor端镜像

 查看harbor服务端镜像

3、测试镜像

1、运行下镜像能否启动

2、到其它节点访问下master1的6379端口

4、创建存储卷

4.1创建PV

root@master1:/opt/k8s-data/yaml/magedu/redis/pv# vim redis-persistentvolume.yaml
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: redis-datadir-pv-1
spec:
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteOnce
  nfs:
    path: /data/k8sdata/magedu/redis-datadir-1
    server: 172.31.7.109

#上面的路径/data/k8sdata/magedu/redis-datadir-1需要到7.109存储服务器手动创建


 到7.109存储服务器手动创建目录,需要在exports文件中赋权

创建PV资源,查看PV

4.2、创建PVC

root@master1:/opt/k8s-data/yaml/magedu/redis/pv# vim redis-persistentvolumeclaim.yaml
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: redis-datadir-pvc-1
  namespace: magedu
spec:
  volumeName: redis-datadir-pv-1
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi

创建PVC资源

5、创建redis服务

 5.1、创建redis.yaml文件

root@master1:/opt/k8s-data/yaml/magedu/redis# vim redis.yaml
kind: Deployment
#apiVersion: extensions/v1beta1
apiVersion: apps/v1
metadata:
  labels:
    app: devops-redis
  name: deploy-devops-redis
  namespace: magedu
spec:
  replicas: 1
  selector:
    matchLabels:
      app: devops-redis  #控制器通过这个标签控制pod副本
  template:
    metadata:
      labels:
        app: devops-redis  #上面的控制器标签会找到这个标签,而这个模板会被下面的容器继承,从而进行容器副本控制
    spec:
      containers:
        - name: redis-container
          image: harbor.magedu.net/magedu/redis:v4.0.14
          imagePullPolicy: Always
          volumeMounts:
          - mountPath: "/data/redis-data/"   #把叫redis-datadir名字的存储卷挂到容器的/data/redis-data下面
            name: redis-datadir
      volumes:
        - name: redis-datadir   #挂载的卷名称
          persistentVolumeClaim:   #挂载的卷类型是PVC
            claimName: redis-datadir-pvc-1  #PVC的名称是这个

---
kind: Service
apiVersion: v1
metadata:
  labels:
    app: devops-redis
  name: srv-devops-redis
  namespace: magedu
spec:
  type: NodePort
  ports:
  - name: http
    port: 6379
    targetPort: 6379
    nodePort: 36379
  selector:
    app: devops-redis
  sessionAffinity: ClientIP   #添加亲和性,当同一个客户端IP访问来就把它指向同一个后端pod,对于    service来说pod就是它的后端服务器
  sessionAffinityConfig:
    clientIP:
      timeoutSeconds: 10800   #如果客户端超过10800没访问就断开

5.2、创建redis服务,并测试

创建资源

进入redis容器

 进入redis后写一个数据

KEYS是没有值的,自己写一个teskkey的值是testvalue ,再写一个KEY的值是key1

之前redis配置文件中配置了快照策略,每隔5s如果有一个Key发生变化就做一次快照,而redis的快照信息都是存放在了共享存储上的

可以到存储服务器的共享目录看下多了个dump文件

删除redis,使用快照数据恢复redis数据

把redis-pod删除,让其重建

 进入重建后的redis容器内

 之前写入的两个值都在

 至此单机版的redis容器部署完成了,如果无法满足需求,可以部署集群

二、部署集群版reids

部署6个redis-pod每个redis-pod都需要有PVC做存储

1、重新打镜像

2、修改配置文件

1、修改redis.conf配置文件

redis集群相关的配置文件目录
root@master1:/redis-cluster# ls
pv  redis.conf  redis.yaml

root@master1:/redis-cluster# vim redis.conf
#开启快照机制
appendonly yes
#开启集群功能
cluster-enabled yes
#cluster-config-file文件会自动生成
cluster-config-file /var/lib/redis/nodes.conf
#如果node在5秒没有初始化完成会报错
cluster-node-timeout 5000
#数据目录是在/var/lib/redis中
dir /var/lib/redis
#端口是6379
port 6379

2、创建PV

2.1在172.31.7.109共享存储服务器中创建共享目录

创建共享存储6个目录,这6个目录是用来创建PV的

root@haproxy02:~# mkdir -pv  /data/k8sdata/magedu/{redis0,redis1,redis2,redis3,redis4,redis5}

共享目录赋权

root@haproxy02:~# vim /etc/exports
/data/k8sdata *(rw,no_root_squash)

root@haproxy02:~# exportfs -arv

2.2 创建pv.yaml文件

root@master1:/redis-cluster/pv# vim redis-cluster-pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: redis-cluster-pv0
spec:
  capacity:
    storage: 5Gi
  accessModes:
    - ReadWriteOnce
  nfs:
    server: 172.31.7.109
    path: /data/k8sdata/magedu/redis0

---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: redis-cluster-pv1
spec:
  capacity:
    storage: 5Gi
  accessModes:
    - ReadWriteOnce
  nfs:
    server: 172.31.7.109
    path: /data/k8sdata/magedu/redis1

---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: redis-cluster-pv2
spec:
  capacity:
    storage: 5Gi
  accessModes:
    - ReadWriteOnce
  nfs:
    server: 172.31.7.109
    path: /data/k8sdata/magedu/redis2

---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: redis-cluster-pv3
spec:
  capacity:
    storage: 5Gi
  accessModes:
    - ReadWriteOnce
  nfs:
    server: 172.31.7.109
    path: /data/k8sdata/magedu/redis3

---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: redis-cluster-pv4
spec:
  capacity:
    storage: 5Gi
  accessModes:
    - ReadWriteOnce
  nfs:
    server: 172.31.7.109
    path: /data/k8sdata/magedu/redis4

---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: redis-cluster-pv5
spec:
  capacity:
    storage: 5Gi
  accessModes:
    - ReadWriteOnce
  nfs:
    server: 172.31.7.109
    path: /data/k8sdata/magedu/redis5

3、创建configmap资源为redis服务提供配置文件

创建一个configmap,名称是redis-conf,它来源于一个文件,是来源于当前目录下的redis.conf文件
root@master1:/redis-cluster# kubectl create configmap redis-conf --from-file=redis.conf -n magedu

可以查看下yaml文件看见配置
root@master1:/redis-cluster# kubectl get configmap -o yaml -n magedu

4、布置redis集群

创建好配置文件后就可以布置集群了

4.1、编写yaml文件

root@master1:/redis-cluster# ls
pv  redis.conf  redis.yaml

root@master1:/redis-cluster# vim redis.yaml
apiVersion: v1
kind: Service
metadata:
  name: redis
  namespace: magedu
  labels:
    app: redis
spec:
  selector:
    app: redis
    appCluster: redis-cluster
  ports:
  - name: redis
    port: 6379
  clusterIP: None #这个服务是没有clusterIP的,是个无头服务,可用于K8S内部直接访问,通过访问名字叫redis的service,而后转发到redis-pod

---
apiVersion: v1
kind: Service
metadata:
  name: redis-access
  namespace: magedu
  labels:
    app: redis
spec:
  selector:
    app: redis
    appCluster: redis-cluster
  ports:
  - name: redis-access
    protocol: TCP
    port: 6379
    targetPort: 6379

---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: redis
  namespace: magedu
spec:
  serviceName: redis
  replicas: 6
  selector:
    matchLabels:
      app: redis
      appCluster: redis-cluster
  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.14
        command:
          - "redis-server"
        args:
          - "/etc/redis/redis.conf"
          - "--protected-mode"
          - "no"
        resources:
          requests:
            cpu: "500m"
            memory: "500Mi"
        ports:
        - containerPort: 6379   #给客户端使用的端口
          name: redis
          protocol: TCP
        - containerPort: 16379  #给集群通信使用的端口,集群端口是在客户端端口基础上加10000
          name: cluster
          protocol: TCP
        volumeMounts:
        - name: conf
          mountPath: /etc/redis   #挂载的conf,是配置文件
        - name: data
          mountPath: /var/lib/redis #挂载的data,是快照数据
      volumes:
      - name: conf
        configMap:
          name: redis-conf
          items:
          - key: redis.conf
            path: redis.conf
  volumeClaimTemplates:     #PVC模板
  - metadata:
      name: data
      namespace: magedu
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 5Gi

 

4.2、创建资源

 

 查看资源,每个pod都对应一个pvc

4.3初始化redis集群

 至此,6个pod都起来了,并且pv和pvc也都绑定正常了,下面进行手动初始化

使用ubuntu给redis集群进行初始化;初始化工具4版本用redis-tribe,5版本用redis-cli

root@master1:/redis-cluster# kubectl run -it ubuntu1804 --image=ubuntu:1804 --restart=Never -n magedu bash
root@ubuntu1804:/# apt update
安装pip等命令工具
root@ubuntu1804:/# apt install python2.7 python-pip redis-tools dnsutils iputils-ping net-tools

pip默认版本较低,需要手动把pip命令升级下
root@ubuntu1804:/# pip install --upgrade pip
报错:
Traceback (most recent call last):
  File "/usr/lib/python2.7/dist-packages/pip/basecommand.py", line 215, in main
    status = self.run(options, args)

解决方案:
root@ubuntu1804:/# pip install --upgrade pip -vvv

root@ubuntu1804:/# pip  -V
pip 20.3.4 from /usr/local/lib/python2.7/dist-packages/pip (python 2.7)

升级完后安装redis-trib工具
root@ubuntu1804:/# pip install redis-trib

如果前面安装redis-trib失败可以试下下面方案

 安装gem命令

root@ubuntu1804:/# apt install -y rubygems

#移除默认gem源
root@ubuntu1804:/# gem sources --remove https://rubygems.org
source https://rubygems.org not present in cache
#添加为阿里云
root@ubuntu1804:/# gem sources -a http://mirrors.aliyun.com/rubygems/
http://mirrors.aliyun.com/rubygems/ added to sources
root@ubuntu1804:/# gem install redis -v 3.3.5
Fetching: redis-3.3.5.gem (100%)
Successfully installed redis-3.3.5
Parsing documentation for redis-3.3.5
Installing ri documentation for redis-3.3.5
Done installing documentation for redis after 0 seconds
1 gem installed

查看redis-pod的ip地址,后面会使用pod-ip加入集群

创建redis集群,先创建3个pod作为master角色

添加副本

将redis-3加入redis-0

root@ubuntu1804:/# redis-trib.py replicate \
> --master-addr 10.200.135.3:6379 \
> --slave-addr 10.200.135.4:6379
Redis-trib 0.6.2 Copyright (c) HunanTV Platform developers
INFO:root:Instance at 10.200.135.4:6379 has joined 10.200.135.3:6379; now set replica
INFO:root:Instance at 10.200.135.4:6379 set as replica to a1e13dbce7d1a963608a5ef6c81598316451dbad

将redis-4加入redis-1

> --master-addr 10.200.166.130:6379 \
> --slave-addr 10.200.166.132:6379
Redis-trib 0.6.2 Copyright (c) HunanTV Platform developers
INFO:root:Instance at 10.200.166.132:6379 has joined 10.200.166.130:6379; now set replica
INFO:root:Instance at 10.200.166.132:6379 set as replica to 6fea5504d5ee3d5bba0a6787e3e742d4e8e6f1cb

将redis-5加入redis-2

root@ubuntu1804:/# redis-trib.py replicate \
> --master-addr 10.200.104.20:6379 \
> --slave-addr 10.200.104.19:6379
Redis-trib 0.6.2 Copyright (c) HunanTV Platform developers
INFO:root:Instance at 10.200.104.19:6379 has joined 10.200.104.20:6379; now set replica
INFO:root:Instance at 10.200.104.19:6379 set as replica to 8bd580f196a64faf48ce0f6c083c7eef2706d684

至此ubuntu系统初始化redis集群的任务就结束了

进入一个pod查看下信息

使用redis-cli进入后可以info查看下

 

 info查看显示当前节点的角色是master, 并且有一个slaves连接了,slave是slave0地址是166.132

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值