听说Redis 3以后安装集群比较简单,几个命令就可以完全搞定,在自己的电脑上面安装试了下,果然比较爽。
今天准备把Redis 3的集群安装在K8s上面,通常的做法都是在github上面查找是不是有人已经做过,果然很多。下面的代码基本上来自于github上面。不过就算用这个面的代码,在自己部署的时候也存在不少的问题。因为github上面的都是大神,很比比较小的问题不会写的很清楚。
所以: 如果这个文档(blog)如何解决不了问题,就到github上面去查找别的方法。
1>>>>>>>>>>>镜像说明
使用的镜像名: ausov/redis:3.2-alpine
先使用下面命令下载镜像:
- docker pull ausov/redis:3.2-alpine
这个镜像如果无法下载,则需要自己手动build一下.
这个是编译需要使用的文件
- [root@centos-master alpine]# pwd
- /root/k8s-redis/3.2/alpine
- [root@centos-master alpine]# ls
- docker-entrypoint.sh Dockerfile redis.conf
- cat docker-entrypoint.sh
- #!/bin/sh
- set -eox pipefail
- #shopt -s nullglob
- REDIS_CONF=${REDIS_CONF:-"/opt/k8s-redis/redis.conf"}
- if [ "${1#-}" != "$1" ] || [ "${1%.conf}" != "$1" ]; then
- set -- redis-server "$@"
- fi
- if [ "$1" = 'redis-server' ] && [ -n "$SLAVEOF" ] && [ -z "$SENTINEL" ]; then
- echo "Starting Redis replica"
- set -- $@ "$REDIS_CONF" --slaveof "$SLAVEOF" 6379
- elif [ "$1" = 'redis-server' ] && [ -n "$SENTINEL" ]; then
- echo "Starting Redis sentinel"
- while true; do
- redis-cli -h $SENTINEL INFO
- if [[ "$?" == "0" ]]; then
- break
- fi
- echo "Connecting to master failed. Waiting..."
- sleep 10
- done
- echo "sentinel monitor primary $SENTINEL 6379 2" >> "$REDIS_CONF"
- echo "sentinel down-after-milliseconds primary 5000" >> "$REDIS_CONF"
- echo "sentinel failover-timeout primary 10000" >> "$REDIS_CONF"
- echo "sentinel parallel-syncs primary 1" >> "$REDIS_CONF"
- set -- $@ "$REDIS_CONF" --port 26379 --sentinel --protected-mode no
- elif [ "$1" = 'redis-server' ]; then
- echo "Starting Redis master"
- set -- $@ "$REDIS_CONF"
- fi
- exec "$@"
- cat redis.conf | grep -Ev '(^#|^$)'
- 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
- save 900 1
- save 300 10
- save 60 10000
- stop-writes-on-bgsave-error yes
- rdbcompression yes
- rdbchecksum yes
- dbfilename dump.rdb
- dir ./
- 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
- 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
- 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
- cat Dockerfile
- FROM redis:3.2-alpine
- COPY ["redis.conf", "/opt/k8s-redis/"]
- COPY ["docker-entrypoint.sh", "/usr/local/bin/"]
以上就是编译需要使用到的文件。cd到这个目录,执行下面的命令。
- docker build -t "ausov/redis:3.2-alpine" .
镜像编译完成以后,需要确保所有的节点都有这个镜像。
2>>>>>>>>>>>部署安装
部署安装我们需要使用三个文件,分别是:
primary.yml secondary.yml sentinel.yml
下面是文件内容:
- [root@centos-master example]# cat primary.yml
- apiVersion: v1
- kind: Service
- metadata:
- name: redis-primary
- labels:
- app: redis-primary
- spec:
- ports:
- - port: 6379
- name: redis-primary
- clusterIP: None
- selector:
- app: redis-primary
- ---
- apiVersion: apps/v1beta1
- kind: StatefulSet
- metadata:
- name: redis-primary
- spec:
- serviceName: redis-primary
- replicas: 1
- template:
- metadata:
- labels:
- app: redis-primary
- spec:
- terminationGracePeriodSeconds: 10
- containers:
- - name: redis-primary
- image: ausov/redis:3.2-alpine
- imagePullPolicy: IfNotPresent
- ports:
- - containerPort: 6379
- name: redis-primary
- volumeMounts:
- - name: data
- mountPath: /data
- volumeClaimTemplates:
- - metadata:
- name: data
- annotations:
- volume.alpha.kubernetes.io/storage-class: anything
- spec:
- accessModes: [ "ReadWriteOnce" ]
- resources:
- requests:
- storage: 5Gi
- [root@centos-master example]# cat secondary.yml
- apiVersion: v1
- kind: Service
- metadata:
- name: redis-secondary
- labels:
- app: redis-secondary
- spec:
- ports:
- - port: 6379
- name: redis-secondary
- clusterIP: None
- selector:
- app: redis-secondary
- ---
- apiVersion: apps/v1beta1
- kind: StatefulSet
- metadata:
- name: redis-secondary
- spec:
- serviceName: redis-secondary
- replicas: 2
- template:
- metadata:
- labels:
- app: redis-secondary
- spec:
- terminationGracePeriodSeconds: 10
- containers:
- - name: redis-secondary
- image: ausov/redis:3.2-alpine
- imagePullPolicy: IfNotPresent
- env:
- - name: SLAVEOF
- value: redis-primary-0.redis-primary
- ports:
- - containerPort: 6379
- name: redis-secondary
- volumeMounts:
- - name: data
- mountPath: /data
- volumeClaimTemplates:
- - metadata:
- name: data
- annotations:
- volume.alpha.kubernetes.io/storage-class: anything
- spec:
- accessModes: [ "ReadWriteOnce" ]
- resources:
- requests:
- storage: 5Gi
- [root@centos-master example]# cat sentinel.yml
- apiVersion: v1
- kind: Service
- metadata:
- name: redis-sentinel
- labels:
- app: redis-sentinel
- spec:
- ports:
- - port: 26379
- name: redis-sentinel
- clusterIP: None
- selector:
- app: redis-sentinel
- ---
- apiVersion: apps/v1beta1
- kind: StatefulSet
- metadata:
- name: redis-sentinel
- spec:
- serviceName: redis-sentinel
- replicas: 3
- template:
- metadata:
- labels:
- app: redis-sentinel
- spec:
- terminationGracePeriodSeconds: 10
- containers:
- - name: redis-sentinel
- image: ausov/redis:3.2-alpine
- imagePullPolicy: IfNotPresent
- env:
- - name: SENTINEL
- value: redis-primary-0.redis-primary
- ports:
- - containerPort: 26379
- name: redis-sentinel
三个文件都存在以后:
- kubectl create -f primary.yml -f secondary.yml -f sentinel.yml
创建完成后,查看一下pod
- kubectl get pod
会得到以下信息:
- NAME READY STATUS RESTARTS AGE
- redis-primary-0 1/1 Running 0 2d
- redis-secondary-0 1/1 Running 0 2d
- redis-secondary-1 1/1 Running 0 2d
- redis-sentinel-0 1/1 Running 0 2d
- redis-sentinel-1 1/1 Running 0 2d
- redis-sentinel-2 1/1 Running 0 2d
下面是查看StatefulSet的信息:
- [root@centos-master example]# kubectl get statefulset
- NAME DESIRED CURRENT AGE
- redis-primary 1 1 2d
- redis-secondary 2 2 2d
- redis-sentinel 3 3 2d
必须要确保DESIRED和CURRENT的值是一样的。
查看持久存储的信息:
- [root@centos-master example]# kubectl get pvc
- NAME STATUS VOLUME CAPACITY ACCESSMODES AGE
- data-redis-primary-0 Bound pvc-94534255-d614-11e6-955d-1866daed1b04 5Gi RWO 2d
- data-redis-secondary-0 Bound pvc-9a8f2080-d614-11e6-955d-1866daed1b04 5Gi RWO 2d
- data-redis-secondary-1 Bound pvc-9a9029b4-d614-11e6-955d-1866daed1b04 5Gi RWO 2d
我们在注意这里的STATUS,是Bound。
如果不是,用命令
- describe pvc data-redis-primary-0
cannot find volume plugin for alpha provisioning
则需要修改文件:
- /etc/kubernetes/manifests/kube-controller-manager.json
增加参数: --enable-hostpath-provisioner=true
以下是截取了这个文件的一部分:
- "name": "kube-controller-manager",
- "image": "gcr.io/google_containers/kube-controller-manager-amd64:v1.5.1",
- "command": [
- "kube-controller-manager",
- "--address=127.0.0.1",
- "--leader-elect",
- "--master=127.0.0.1:8080",
- "--cluster-name=kubernetes",
- "--root-ca-file=/etc/kubernetes/pki/ca.pem",
- "--service-account-private-key-file=/etc/kubernetes/pki/apiserver-key.pem",
- "--cluster-signing-cert-file=/etc/kubernetes/pki/ca.pem",
- "--cluster-signing-key-file=/etc/kubernetes/pki/ca-key.pem",
- "--insecure-experimental-approve-all-kubelet-csrs-for-group=system:kubelet-bootstrap",
- "--allocate-node-cidrs=true",
- "--enable-hostpath-provisioner=true",
- "--cluster-cidr=10.245.0.0/16"
- ],
修改保存,重启一下docker或kubelet.
通过上面的配置,Redis基本就配置完成: