我有一个 Kubernetes 集群,我使用 .NET 的 kubernetes-client 库来管理配置、存储、服务和状态集的配置。配置工作正常,必要的资源已启动并正在运行。
通常,我还会配置一些入口,因为需要进行一些网络调用才能创建一些连接器,例如 debezium 连接器:
curl -i -X POST -H "Accept:application/json" -H "Content-Type:application/json" <domain or ip>:8083/connectors/ --data "@connectors/source.json"
通过 kubernetes 客户端以编程方式调用类似的内容
http://<servicename>.<namespace>.svc.cluster.local:<port>/connectors/
是否可以从集群内部调用服务,因为我已经在使用 kubernetes 客户端,而不使用任何入口和公共调用?
我不确定我是否完全理解您的用例。示例将有助于理解
what
调用 what
。
如果您的意思是某些
pod
在集群内调用 Kubernetes service
,是的,如果它有 clusterIP
,您可以使用其名称访问 Kubernetes 服务,感谢 集群网络。
例如(
k=kubectl
)
k get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
dind ClusterIP 10.43.150.27 <none> 2375/TCP 89d
k get pod
NAME READY STATUS RESTARTS AGE
jenkins-0 2/2 Running 7 7d17h
如果您想从
dind
pod(其容器之一)访问服务 jenkins-0
,请在其中运行 shell 并按名称访问服务:
k exec -it jenkins-0 bash
jenkins@jenkins-0:/$ curl http://dind:2375/version
{"Platform":{"Name":"Docker Engine - Community"}
...
我还写了一篇关于 Kubernetes Networking 的文章,您可能会觉得有用。
我能够通过以下方法使用 Kubernetes .NET SDK 从我的应用程序调用集群的 Pod:
private static async Task ExecInPod(IKubernetes client, string podname, string space, string[] command, string container)
{
var webSocket = await client.WebSocketNamespacedPodExecAsync(podname, space, command, container, true, true, true, true).ConfigureAwait(true);
var buffer = new byte[1024 * 4];
var receiveResult = await webSocket.ReceiveAsync(
new ArraySegment<byte>(buffer), CancellationToken.None);
while (!receiveResult.CloseStatus.HasValue)
{
await webSocket.SendAsync(
new ArraySegment<byte>(buffer, 0, receiveResult.Count),
receiveResult.MessageType,
receiveResult.EndOfMessage,
CancellationToken.None);
receiveResult = await webSocket.ReceiveAsync(
new ArraySegment<byte>(buffer), CancellationToken.None);
}
await webSocket.CloseAsync(
receiveResult.CloseStatus.Value,
receiveResult.CloseStatusDescription,
CancellationToken.None);
}