});
}
}
if(service.Spec.Type == nameof(ServiceType.LoadBalancer) || service.Spec.Type == nameof(ServiceType.NodePort))
{
svc.NodePorts = newList<SvcPort>;
varips = svc.NodePorts;
// 负载均衡器 IP , 有些情况可以设置 ClusterIP 为 None;也可以手动设置为 None , 只要有公网 IP 就行
varclusterIP = service.Spec.ClusterIP;
varports = service.Spec.Ports.Where(x => x.NodePort != null).ToArray;
foreach( varport inports)
{
ips.Add( newSvcPort
{
Address = $" {clusterIP}: {port.NodePort}/ {port.Protocol}" ,
IP = clusterIP,
Port = ( int)port.NodePort!,
Type = nameof(ServiceType.NodePort)
});
}
}
// 下面这部分代码是正常的 , 使用 {} 可以隔离部分代码 , 避免变量重名
// if (service.Spec.Type == nameof(ServiceType.ClusterIP))
// 如果 Service 没有 Cluster IP , 可能使用了无头模式 , 也有可能不想出现 ClusterIP
//if(service.Spec.ClusterIP == "None")
{
svc.Clusters = newList<SvcPort>;
varips = svc.Clusters;
varclusterIP = service.Spec.ClusterIP;
varports = service.Spec.Ports.ToArray;
foreach( varport inports)
{
ips.Add( newSvcPort
{
Address = $" {clusterIP}: {port.Port}/ {port.Protocol}" ,
IP = clusterIP,
Port = port.Port,
Type = nameof(ServiceType.ClusterIP)
});
}
}
if(! string.IsNullOrEmpty(service.Spec.ExternalName))
{
/* NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
myapp-svcname ExternalName <none> myapp.baidu.com <none> 1m
myapp-svcname -> myapp-svc
访问 myapp-svc.default.svc.cluster.local , 变成 myapp.baidu.com
*/
svc.ExternalName = service.Spec.ExternalName;
}
returnsvc;
}
规则解析比较复杂 , 这里就不详细讲解 , 读者如有疑问 , 可联系笔者讨论 。
主要规则:LoadBalancer -> NodePort -> Port -> Target-Port 。
最终结果如下:
文章图片
通过这部分代码 , 可以解析出 Service 在 External Name、LoadBalancer、NodePort、ClusterIP 等情况下可真正访问的地址列表 。
实践3:解析 Endpoint 列表
如果对 Endpoint 不太了解 , 亲请打开https://k8s.whuanle.cn/4.network/2.endpoint.html 看一下相关知识 。
文章图片
在 Kubernetes 中 , Service 不是直接关联 Pod 的 , 而是通过 Endpoint 间接代理 Pod 。 当然除了 Service -> Pod , 通过 Endpoint , 也可以实现接入集群外的第三方服务 。 例如数据库集群不在 Kubernetes 集群中 , 但是想通过 Kubernetes Service 统一访问 , 则可以利用 Endpoint 进行解耦 。 这里不多说 , 读者可以参考 https://k8s.whuanle.cn/4.network/2.endpoint.html。
这里这小节中 , 笔者也将会讲解如何在 Kubernetes 中分页获取资源 。
首先定义以下模型:
publicclassSvcInfoList
{
///<summary>
///分页属性 , 具有临时有效期 , 具体由 Kubernetes 确定
///</summary>
publicstring? ContinueProperty { get; set; }
///<summary>
///预计剩余数量
///</summary>
publicintRemainingItemCount { get; set; }
///<summary>
///SVC 列表
///</summary>
publicList< SvcInfo> Items { get; set; } = newList<SvcInfo>;
}
publicclassSvcInfo
{
///<summary>
///SVC 名称
///</summary>
特别声明:本站内容均来自网友提供或互联网,仅供参考,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
