Как настроить kubemqctl для подключения к локальному кластеру kubemq, работающему в docker? - PullRequest
0 голосов
/ 06 февраля 2020

Мне нужно запустить кластер kubemq на моем рабочем столе для разработки. Я установил контейнер kubemq docker, как описано здесь https://docs.kubemq.io/installation/docker.html. Но я не могу понять, как подключиться к нему с помощью утилиты kubemqctl? Возможно ли это вообще? Он показывает только кластеры kubernetes из конфигурации kubectl. И я не вижу способа передачи информации о соединении. Спасибо.

update # 1

после следования инструкциям по установке я вижу только те кластеры, которые работают в кластере kubernetes и перечислены в моей конфигурации kubectl.

Getting KubeMQ Cluster List...
Current Kubernetes cluster context connection: gke_xxxxx_us-central1-a_xxxx
NAME            DESIRED  RUNNING  READY  IMAGE                 AGE          SERVICES
env-dev/kubemq  3        3        3      kubemq/kubemq:latest  1792h54m57s  ClusterIP 10.0.2.211:8080,50000,9090,5228

, когда я пытаюсь переключить conext, он снова показывает только этот кластер

Current Kubernetes cluster context connection: gke_xxxxx_us-central1-a_xxxx ? Select kubernetes cluster context  [Use arrows to move, type to filter, ? for more help]
> gke_xxxxx_us-central1-a_xxxx

Мой контент .kubemqctl.yaml:

autointegrated: false
currentnamespace: kubemq
currentstatefulset: kubemq-cluster
host: localhost
grpcport: 50000
restport: 9090
apiport: 8080
issecured: false
certfile: ""
kubeconfigpath: ""
connectiontype: grpc
defaulttoken: XXXXXX-ed0c-4077-9a74-b53805ee3214

update # 2

Я могу подключиться из моего go кода к моему локально работающему кластеру kubemq

archi@eagle:~/prj/kubemq-go/examples/rpc/command$ docker container ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                                                                      NAMES
3cd60e4373e4        kubemq/kubemq       "./kubemq-run"      46 hours ago        Up 46 hours         0.0.0.0:8080->8080/tcp, 0.0.0.0:9090->9090/tcp, 0.0.0.0:50000->50000/tcp   modest_wescoff

Но я не могу понять, как можно подключиться к нему с помощью утилиты kubemq, потому что он просматривает один раз мою конфигурацию kubectl, которая не может содержать мой локальный кластер kubemq, работающий в docker контейнере, а не в кластере kubernetes. Чтобы перечислить мои кластеры kubemq, я использую команду:

kubemqctl cluster get

вывод команды показан выше (в разделе об обновлении # 1 моего вопроса)

update # 3

Как сказал @mario. Я могу прикрепить к своим запросам канал и посмотреть все сообщения!

$kubemqctl queries attach userservice_channel
Adding 'userservice_channel' to attach list
[queries]  [userservice_channel]  kubemq-3cd60e4373e4 Server connected.
[queries]  [userservice_channel]  { "Kind": "request", "ID": "user_token_validate", "Channel": "userservice_channel", "ReplyChannel": "_INBOX.OYnfIQX2k7V9hTmevxHApp.Iqfr3HUw", "Metadata": "some-metadata", "Body": "\n\ufffd\u0001eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyIjoxLCJyb2xlIjoic3VwZXJ1c2Vy....... 

1 Ответ

1 голос
/ 06 февраля 2020

Я предполагаю, что вы уже установили kubemqctl команду, следующую за этой инструкцией, но вы, вероятно, еще не настроили ее.

После запуска команды kubemqctl help , он покажет вам все доступные опции, включая:

Usage:
  kubemqctl [command]

Available Commands:
  cluster      Executes KubeMQ cluster management commands
  commands     Execute KubeMQ 'commands' RPC commands
  config       Run Kubemqctl configuration wizard command

Сначала вам нужно запустить kubemqctl config, который запустит мастер настройки , шаг за шагом проведя вас по основам c configuration:

На втором шаге вы должны выбрать (используя клавиши со стрелками) свой Local docker container:

? Set Default KubeMQ Token (press Enter for default): 
? Select KubeMQ install location:  [Use arrows to move, type to filter, ? for more help]
  Kubernetes cluster
  MicroK8s
  K3s
  Minikube
  Other Kubernetes distribution
> Local docker container

Другие опции, которые вы, вероятно, можете оставить по умолчанию.

Я предполагаю, что вы уже проверили, что ваш KubeMQ запущен и работает, и его API доступен с:

curl --location --request GET "http://localhost:8080/health" \
  --header "Content-Type: application/json"

Если это так, вы должны иметь возможность взаимодействовать с ним, используя kubemqctl Инструмент командной строки.

Пожалуйста, дайте мне знать, если это поможет.


Обновление:

kubemqctl config - это просто wizard инструмент, который создает ваш .kubemqctl.yaml файл, на основе которого вы можете запустить kubemqctl commands против вашего kubemq экземпляра. Мой .kubemqctl.yaml выглядит точно так же, как ваш (только с другим токеном).

Как я уже упоминал в своем комментарии, один docker контейнер вообще не считается кластером, С точки зрения kubernetes это просто среда выполнения контейнера, и вполне нормально, что kubemqctl, аналогично kubectl, не будет отображать его как cluster и не сможет выполнять на нем ни один кластер. связанные операции, такие как kubemqctl cluster get. Вы можете легко проверить это, изменив свое имя .kube / config:

mv .kube/config .kube/config_temporarily_disabled

Если я сейчас запускаю kubemqctl cluster get, он показывает мне следующий вывод:

Getting KubeMQ Cluster List...
Error: Kubernetes Config File: Stat <path_to_the_kube_config_file>: No Such File Or Directory

, что означает, что kubemqctl аналогично kubectl всегда ищет файл kubeconfig при выполнении любой операции cluster-related. Эта группа команд kubemqctl просто предназначена только для этой цели и не предназначена для использования с вашим экземпляром kubemq, развернутым в виде отдельного контейнера docker в соответствии с этой инструкцией.

Важно: один docker контейнер НЕ кластер

Это не кластер и в обычном смысле этого слова и не считается таковым kubemqctl Утилита.

Обратите внимание, что вы даже не создали его с помощью:

kubemqctl cluster create -t <YOUR_KUBEMQ_TOKEN>

, который используется для создания cluster во всех описанных решениях на основе kubernetes в документации : Kubernetes, MicroK8s и K3s , но вы не найдете ее в разделе Docker. По сути, если вы не создали свой экземпляр kubemq с помощью команды kubemqctl cluster create, вы также не сможете отобразить его с помощью kubemqctl cluster get, поскольку это не cluster.

Однако вы можете все еще успешно выполняются другие команды kubemqctl и их подкоманды для отдельного экземпляра kubemq, работающего в одном контейнере docker. На самом деле вы можете запустить большинство команд, перечисленных ниже (за исключением cluster):

$ kubemqctl 
Usage:
  kubemqctl [command]

Available Commands:
  cluster      Executes KubeMQ cluster management commands
  commands     Execute KubeMQ 'commands' RPC commands
  config       Run Kubemqctl configuration wizard command
  events       Execute KubeMQ 'events' Pub/Sub commands
  events_store Execute KubeMQ 'events_store' Pub/Sub commands
  help         Help about any command
  queries      Execute KubeMQ 'queries' RPC based commands
  queues       Execute KubeMQ 'queues' commands

Flags:
  -h, --help      help for kubemqctl
      --version   version for kubemqctl

Use "kubemqctl [command] --help" for more information about a command.

Как я уже упоминал, ваш .kubemqctl.yaml выглядит совершенно нормально. Он правильно настроен для запуска команд на kubemq, запущенном в docker. Когда я запускаю docker ps на моей машине, я вижу правильно развернутый контейнер kubemq:

c9adac88484f        kubemq/kubemq          "./kubemq-run"           3 hours ago         Up 3 hours          0.0.0.0:8080->8080/tcp, 0.0.0.0:9090->9090/tcp, 0.0.0.0:50000->50000/tcp   sleepy_ganguly

Как вы можете видеть в выводе выше (или в выводе, добавленном к вашему вопросу, так как он почти то же самое), он правильно отображает необходимые порты, выставленные container, на локальный адрес машины. Вы также можете проверить это командой netstat:

$ sudo netstat -ntlp | egrep "8080|9090|50000"
tcp6       0      0 :::8080                 :::*                    LISTEN      21431/docker-proxy
tcp6       0      0 :::50000                :::*                    LISTEN      21394/docker-proxy
tcp6       0      0 :::9090                 :::*                    LISTEN      21419/docker-proxy

В принципе достаточно использовать такой экземпляр kubemq. Давайте запустим несколько примеров команд.

Выполнение просто:

kubemqctl queues

покажет нам страницу help, которая определяет, как ее следует использовать, и даст несколько полезных примеров. Давайте выберем kubemqctl queues list как первый:

$ kubemqctl queues list
CHANNELS:
NAME  CLIENTS  MESSAGES  BYTES  FIRST_SEQUENCE  LAST_SEQUENCE
q1    1        12        2621   1               12

TOTAL CHANNELS:  1

CLIENTS:
CLIENT_ID                             CHANNEL  ACTIVE  LAST_SENT  PENDING  STALLED
#####################################  q1       false   2          1        true

TOTAL CLIENTS:  1

Давайте выберем еще один:

kubemqctl queues send

Опять же, при запуске без обязательных флагов и параметров, он показывает нам несколько полезных примеров использования:

Error: Missing Arguments, Must Be 2 Arguments, Channel And A Message
Try: 
    # Send message to a queue channel channel
    kubemqctl queue send q1 some-message

    # Send message to a queue channel with metadata
    kubemqctl queue send q1 some-message --metadata some-metadata

    # Send 5 messages to a queues channel with metadata
    kubemqctl queue send q1 some-message --metadata some-metadata -m 5

    # Send message to a queue channel with a message expiration of 5 seconds
    kubemqctl queue send q1 some-message -e 5

    # Send message to a queue channel with a message delay of 5 seconds
    kubemqctl queue send q1 some-message -d 5

    # Send message to a queue channel with a message policy of max receive 5 times and dead-letter queue 'dead-letter'
    kubemqctl queue send q1 some-message -r 5 -q dead-letter

Давайте запустим один из них (слегка измененный):

kubemqctl queue send queue2 some-message --metadata some-metadata

Вы должны увидеть похожий вывод:

[Channel: queue2] [client id: ##############################] -> {id: ############################, metadata: some-metadata, body: some-message - (0), sent at: #### }

Теперь, если вы перечислите наши доступные очереди с помощью команды kubemqctl queues list, вы увидите среди других (q1 был ранее создан мной) нашу недавно созданную очередь с именем queue2:

CHANNELS:
NAME    CLIENTS  MESSAGES  BYTES  FIRST_SEQUENCE  LAST_SEQUENCE
q1      1        12        2621   1               12
queue2  0        1         232    1               1

TOTAL CHANNELS:  2
...

Это было просто пример, чтобы показать вам, что он может быть запущен для экземпляра kubemq, работающего на одном docker контейнере , но вы можете выполнить тот же способ, что и другие команды kubemqctl, такие как commands, events или queries. kubemqctl имеет действительно хороший context help со множеством примеров использования, так что вы легко найдете то, что вам нужно.

Надеюсь, мне удалось устранить все неясности.

...