Kubernetes Redis Кластерный вопрос

Я пытаюсь создать кластер redis, используя kubernetes на centos. У меня есть мастер kubernetes, работающий на одном хосте, и подчиненные kubernetes на 2 разных хостах.

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 expose rc redis-master --name = redis-service --port = 6379 --target-port = 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 -it redis-trib bash

./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

Redis Cluster создан, как ожидается, с помощью приведенного ниже сообщения.

[OK] All 16384 slots covered.

Теперь я должен иметь доступ к своему Redis-кластеру на IP-узле kubernetes (192.168.240.116) и nodePort(30894) с любого хоста в моей сети. Все работает, как и ожидалось, когда я выполняю приведенную ниже команду с одного из узлов 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

Разве невозможно получить доступ к redis-кластеру за пределами сети кластера kubernetes при использовании типа службы NodePort?

Также я не могу использовать тип сервиса LoadBalancer, так как я не размещаю его в облаке.

Я застрял с этой проблемой в течение довольно долгого времени. Кто-нибудь может подсказать, какой подход я должен использовать для доступа к моему Redis-кластеру за пределами моей сети?

Спасибо

1 ответ

Бег ./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 свой собственный сервис и иметь один дополнительный кластерный сервис для балансировки внешних запросов. Как показано на примере репозитория от Kelsey Hightower. Таким образом, POD могут связываться, хотя внутренние порты и (внешние) клиенты могут использовать кластерный порт с балансировкой нагрузки. В этом случае также подразумевается, что для каждого POD требуется собственный ReplicaSet (или Deployment). На YouTube доступно длинное выступление Келси, объясняющее настройку - YouTube / Slideshare.

Альтернативой может быть использование одного мастера Redis, как показано в других примерах.

Другие вопросы по тегам