为远程erlang节点运行观察者:使其更简单

gmi*_*ile 9 erlang elixir kubernetes

我有一个kubernetes集群.

我可以轻松连接到远程容器,并运行连接到live production erlang节点的shell节点:

$ kubectl exec myapp-2431125679-cwqvt -i -t -- iex --name debugging@127.0.0.1 --remsh myliveapp@127.0.0.1 --cookie my_secret_cookie

Erlang/OTP 18 [erts-7.3.1] [source] [64-bit] [smp:2:2] [async-threads:10] [kernel-poll:false]

Interactive Elixir (1.3.4) - press Ctrl+C to exit (type h() ENTER for help)
iex(myliveapp@127.0.0.1)1>
Run Code Online (Sandbox Code Playgroud)

我需要的,虽然是要能够运行:observer针对远程现场制作的Erlang节点.

我也可以这样做:

  1. 杀死本地epmd进程:

    killall epmd
    
    Run Code Online (Sandbox Code Playgroud)
  2. 将选定的远程端口转发到本地计算机:

    kubectl port-forward myapp-2431125679-cwqvt 35609 4369
    
    Run Code Online (Sandbox Code Playgroud)

    我知道我的应用程序在远程容器上的端口35609上epmd运行,默认情况下4369是端口运行,这是我的远程容器的情况.

  3. 跑:

    iex --name debugging@127.0.0.1 --cookie marketplace -e ':observer.start()'
    
    Run Code Online (Sandbox Code Playgroud)
  4. 从顶部菜单中选择我感兴趣的应用程序:observer.

我的问题是:

  1. 这样做可以更简单吗?
  2. 有什么我应该知道的kubernetes,以便能够编写一个连接到远程节点并做我想要的单线程吗?

最终,我可以将此过程变为单行或将其转换为shell脚本吗?

现在杀人epmd看起来真的很脏,我很想能够特别避免这种情况.

Dom*_*nic 2

是的,你可以把它变成一个 shell 脚本。我确实为此用例创建了一个 shell 脚本,但我使用的是 SSH。我的方法看起来和你的一样,我也必须在本地杀死 epmd 。但我能够将它包装到 bash 脚本中。您可以在这里获取它: https: //github.com/dominicletz/remote_observe/

该脚本还自动发现远程波束端口。所以你最终会得到一行:

remote_observe -c <cookie> <server-address>

我没有方便尝试的 Kubernetes 部署,但它可能可以轻松移植来调用kubectl port-forward <server-address> <port>而不是当前的 ssh 转发。