如何设置 kubemqctl 以连接到 docker 中的本地 kubemq 集群 运行?

How to setup kubemqctl to connect to local kubemq cluster running in docker?

我需要在桌面上 运行 kubemq 集群进行开发。我已经按照这里 https://docs.kubemq.io/installation/docker.html 的描述安装了 kubemq docker 容器。但是我不知道如何使用 kubemqctl 实用程序连接到它?一般情况下可以吗?它仅显示来自 kubectl 配置的 kubernetes 集群。而且我看不到如何传递连接信息的方式。谢谢。

更新#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

更新#2

我可以从我的 go 代码连接到我的本地 运行ning 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 集群,运行ning 在 docker 容器,而不是 kubernetes 集群。要列出我的 kubemq 集群,我使用命令:

kubemqctl cluster get

命令的输出如上所示(在我的问题的更新#1 部分)

更新 #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....... 

我假设您已经按照 this 说明安装了 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,这将启动配置向导,引导您逐步完成基本配置:

在第二步中,您应该 select(使用箭头键)您的 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 已启动并且 运行ning 及其 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 的角度来看,它只是一个容器 运行time 并且 kubemqctl 类似于 kubectl 不会将其列为 [= 是完全正常的38=] 并且将无法对其执行任何与集群相关的操作,例如 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

这意味着 kubemqctlkubectl 类似,在执行任何 cluster-related 操作时总是查找 kubeconfig 文件。这组 kubemqctl 命令只是为此目的而设计的,并不打算用于按照 this 指令部署为单个 docker 容器的 kubemq 实例。

重要:单个docker容器不是集群

它不是常识上的集群,kubemqctl 实用程序也不认为它是集群。

请注意,您甚至没有创建它:

kubemqctl cluster create -t <YOUR_KUBEMQ_TOKEN>

用于在 documentation: Kubernetes, MicroK8s and K3s but you won't find it in Docker 部分中描述的所有 kubernetes-based 解决方案中创建 cluster。基本上,如果您没有使用 kubemqctl cluster create 命令创建 kubemq 实例,您也将无法使用 kubemqctl cluster get 列出它,因为这不是 cluster

然而,您仍然可以在单个 docker 上针对您的独立 kubemq 实例 运行 成功地 运行 其他 kubemqctl 命令及其子命令容器。您实际上可以 运行 下面列出的大多数命令(不包括 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 看起来完全没问题。它已正确配置为 运行 命令针对您在 docker 中的 kubemq 运行ning。当我 运行 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 命令相同,例如 commandseventsquerieskubemqctl 非常好 [=7​​5=] 有很多使用示例,所以您应该很容易找到您需要的东西。

我希望我能够澄清所有的歧义。

每种部署方法都需要一个 KubeMQ 令牌。要获得一个,您需要先注册 kubemq.io

然后要开始使用 KubeMQ 消息队列,您首先需要在本地或远程节点上 运行 一个 KubeMQ docker 容器,如下所示:

docker run -d -p 8080:8080 -p 50000:50000 -p 9090:9090 -v kubemq-vol:/store -e KUBEMQ_TOKEN= "Your KubeMQ Token Here" kubemq/kubemq

如果您想 运行 Kubernetes 在本地使用以下命令:

minikube start --vm-driver=virtualbox

kubemqclt cluster create -t "Your Token Here"