共计 10036 个字符,预计需要花费 26 分钟才能阅读完成。

因为后面内部资源平台逐渐向k8s转换,很多东西都需要改造,所以此处记录下这个中间件的部署方式
redis standalone方式
准备PV/PVC
[root@k8s-master ~]# kubectl get sc
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
nfs-storage nfs-client Delete Immediate false 27d
[root@k8s-master redis]# cat >redis-pvc.yaml<<-'EOF'
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: redis-pvc
spec:
storageClassName: nfs-storage
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 512Mi
EOF
[root@k8s-master redis]# kubectl apply -f redis-pvc.yaml
persistentvolumeclaim/redis-pvc created
[root@k8s-master redis]# kubectl get -f redis-pvc.yaml
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
redis-pvc Bound pvc-2f6cd73a-39c8-42e1-921f-205d4565450b 512Mi RWO nfs-storage 4s
准备redis configmap
[root@k8s-master redis]# cat >redis-configmap.yaml<<-'EOF'
apiVersion: v1
kind: ConfigMap
metadata:
name: redis-cm
data:
redis.conf: |+
requirepass 123456
protected-mode no
port 6379
tcp-backlog 511
timeout 0
tcp-keepalive 300
daemonize no
supervised no
pidfile /var/run/redis_6379.pid
loglevel notice
logfile ""
databases 16
always-show-logo yes
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir /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
lazyfree-lazy-eviction no
lazyfree-lazy-expire no
lazyfree-lazy-server-del no
slave-lazy-flush no
appendonly yes
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 Ex
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
EOF
[root@k8s-master redis]# kubectl apply -f redis-configmap.yaml
configmap/redis-cm created
使用deploy方式部署redis
[root@k8s-master redis]# cat >redis-deploy.yaml<<-'EOF'
apiVersion: apps/v1
kind: Deployment
metadata:
name: redis
labels:
app: redis
spec:
strategy:
type: Recreate
selector:
matchLabels:
app: redis
template:
metadata:
labels:
app: redis
spec:
containers:
- name: redis
image: redis
imagePullPolicy: IfNotPresent
command: ["redis-server","/etc/redis/redis.conf"]
securityContext:
runAsUser: 2000
runAsNonRoot: true
runAsGroup: 2000
ports:
- containerPort: 6379
volumeMounts:
- name: redis-config
mountPath: /etc/redis/redis.conf
subPath: redis.conf
- name: redis-persistent-storage
mountPath: /data
volumes:
- name: redis-config
configMap:
name: redis-cm
items:
- key: redis.conf
path: redis.conf
- name: redis-persistent-storage
persistentVolumeClaim:
claimName: redis-pvc
EOF
[root@k8s-master redis]# kubectl apply -f redis-deploy.yaml
[root@k8s-master redis]# kubectl get -f redis-deploy.yaml
NAME READY UP-TO-DATE AVAILABLE AGE
redis 1/1 1 1 23s
创建redis SVC服务
[root@k8s-master redis]# cat >redis-svc.yaml<<-'EOF'
kind: Service
apiVersion: v1
metadata:
name: redis-svc
spec:
type: NodePort
selector:
app: redis
ports:
- port: 6379
targetPort: 6379
EOF
[root@k8s-master redis]# kubectl apply -f redis-svc.yaml
service/redis-svc created
[root@k8s-master redis]# kubectl get -f redis-svc.yaml
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
redis-svc NodePort 10.96.247.249 <none> 6379:32576/TCP 5s
测试验证连接
[root@k8s-master redis]# redis-cli -h 10.96.247.249
10.96.247.249:6379> auth 123456
OK
10.96.247.249:6379> ping
PONG
10.96.247.249:6379> exit
redis普通主从
配置entrypoint
上面standalone方式使用无状态deploy部署,现在主从我们需要采取有状态集来部署,因为我们可用通过有状态集的固定网络标志来确定master角色,接下来我们来改造下redis的entrypoint脚本
# 这是redis原本的entrypoint
root@redis-6457c894d6-pnkft:/usr/local/bin# cat docker-entrypoint.sh
#!/bin/sh
set -e
# first arg is `-f` or `--some-option`
# or first arg is `something.conf`
if [ "${1#-}" != "$1" ] || [ "${1%.conf}" != "$1" ]; then
set -- redis-server "$@"
fi
# allow the container to be started with `--user`
if [ "$1" = 'redis-server' -a "$(id -u)" = '0' ]; then
find . \! -user redis -exec chown redis '{}' +
exec gosu redis "$0" "$@"
fi
# set an appropriate umask (if one isn't set already)
# - https://github.com/docker-library/redis/issues/305
# - https://github.com/redis/redis/blob/bb875603fb7ff3f9d19aad906bd45d7db98d9a39/utils/systemd-redis_server.service#L37
um="$(umask)"
if [ "$um" = '0022' ]; then
umask 0077
fi
exec "$@"
# 改造后entrypoint
# StatefulSet会给每个POD分配一个固定的主机网络标识符号,所以这里可以通过主机名去判断主节点
[root@k8s-master redis-ms]# cat >docker-entrypoint.sh<<-'EOF'
#!/bin/bash
cp /etc/redis/redis.conf.ini /etc/redis/redis.conf
if [ "${HOSTNAME}" != "redis-0" ]; then
echo "slaveof redis-0.redis-svc 6379" >> /etc/redis/redis.conf
# until nc -zv redis-0.redis-svc 6379 -w 1; do echo 'waiting for redis-master nc'; sleep 1; done
fi
# first arg is `-f` or `--some-option`
# or first arg is `something.conf`
if [ "${1#-}" != "$1" ] || [ "${1%.conf}" != "$1" ]; then
set -- redis-server "$@"
fi
# allow the container to be started with `--user`
if [ "$1" = 'redis-server' -a "$(id -u)" = '0' ]; then
find . \! -user redis -exec chown redis '{}' +
exec gosu redis "$0" "$@"
fi
# set an appropriate umask (if one isn't set already)
# - https://github.com/docker-library/redis/issues/305
# - https://github.com/redis/redis/blob/bb875603fb7ff3f9d19aad906bd45d7db98d9a39/utils/systemd-redis_server.service#L37
um="$(umask)"
if [ "$um" = '0022' ]; then
umask 0077
fi
exec "$@"
[root@k8s-master redis-ms]# kubectl create configmap redis-entrypoint-sh --from-file=docker-entrypoint.sh=docker-entrypoint.sh
创建configmap
[root@k8s-master redis-ms]# cat >redis-configmap.yaml<<-'EOF'
apiVersion: v1
kind: ConfigMap
metadata:
name: redis-ms
data:
redis.conf.ini: |+
requirepass 123456
masterauth 123456
protected-mode no
port 6379
tcp-backlog 511
timeout 0
tcp-keepalive 300
daemonize no
supervised no
pidfile /var/run/redis_6379.pid
loglevel notice
logfile ""
databases 16
always-show-logo yes
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir /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
lazyfree-lazy-eviction no
lazyfree-lazy-expire no
lazyfree-lazy-server-del no
slave-lazy-flush no
appendonly yes
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 Ex
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
EOF
[root@k8s-master redis-ms]# kubectl apply -f redis-configmap.yaml
创建svc
[root@k8s-master redis-ms]# cat >redis-svc.yaml<<-'EOF'
apiVersion: v1
kind: Service
metadata:
name: redis-svc
labels:
app: redis
spec:
ports:
- name: redis-port
port: 6379
clusterIP: None
selector:
app: redis
EOF
[root@k8s-master redis-ms]# kubectl apply -f redis-svc.yaml
创建statfulset
[root@k8s-master redis-ms]# cat >redis-sts.yaml<<-'EOF'
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: redis
spec:
serviceName: "redis-svc"
replicas: 3
selector:
matchLabels:
app: redis
template:
metadata:
labels:
app: redis
spec:
containers:
- name: redis
image: redis
imagePullPolicy: IfNotPresent
ports:
- containerPort: 6379
name: redis
volumeMounts:
- name: data
mountPath: /data
- name: redis-entrypoint-sh
mountPath: /usr/local/bin/docker-entrypoint.sh
subPath: docker-entrypoint.sh
- name: redis-config
mountPath: /etc/redis/redis.conf.ini
subPath: redis.conf.ini
args:
- redis-server
- /etc/redis/redis.conf
volumes:
- name: redis-entrypoint-sh
configMap:
name: redis-entrypoint-sh
items:
- key: docker-entrypoint.sh
path: docker-entrypoint.sh
defaultMode: 0777
- name: redis-config
configMap:
name: redis-ms
items:
- key: redis.conf.ini
path: redis.conf.ini
volumeClaimTemplates:
- metadata:
name: data
annotations:
volume.beta.kubernetes.io/storage-class: "nfs-storage"
spec:
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 1Gi
EOF
[root@k8s-master redis-ms]# kubectl apply -f redis-sts.yaml
[root@k8s-master redis-ms]# kubectl get -f redis-sts.yaml
NAME READY AGE
redis 3/3 4m33s
[root@k8s-master redis-ms]# kubectl get pods
NAME READY STATUS RESTARTS AGE
dapi-test-pod 1/1 Running 0 59m
redis-0 1/1 Running 0 4m37s
redis-1 1/1 Running 0 4m35s
redis-2 1/1 Running 0 4m33s
测试验证主从同步
[root@k8s-master redis-ms]# kubectl get pods -o wide -l app=redis
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
redis-0 1/1 Running 0 5m50s 10.100.235.193 k8s-master <none> <none>
redis-1 1/1 Running 0 5m48s 10.100.235.195 k8s-master <none> <none>
redis-2 1/1 Running 0 5m46s 10.100.235.217 k8s-master <none> <none>
[root@k8s-master redis-ms]# redis-cli -h 10.100.235.193
10.100.235.193:6379> auth 123456
OK
10.100.235.193:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=10.100.235.195,port=6379,state=online,offset=518,lag=0
slave1:ip=10.100.235.217,port=6379,state=online,offset=518,lag=0
master_failover_state:no-failover
master_replid:a317b6500ba443f98c0e18e9c2c9d400ac163fcc
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:518
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:518
10.100.235.193:6379> set name xadocker
OK
10.100.235.193:6379> get name
"xadocker"
10.100.235.193:6379> exit
[root@k8s-master redis-ms]# redis-cli -h 10.100.235.195
10.100.235.195:6379> auth 123456
OK
10.100.235.195:6379> get name
"xadocker"
10.100.235.195:6379> exit
[root@k8s-master redis-ms]# redis-cli -h 10.100.235.217
10.100.235.217:6379> auth 123456
OK
10.100.235.217:6379> get name
"xadocker"
10.100.235.217:6379> info replication
# Replication
role:slave
master_host:redis-0.redis-svc
master_port:6379
master_link_status:up
master_last_io_seconds_ago:5
master_sync_in_progress:0
slave_read_repl_offset:648
slave_repl_offset:648
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:a317b6500ba443f98c0e18e9c2c9d400ac163fcc
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:648
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:648
10.100.235.217:6379> exit
redis哨兵模式
正文完
隐私政策
留言板
金色传说
kubernetes
terraform
云生原
helm
代码编程
Java
Python
Shell
DevOps
Ansible
Gitlab
Jenkins
运维
老司机
Linux 杂锦
Nginx
数据库
elasticsearch
监控
上帝视角
DJI FPV
DJI mini 3 pro
关于本站