Kubernetes - Невозможно подключиться к Redis Pods из кластера Kubernetes - PullRequest
0 голосов
/ 26 февраля 2020

Я пытаюсь подключиться к некоторым блокам redis в моем кластере kubernetes, но не могу заставить его работать. Я вызываю службу redis, пытаясь использовать имя службы в качестве имени хоста в программе, подключающейся к кластеру redis redis-sentinel:26379, или с прямым списком конечных точек из моих 3-х модулей, работающих под образом redis 10.0.10.xxx:26379. Я знаю, что кластер redis работает, так как я могу запустить свою программу за пределами docker / kubernetes и превратить службу redis-sentinel в NodePort, и он может подключаться и работать очень хорошо. Но я не могу подключиться к этому кластеру redis из других модулей внутри kubernetes.

Использование Docker Desktop в качестве среды Kubernetes.

Служба Redis pod:

kind: Service
metadata:
  labels:
    name: sentinel
    role: service
  name: redis-sentinel
spec:
  ports:
    - port: 26379
      targetPort: 26379
  selector:
    redis-sentinel: "true"

Redis-Sentinel ReplicaController:

kind: ReplicationController
metadata:
  name: redis-sentinel
spec:
  replicas: 3
  selector:
    redis-sentinel: "true"
  template:
    metadata:
      labels:
        name: redis-sentinel
        redis-sentinel: "true"
        role: sentinel
    spec:
      containers:
      - name: sentinel
        image: k8s.gcr.io/redis:v1
        env:
          - name: SENTINEL
            value: "true"
        ports:
          - containerPort: 26379

Redis Master ReplicaController:

kind: ReplicationController
metadata:
  name: redis
spec:
  replicas: 3
  selector:
    name: redis
  template:
    metadata:
      labels:
        name: redis
        role: master
    spec:
      containers:
      - name: redis
        image: k8s.gcr.io/redis:v1
        ports:
        - containerPort: 6379
        resources:
          limits:
            cpu: "0.1"
        volumeMounts:
        - mountPath: /redis-master-data
          name: data
      volumes:
        - name: data

@ Matt, попытка PING redis-sentinel timeout и nc redis-sentinel 26379, похоже, ничего не делает.

@ FrankYuchengGu да, служба DNS работает, но, похоже, не работает. Запуск образа busybox возвращает это при запуске nslookup redis-sentinel

** server can't find redis-sentinel.default.svc.cluster.local: NXDOMAIN 

*** Can't find redis-sentinel.svc.cluster.local: No answer 
*** Can't find redis-sentinel.cluster.local: No answer 
*** Can't find redis-sentinel.default.svc.cluster.local: No answer 
*** Can't find redis-sentinel.svc.cluster.local: No answer 
*** Can't find redis-sentinel.cluster.local: No answer

Похоже, что у образа busybox были проблемы с командой nslookup. с помощью образа dnsutils со страницы отладки DNS Kubernetes можно найти службу

$ kubectl exec -ti dnsutils -- nslookup redis-sentinel
Server:         10.96.0.10
Address:        10.96.0.10#53

Name:   redis-sentinel.default.svc.cluster.local
Address: 10.110.45.31

Однако, похоже, что попытка redis-sentinel.default.svc.cluster.local:26379 или 10.110.45.31:26379 не работает, и моя программа по-прежнему не может найти повтор кластера.

1 Ответ

0 голосов
/ 06 марта 2020

Полагаю, вы использовали этот урок на Github. Когда я развернул YAML, которые вы предоставили, я столкнулся со многими проблемами, с которыми я не мог связаться. В упомянутом руководстве вы можете найти информацию, что сначала вы должны создать Master Pod.

. Мы будем использовать общее пространство имен сети для bootstrap нашего кластера Redis. В частности, самому первому стражу нужно знать, как найти хозяина (последующие стражи просто спрашивают первого стража). Поскольку все контейнеры в модуле Pod совместно используют пространство имен сети, сторож может просто посмотреть на $ (hostname -i): 6379.

Затем Service и позже redis server. После того, как все установлено, вы просто удалите этот модуль. Быстрые шаги для развертывания можно найти здесь

$ kubectl get svc,pods -o wide
NAME                     TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)     AGE   SELECTOR
service/kubernetes       ClusterIP   10.97.0.1      <none>        443/TCP     21h   <none>
service/redis-sentinel   ClusterIP   10.97.13.152   <none>        26379/TCP   71m   redis-sentinel=true

NAME                       READY   STATUS    RESTARTS   AGE   IP          NODE                                   NOMINATED NODE   READINESS GATES
pod/redis-6kb5p            1/1     Running   0          71m   10.32.2.7   gke-redis-default-pool-bc40bcaa-08sj   <none>           <none>
pod/redis-sentinel-qf9l8   1/1     Running   0          71m   10.32.1.5   gke-redis-default-pool-bc40bcaa-txmt   <none>           <none>
pod/redis-sentinel-rnsw6   1/1     Running   0          71m   10.32.2.8   gke-redis-default-pool-bc40bcaa-08sj   <none>           <none>
pod/redis-sentinel-sbn8f   1/1     Running   0          71m   10.32.1.7   gke-redis-default-pool-bc40bcaa-txmt   <none>           <none>
pod/redis-sq2g2            1/1     Running   0          71m   10.32.1.6   gke-redis-default-pool-bc40bcaa-txmt   <none>           <none>
pod/redis-wv5q2            1/1     Running   0          71m   10.32.1.8   gke-redis-default-pool-bc40bcaa-txmt   <none>           <none>

$ kubectl get ep
NAME             ENDPOINTS                                         AGE
redis-sentinel   10.32.1.5:26379,10.32.1.7:26379,10.32.2.8:26379   72m

Кроме того, вы также можете проверить это руководство, используя Redis 3.x.

Как подключиться

Чтобы запустить Redis container, выполните команду

kubectl exec -ti <pod-name> -- redis-cli 

$ kubectl exec -ti redis-6kb5p redis-cli
127.0.0.1:6379> info
# Server
redis_version:2.8.19
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:f308ca06a4d63700

Чтобы подключиться к redis с помощью service, необходимо ввести модуль.

$ kubectl exec -ti redis-sentinel-qf9l8 /bin/bash

Если вы проверите env внутри этого контейнера, вы сможете найти некоторую конфигурацию kubernetes.

root@redis-sentinel-qf9l8:/data# env
HOSTNAME=redis-sentinel-qf9l8
REDIS_DOWNLOAD_URL=http://download.redis.io/releases/redis-2.8.19.tar.gz
KUBERNETES_PORT_443_TCP_PORT=443
KUBERNETES_PORT=tcp://10.97.0.1:443
TERM=xterm
KUBERNETES_SERVICE_PORT=443
KUBERNETES_SERVICE_HOST=10.97.0.1
REDIS_SENTINEL_PORT_26379_TCP_ADDR=10.97.13.152
REDIS_SENTINEL_SERVICE_HOST=10.97.13.152

Теперь на основе скрипта из здесь

master = $ (redis-cli -h $ {REDIS_SENTINEL_SERVICE_HOST} -p $ {REDIS_SENTINEL_SERVICE_PORT}

Вы можете подключиться к сервису с помощью Kubernetes envs.

root@redis-sentinel-qf9l8:/data# redis-cli -h ${REDIS_SENTINEL_SERVICE_HOST} -p ${REDIS_SENTINEL_SERVICE_PORT}
10.97.13.152:26379>

Или используя спецификацию c информация $ redis-cli -h <service-name> -p <service-port>

root@redis-sentinel-qf9l8:/data# redis-cli -h redis-sentinel -p 26379
redis-sentinel:26379>

В качестве дополнительной информации.

Вы не можете пропинговать service с ClusterIP, так как его виртуальный адрес управляется kube-proxy демон. Более подробную информацию можно найти в официальных документах .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...