kubernetes 如何在GKE中使用Kubertenes客户端从Pod A执行Pod B中的shell命令

odopli94  于 2023-10-17  发布在  Kubernetes
关注(0)|答案(1)|浏览(107)

我有一个带有水平扩展的服务器部署。根据负载,在任何给定时间,部署将有3-5个pod。我使用卷Map将配置数据传递到已部署的服务器pod。我必须在我的服务器应用程序中调用一个reload函数,以便它在不重新启动pod的情况下使用更新的配置。
我使用一个单独的.net web API应用程序来更改卷Map中的配置文件(因为它经常更新)。我尝试使用Kubernetes客户端列出所有应用程序Pod,然后执行刷新命令。我在刷新命令中遇到了一个错误,所以我使用“ls”命令进行了检查,但还是遇到了同样的问题。
我还为该帐户提供了rbac权限,以列出pod并在pod中执行。
下面是我添加的权限规则。

- apiGroups: [""]
  resources: ["pods"]
  verbs: ["get", "list", "watch"]
- apiGroups: [""]
  resources: ["pods/exec"]
  verbs: ["create"]

下面是示例代码。

V1PodList list = _client.CoreV1.ListNamespacedPod("development", labelSelector:app=MyAppSelector");
 foreach (V1Pod item in list.Items)
 {
    var webSocket = await client.WebSocketNamespacedPodExecAsync(item.Metadata.Name, "default", "ls",
        item.Spec.Containers[0].Name).ConfigureAwait(false);
    var demux = new StreamDemuxer(webSocket);
    demux.Start();
    var buff = new byte[4096];
    var stream = demux.GetStream(1, 1);
    var read = stream.Read(buff, 0, 4096);
    var str = System.Text.Encoding.Default.GetString(buff);
    Console.WriteLine(str);
}

下面的问题发生在“var WebSocket = await client. WebSocket”行pacedPodExecAsync”
Unhandled exception. System.Net.WebSockets.WebSocketException (0x80004005): The server returned status code '403' when status code '101' was expected.
我想让client. WebSocketWebpagedPodExecAsync方法在我的服务器Pod中执行reload命令。
你能帮我解决这个问题吗?如果我做错了什么,你能指导我吗?同时建议我是否有其他的替代方法可以用于这种情况。

z9smfwbn

z9smfwbn1#

如果您更新一个挂载在pod中的卷中的Map表,那么在一两分钟内,该更改就会反映在pod的文件系统中。
你能不能在应用程序中有一个后台线程来监视挂载配置的变化,然后在看到变化时调用reload方法?这样,您就不需要使用另一个必须连接到服务的所有示例并调用重载端点的实用程序。

相关问题