使用 C# 获取 Kubernetes 集群资源信息( 四 )


};
// service -> endpoint 的信息
varendpoint = awaitclient.ReadNamespacedEndpointsAsync(svcName, namespaceName);
List< string> address = newList< string>;
foreach( varsub inendpoint.Subsets)
{
foreach( varaddr insub.Addresses)
{
foreach( varport insub.Ports)
{
address.Add( $" {addr.Ip}: {port.Port}/ {port.Protocol}" );
}
}
}
info.Endpoints = address.ToArray;
returninfo;
}
输出结果如下:
使用 C# 获取 Kubernetes 集群资源信息
文章图片

亲 , 如果你对 Kubernetes 的网络知识不太清楚 , 请先打开 https://k8s.whuanle.cn/4.network/1.network.html 了解一下呢 。
实践2:详细解析 Service 属性
我们知道 , 一个 Service 可以关联多个 Pod , 为多个 Pod 提供负载均衡等功能 。 同时 Service 有 externalIP、clusterIP 等属性 , 要真正解析出一个 Service 是比较困难的 。 例如 Service 可以只有端口 , 没有 IP;也可以只使用 DNS 域名访问;也可以不绑定任何 Pod , 可以从 Service A DNS -> Service B IP 间接访问 B;
Service 包含的情况比较多 , 读者可以参考下面这个图 , 下面我们通过代码 , 获取一个 Service 的 IP 和端口信息 , 然后生成对应的 IP+端口结构 。
使用 C# 获取 Kubernetes 集群资源信息
文章图片

单纯获取 IP 和 端口是没用的 , 因为他们是分开的 , 你获取到的 IP 可能是 Cluter、Node、LoadBalancer 的 , 有可能只是 DNS 没有 IP , 那么你这个端口怎么访问呢?这个时候必须根据一定的规则 , 解析信息 , 筛选无效数据 , 才能得出有用的访问地址 。
首先定义一部分枚举和模型:
publicenumServiceType
{
ClusterIP,
NodePort,
LoadBalancer,
ExternalName
}
///<summary>
///Kubernetes Service 和 IP
///</summary>
publicclassSvcPort
{
// LoadBalancer -> NodePort -> Port -> Target-Port
///<summary>
///127.0.0.1:8080/tcp、127.0.0.1:8080/http
///</summary>
publicstringAddress { get; set; } = null!;
///<summary>
///LoadBalancer、NodePort、Cluster
///</summary>
publicstringType { get; set; } = null!;
publicstringIP { get; set; } = null!;
publicintPort { get; set; }
}
publicclassSvcIpPort
{
publicList<SvcPort>? LoadBalancers { get; set; }
publicList<SvcPort>? NodePorts { get; set; }
publicList<SvcPort>? Clusters { get; set; }
publicstring? ExternalName { get; set; }
}
编写解析代码:
staticasyncTask Main
{
varresult = awaitGetSvcIpsAsync( "kube-apiserver-master", "kube-system");
Console.WriteLine(System.Text.Json.JsonSerializer.Serialize(result));
}
publicstaticasyncTask<SvcIpPort> GetSvcIpsAsync( stringsvcName, stringnamespaceName )
{
varclient = GetClient;
varservice = awaitclient.ReadNamespacedServiceAsync(svcName, namespaceName);
SvcIpPort svc = newSvcIpPort;
// LoadBalancer
if(service.Spec.Type == nameof(ServiceType.LoadBalancer))
{
svc.LoadBalancers = newList<SvcPort>;
varips = svc.LoadBalancers;
// 负载均衡器 IP
varlbIP = service.Spec.LoadBalancerIP;
varports = service.Spec.Ports.Where(x => x.NodePort != null).ToArray;
foreach( varport inports)
{
ips.Add( newSvcPort
{
Address = $" {lbIP}: {port.NodePort}/ {port.Protocol}" ,
IP = lbIP,
Port = ( int)port.NodePort!,
Type = nameof(ServiceType.LoadBalancer)

特别声明:本站内容均来自网友提供或互联网,仅供参考,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。