目录
简介:
众所周知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