kubernetes 1.5安装 Redis 3.2.6 Cluster StatefulSet

听说Redis 3以后安装集群比较简单,几个命令就可以完全搞定,在自己的电脑上面安装试了下,果然比较爽。


今天准备把Redis 3的集群安装在K8s上面,通常的做法都是在github上面查找是不是有人已经做过,果然很多。下面的代码基本上来自于github上面。不过就算用这个面的代码,在自己部署的时候也存在不少的问题。因为github上面的都是大神,很比比较小的问题不会写的很清楚。


所以: 如果这个文档(blog)如何解决不了问题,就到github上面去查找别的方法。



1>>>>>>>>>>>镜像说明

  使用的镜像名:    ausov/redis:3.2-alpine

  先使用下面命令下载镜像: 

  

[html]  view plain  copy
  1. docker pull ausov/redis:3.2-alpine  

   这个镜像如果无法下载,则需要自己手动build一下.

   这个是编译需要使用的文件

[html]  view plain  copy
  1. [root@centos-master alpine]# pwd  
  2. /root/k8s-redis/3.2/alpine  
  3. [root@centos-master alpine]# ls  
  4. docker-entrypoint.sh  Dockerfile  redis.conf  

[html]  view plain  copy
  1. cat docker-entrypoint.sh   
[html]  view plain  copy
  1. #!/bin/sh  
  2.   
  3. set -eox pipefail  
  4. #shopt -s nullglob  
  5.   
  6. REDIS_CONF=${REDIS_CONF:-"/opt/k8s-redis/redis.conf"}  
  7.   
  8. if [ "${1#-}" != "$1" ] || [ "${1%.conf}" != "$1" ]; then  
  9.   set -- redis-server "$@"  
  10. fi  
  11.   
  12. if [ "$1" = 'redis-server' ] && [ -n "$SLAVEOF" ] && [ -z "$SENTINEL" ]; then  
  13.   echo "Starting Redis replica"  
  14.   set -- $@ "$REDIS_CONF" --slaveof "$SLAVEOF" 6379  
  15.   
  16. elif [ "$1" = 'redis-server' ] && [ -n "$SENTINEL" ]; then  
  17.   echo "Starting Redis sentinel"  
  18.   
  19.   while true; do  
  20.     redis-cli -h $SENTINEL INFO  
  21.     if [[ "$?" == "0" ]]; then  
  22.       break  
  23.     fi  
  24.     echo "Connecting to master failed.  Waiting..."  
  25.     sleep 10  
  26.   done  
  27.   
  28.   echo "sentinel monitor primary $SENTINEL 6379 2" >> "$REDIS_CONF"  
  29.   echo "sentinel down-after-milliseconds primary 5000" >> "$REDIS_CONF"  
  30.   echo "sentinel failover-timeout primary 10000" >> "$REDIS_CONF"  
  31.   echo "sentinel parallel-syncs primary 1" >> "$REDIS_CONF"  
  32.   
  33.   set -- $@ "$REDIS_CONF" --port 26379 --sentinel --protected-mode no  
  34.   
  35. elif [ "$1" = 'redis-server' ]; then    
  36.   echo "Starting Redis master"  
  37.   set -- $@ "$REDIS_CONF"  
  38. fi  
  39.   
  40. exec "$@"  


这个文件内容太多,我们在这里看下可用的就OK。
[html]  view plain  copy
  1. cat redis.conf | grep -Ev '(^#|^$)'   
[html]  view plain  copy
  1. protected-mode no  
  2. port 6379  
  3. tcp-backlog 511  
  4. timeout 0  
  5. tcp-keepalive 300  
  6. daemonize no  
  7. supervised no  
  8. pidfile /var/run/redis_6379.pid  
  9. loglevel notice  
  10. logfile ""  
  11. databases 16  
  12. save 900 1  
  13. save 300 10  
  14. save 60 10000  
  15. stop-writes-on-bgsave-error yes  
  16. rdbcompression yes  
  17. rdbchecksum yes  
  18. dbfilename dump.rdb  
  19. dir ./  
  20. slave-serve-stale-data yes  
  21. slave-read-only yes  
  22. repl-diskless-sync no  
  23. repl-diskless-sync-delay 5  
  24. repl-disable-tcp-nodelay no  
  25. slave-priority 100  
  26. appendonly yes  
  27. appendfilename "appendonly.aof"  
  28. appendfsync everysec  
  29. no-appendfsync-on-rewrite no  
  30. auto-aof-rewrite-percentage 100  
  31. auto-aof-rewrite-min-size 64mb  
  32. aof-load-truncated yes  
  33. lua-time-limit 5000  
  34. slowlog-log-slower-than 10000  
  35. slowlog-max-len 128  
  36. latency-monitor-threshold 0  
  37. notify-keyspace-events ""  
  38. hash-max-ziplist-entries 512  
  39. hash-max-ziplist-value 64  
  40. list-max-ziplist-size -2  
  41. list-compress-depth 0  
  42. set-max-intset-entries 512  
  43. zset-max-ziplist-entries 128  
  44. zset-max-ziplist-value 64  
  45. hll-sparse-max-bytes 3000  
  46. activerehashing yes  
  47. client-output-buffer-limit normal 0 0 0  
  48. client-output-buffer-limit slave 256mb 64mb 60  
  49. client-output-buffer-limit pubsub 32mb 8mb 60  
  50. hz 10  
  51. aof-rewrite-incremental-fsync yes  


[html]  view plain  copy
  1. cat Dockerfile   

[html]  view plain  copy
  1. FROM redis:3.2-alpine  
  2.   
  3. COPY ["redis.conf", "/opt/k8s-redis/"]  
  4. COPY ["docker-entrypoint.sh", "/usr/local/bin/"]  

以上就是编译需要使用到的文件。cd到这个目录,执行下面的命令。

[html]  view plain  copy
  1. docker build -t "ausov/redis:3.2-alpine" .  

镜像编译完成以后,需要确保所有的节点都有这个镜像。



2>>>>>>>>>>>部署安装

部署安装我们需要使用三个文件,分别是:

primary.yml  secondary.yml  sentinel.yml

下面是文件内容:

[html]  view plain  copy
  1. [root@centos-master example]# cat primary.yml   
  2. apiVersion: v1  
  3. kind: Service  
  4. metadata:  
  5.   name: redis-primary  
  6.   labels:  
  7.     app: redis-primary  
  8. spec:  
  9.   ports:  
  10.   - port: 6379  
  11.     name: redis-primary  
  12.   clusterIP: None  
  13.   selector:  
  14.     app: redis-primary  
  15. ---  
  16. apiVersion: apps/v1beta1  
  17. kind: StatefulSet  
  18. metadata:  
  19.   name: redis-primary  
  20. spec:  
  21.   serviceName: redis-primary  
  22.   replicas: 1  
  23.   template:  
  24.     metadata:  
  25.       labels:  
  26.         app: redis-primary  
  27.     spec:  
  28.       terminationGracePeriodSeconds: 10  
  29.       containers:  
  30.       - name: redis-primary  
  31.         image: ausov/redis:3.2-alpine  
  32.         imagePullPolicy: IfNotPresent  
  33.         ports:  
  34.         - containerPort: 6379  
  35.           name: redis-primary  
  36.         volumeMounts:  
  37.         - name: data  
  38.           mountPath: /data  
  39.   volumeClaimTemplates:  
  40.   - metadata:  
  41.       name: data  
  42.       annotations:  
  43.         volume.alpha.kubernetes.io/storage-class: anything  
  44.     spec:  
  45.       accessModes: [ "ReadWriteOnce" ]  
  46.       resources:  
  47.         requests:  
  48.           storage: 5Gi  

[html]  view plain  copy
  1. [root@centos-master example]# cat secondary.yml   
  2. apiVersion: v1  
  3. kind: Service  
  4. metadata:  
  5.   name: redis-secondary  
  6.   labels:  
  7.     app: redis-secondary  
  8. spec:  
  9.   ports:  
  10.   - port: 6379  
  11.     name: redis-secondary  
  12.   clusterIP: None  
  13.   selector:  
  14.     app: redis-secondary  
  15. ---  
  16. apiVersion: apps/v1beta1  
  17. kind: StatefulSet  
  18. metadata:  
  19.   name: redis-secondary  
  20. spec:  
  21.   serviceName: redis-secondary  
  22.   replicas: 2  
  23.   template:  
  24.     metadata:  
  25.       labels:  
  26.         app: redis-secondary  
  27.     spec:  
  28.       terminationGracePeriodSeconds: 10  
  29.       containers:  
  30.       - name: redis-secondary  
  31.         image: ausov/redis:3.2-alpine  
  32.         imagePullPolicy: IfNotPresent  
  33.         env:  
  34.         - name: SLAVEOF  
  35.           value: redis-primary-0.redis-primary  
  36.         ports:  
  37.         - containerPort: 6379  
  38.           name: redis-secondary  
  39.         volumeMounts:  
  40.         - name: data  
  41.           mountPath: /data  
  42.   volumeClaimTemplates:  
  43.   - metadata:  
  44.       name: data  
  45.       annotations:  
  46.         volume.alpha.kubernetes.io/storage-class: anything  
  47.     spec:  
  48.       accessModes: [ "ReadWriteOnce" ]  
  49.       resources:  
  50.         requests:  
  51.           storage: 5Gi  

[html]  view plain  copy
  1. [root@centos-master example]# cat sentinel.yml   
  2. apiVersion: v1  
  3. kind: Service  
  4. metadata:  
  5.   name: redis-sentinel  
  6.   labels:  
  7.     app: redis-sentinel  
  8. spec:  
  9.   ports:  
  10.   - port: 26379  
  11.     name: redis-sentinel  
  12.   clusterIP: None  
  13.   selector:  
  14.     app: redis-sentinel  
  15. ---  
  16. apiVersion: apps/v1beta1  
  17. kind: StatefulSet  
  18. metadata:  
  19.   name: redis-sentinel  
  20. spec:  
  21.   serviceName: redis-sentinel  
  22.   replicas: 3  
  23.   template:  
  24.     metadata:  
  25.       labels:  
  26.         app: redis-sentinel  
  27.     spec:  
  28.       terminationGracePeriodSeconds: 10  
  29.       containers:  
  30.       - name: redis-sentinel  
  31.         image: ausov/redis:3.2-alpine  
  32.         imagePullPolicy: IfNotPresent  
  33.         env:  
  34.         - name: SENTINEL  
  35.           value: redis-primary-0.redis-primary  
  36.         ports:  
  37.         - containerPort: 26379  
  38.           name: redis-sentinel  

三个文件都存在以后:

[html]  view plain  copy
  1. kubectl create -f primary.yml  -f secondary.yml  -f  sentinel.yml  

创建完成后,查看一下pod

[html]  view plain  copy
  1. kubectl get pod   

会得到以下信息:

[html]  view plain  copy
  1. NAME                                READY     STATUS    RESTARTS   AGE  
[html]  view plain  copy
  1. redis-primary-0                     1/1       Running   0          2d  
  2. redis-secondary-0                   1/1       Running   0          2d  
  3. redis-secondary-1                   1/1       Running   0          2d  
  4. redis-sentinel-0                    1/1       Running   0          2d  
  5. redis-sentinel-1                    1/1       Running   0          2d  
  6. redis-sentinel-2                    1/1       Running   0          2d  

下面是查看StatefulSet的信息:

[html]  view plain  copy
  1. [root@centos-master example]# kubectl get statefulset  
  2. NAME              DESIRED   CURRENT   AGE  
  3. redis-primary     1         1         2d  
  4. redis-secondary   2         2         2d  
  5. redis-sentinel    3         3         2d  

必须要确保DESIRED和CURRENT的值是一样的。


查看持久存储的信息:

[html]  view plain  copy
  1. [root@centos-master example]# kubectl get pvc  

[html]  view plain  copy
  1. NAME                                       STATUS    VOLUME                                     CAPACITY   ACCESSMODES   AGE  
[html]  view plain  copy
  1. data-redis-primary-0                       Bound     pvc-94534255-d614-11e6-955d-1866daed1b04   5Gi        RWO           2d  
  2. data-redis-secondary-0                     Bound     pvc-9a8f2080-d614-11e6-955d-1866daed1b04   5Gi        RWO           2d  
  3. data-redis-secondary-1                     Bound     pvc-9a9029b4-d614-11e6-955d-1866daed1b04   5Gi        RWO           2d  

我们在注意这里的STATUS,是Bound。

如果不是,用命令

[html]  view plain  copy
  1. describe pvc data-redis-primary-0    
如果出现下面的问题:

cannot find volume plugin for alpha provisioning

则需要修改文件:

[html]  view plain  copy
  1. /etc/kubernetes/manifests/kube-controller-manager.json   

增加参数: --enable-hostpath-provisioner=true

以下是截取了这个文件的一部分:

[html]  view plain  copy
  1. "name": "kube-controller-manager",  
  2. "image": "gcr.io/google_containers/kube-controller-manager-amd64:v1.5.1",  
  3. "command": [  
  4.   "kube-controller-manager",  
  5.   "--address=127.0.0.1",  
  6.   "--leader-elect",  
  7.   "--master=127.0.0.1:8080",  
  8.   "--cluster-name=kubernetes",  
  9.   "--root-ca-file=/etc/kubernetes/pki/ca.pem",  
  10.   "--service-account-private-key-file=/etc/kubernetes/pki/apiserver-key.pem",  
  11.   "--cluster-signing-cert-file=/etc/kubernetes/pki/ca.pem",  
  12.   "--cluster-signing-key-file=/etc/kubernetes/pki/ca-key.pem",  
  13.   "--insecure-experimental-approve-all-kubelet-csrs-for-group=system:kubelet-bootstrap",  
  14.   "--allocate-node-cidrs=true",  
  15.   "--enable-hostpath-provisioner=true",  
  16.   "--cluster-cidr=10.245.0.0/16"  
  17. ],  

修改保存,重启一下docker或kubelet.

通过上面的配置,Redis基本就配置完成: 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值