如何使用Kubernetes C# .NET Client获取Elasticsearch自定义资源状态?
解决方案
Elasticsearch是ECK定义的Kubernetes自定义资源(CRD),你需要先定义匹配其结构的实体类,再通过Kubernetes C# Client的自定义资源接口获取对应数据。
步骤1:定义CRD对应实体类
using KubernetesClient.Models; using System.Collections.Generic; [KubernetesEntity(Group = "elasticsearch.k8s.elastic.co", ApiVersion = "v1", Kind = "Elasticsearch", PluralName = "elasticsearches")] public class Elasticsearch : CustomResource<ElasticsearchSpec, ElasticsearchStatus> { } public class ElasticsearchSpec { public string Version { get; set; } public List<NodeSet> NodeSets { get; set; } // 其他不需要用到的spec字段可省略 } public class NodeSet { public string Name { get; set; } public int Count { get; set; } public Dictionary<string, object> Config { get; set; } } public class ElasticsearchStatus { public string Health { get; set; } public int Nodes { get; set; } public string Version { get; set; } public string Phase { get; set; } // 其他不需要用到的status字段可省略 }
步骤2:调用客户端获取资源数据
using k8s; using k8s.Models; class Program { static async Task Main(string[] args) { // 加载Kubernetes配置,本地开发默认读取~/.kube/config,集群内运行自动读取Service Account var config = KubernetesClientConfiguration.BuildConfigFromConfigFile(); using var client = new Kubernetes(config); string targetNamespace = "ecknamespace"; // 获取命名空间下所有Elasticsearch资源 var esList = await client.ListNamespacedCustomObjectAsync<Elasticsearch>(targetNamespace); foreach (var es in esList.Items) { Console.WriteLine($"NAME: {es.Metadata.Name}"); Console.WriteLine($"HEALTH: {es.Status.Health}"); Console.WriteLine($"NODES: {es.Status.Nodes}"); Console.WriteLine($"VERSION: {es.Status.Version}"); Console.WriteLine($"PHASE: {es.Status.Phase}"); Console.WriteLine($"AGE: {DateTime.UtcNow - es.Metadata.CreationTimestamp.GetValueOrDefault().UtcDateTime}"); } // 可选:直接获取指定名称的单个Elasticsearch资源 var singleEs = await client.GetNamespacedCustomObjectAsync<Elasticsearch>("quickstart", targetNamespace); Console.WriteLine($"指定ES实例健康状态: {singleEs.Status.Health}"); } }
补充说明
- 提前安装Kubernetes C# Client的NuGet包:
KubernetesClient - 实体类中不需要用到的字段可直接省略,序列化时会自动忽略未定义属性
- 不同版本的Kubernetes C# Client接口命名可能存在微小差异,以你安装的版本为准
内容的提问来源于stack exchange,提问作者Jerald Baker
相关产品推荐
相关产品推荐

