2017-03-19 191 views
1

我正嘗試在centos上使用kubernetes創建redis集羣。我有一臺主機上運行我的kubernetes master,兩臺主機上運行kubernetes slave。Kubernetes Redis集羣問題

etcdctl GET/KUBE-的CentOS/network/config中

{ "Network": "172.30.0.0/16", "SubnetLen": 24, "Backend": { "Type": "vxlan" } } 

這裏是我的複製控制器

apiVersion: v1 
kind: ReplicationController 
metadata: 
    name: redis-master 
    labels: 
    app: redis 
    role: master 
    tier: backend 
spec: 
    replicas: 6 
    template: 
    metadata: 
     labels: 
     app: redis 
     role: master 
     tier: backend 
    spec: 
     containers: 
     - name: master 
     image: redis 
     command: 
      - "redis-server" 
     args: 
      - "/redis-master/redis.conf" 
     ports: 
     - containerPort: 6379 
     volumeMounts: 
     - mountPath: /redis-master 
      name: config 
     - mountPath: /redis-master-data 
      name: data 
     volumes: 
     - name: data 
      emptyDir: {} 
     - name: config 
      configMap: 
      name: redis-config 
      items: 
      - key: redis-config 
       path: redis.conf  

kubectl創建-f rc.yaml

NAME       READY  STATUS RESTARTS AGE  IP   NODE 
redis-master-149tt    1/1  Running 0   8s  172.30.96.4 centos-minion-1 
redis-master-14j0k    1/1  Running 0   8s  172.30.79.3 centos-minion-2 
redis-master-3wgdt    1/1  Running 0   8s  172.30.96.3 centos-minion-1 
redis-master-84jtv    1/1  Running 0   8s  172.30.96.2 centos-minion-1 
redis-master-fw3rs    1/1  Running 0   8s  172.30.79.4 centos-minion-2 
redis-master-llg9n    1/1  Running 0   8s  172.30.79.2 centos-minion-2 

Redis的-config文件中使用

appendonly yes 
cluster-enabled yes 
cluster-config-file /redis-master/nodes.conf 
cluster-node-timeout 5000 
dir /redis-master 
port 6379 

我用下面的命令來創建kubernetes服務。

kubectl暴露RC Redis的主--name = Redis的服務--port = 6379 --target端口= 6379 --type = NodePort

Name:   redis-service 
Namespace:  default 
Labels:   app=redis 
       role=master 
       tier=backend 
Selector:  app=redis,role=master,tier=backend 
Type:   NodePort 
IP:    10.254.229.114 
Port:   <unset> 6379/TCP 
NodePort:  <unset> 30894/TCP 
Endpoints:  172.30.79.2:6379,172.30.79.3:6379,172.30.79.4:6379 + 3  more... 
Session Affinity: None 
No events. 

現在我所有的豆莢和服務正在運行。我正在使用redis-trib pod創建redis羣集。

kubectl EXEC - 它redis的-TRIB的bash

./redis-trib.rb創建--replicas 1 172.30.79.2:6379 172.30.79.3:6379 172.30.79.4:6379 172.30.96.2:6379 172.30.96.3:6379 172.30.96.4:6379

Redis集羣按照預期創建並帶有以下消息。現在

[OK] All 16384 slots covered. 

我應該能夠到我的網絡中的任何主機的訪問kubernetes節點的IP(192.168.240.116)和nodePort(30894)我的Redis集羣。當我從一個kubernetes節點執行下面的命令時,一切都按預期工作。

redis的-CLI -p 30894 -h 192.168.240.116 -c

192.168.240.116:30894> set foo bar 
-> Redirected to slot [12182] located at 172.30.79.4:6379 
OK 
172.30.79.4:6379> 

當我在同一網絡內運行從不同(非kubernetes)相同的命令節點,我看到連接超時錯誤。

Redis的-CLI -c -p 30894 -h 192.168.240.116

192.168.240.116:30894> set foo bar 
-> Redirected to slot [12182] located at 172.30.79.4:6379 
Could not connect to Redis at 172.30.79.4:6379: Connection timed out 

是沒可能訪問kubernetes集羣網絡之外Redis的集羣使用NodePort服務公開時類型?

另外我不能使用LoadBalancer服務類型,因爲我沒有託管它在雲上。

我一直堅持這個問題很長一段時間。有人可以建議我應該用什麼方法訪問我的網絡之外的redis集羣?

感謝

+0

是kube-proxy運行,還是拋出任何錯誤? – jaxxstorm

回答

2

運行./redis-trib.rb create --replicas 1 172.30.79.2:6379 172.30.79.3:6379 172.30.79.4:6379 172.30.96.2:6379 172.30.96.3:6379 172.30.96.4:6379無厘頭與此設置。

端口6379只能通過您提供的服務訪問,但不能直接在您嘗試。這就是爲什麼當你嘗試使用你的設置時遇到問題。

你可以做的是公開每個POD與它自己的服務,並有一個額外的集羣服務來平衡外部請求。如example repository from Kelsey Hightower所示。通過這種方式,POD可以通過內部公開的端口進行通信,(外部)客戶端可以使用負載均衡的集羣端口。這意味着每個POD都需要它自己的副本集(或部署)。凱爾西在YouTube上有很長的演講解釋了這個設置 - YouTube/Slideshare

另一種方法是使用單個redis master,如其他示例所示。

+0

謝謝。我嘗試通過刪除gcloud設置並更改服務中的IP來跟蹤Kelsey的文檔[link](https://github.com/kelseyhightower/kubernetes-redis-cluster),但幾乎沒有任何更改。複製品和服務創建。當我嘗試按照文檔中的說明創建羣集時,它不會創建羣集。相反,我可以看到**等待羣集長時間加入**並繼續前進。 > ./redis-trib.rb create --replicas 1 10.254.242.1:6379 10.254.242.2:6379 10.254.242.3:6379 10.254.242.4:6379 10.254.242.5:6379 10.254.242.6:6379 – user3610007

+0

Whitout看到configs這是很難回答。基本思想是每個POD有一個服務和一個部署,並使用複合服務。您可能需要分享更多的細節才能進一步調試。 – pagid

+0

Config與此鏈接中的replicaset [link](https://github.com/kelseyhightower/kubernetes-redis-cluster/blob/master/replicasets/redis-1.yaml)相同,只是在下面幾行(gcePersistentDisk:pdName :「redis-1」fsType:ext4)被替換爲** emptyDir:{} **以刪​​除gcloud依賴項。併爲服務[鏈接](https://github.com/kelseyhightower/kubernetes-redis-cluster/blob/master/services/redis-1.yaml)。我改變了我的集羣ip來匹配配置** clusterIP:「10.254.242.1」** – user3610007