如何设置 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
这意味着 kubemqctl
与 kubectl
类似,在执行任何 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
命令相同,例如 commands
、events
或 queries
。 kubemqctl
非常好 [=75=] 有很多使用示例,所以您应该很容易找到您需要的东西。
我希望我能够澄清所有的歧义。
每种部署方法都需要一个 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"
我需要在桌面上 运行 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
这意味着 kubemqctl
与 kubectl
类似,在执行任何 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
命令相同,例如 commands
、events
或 queries
。 kubemqctl
非常好 [=75=] 有很多使用示例,所以您应该很容易找到您需要的东西。
我希望我能够澄清所有的歧义。
每种部署方法都需要一个 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"