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

问题描述 投票:0回答:1

我有一个具有水平扩展的服务器部署。根据负载情况,部署在任何给定时间都会有 3-5 个 Pod。 我使用卷映射将配置数据传递到已部署的服务器 Pod。我必须在我的服务器应用程序中调用重新加载函数,才能使其使用更新的配置,而无需重新启动 pod。

我使用单独的 .net Web API 应用程序来更改卷映射中的配置文件(因为它经常更新)。 我正在尝试使用 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 = wait client.WebSocketNamespacedPodExecAsync”行

Unhandled exception. System.Net.WebSockets.WebSocketException (0x80004005): The server returned status code '403' when status code '101' was expected.

我希望 client.WebSocketNamespacedPodExecAsync 方法在我的服务器 Pod 中执行重新加载命令。

如果我做错了什么,你能帮助我解决这个问题或指导我吗? 还建议我是否有任何其他替代方法可用于这种情况。

c# kubernetes google-cloud-platform google-kubernetes-engine kubectl
1个回答
0
投票

如果您更新作为 pod 中卷安装的配置映射,那么在一两分钟内,该更改就会反映在 pod 的文件系统中。

应用程序中不能有一个后台线程来监视已安装配置的更改,然后在看到更改时调用重新加载方法吗?然后,您无需使用另一个必须连接到服务的所有实例并调用重新加载端点的实用程序。

© www.soinside.com 2019 - 2024. All rights reserved.