热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Kubernetes_如何在GO语言中使用KubernetesAPI?

本文由编程笔记#小编为大家整理,主要介绍了如何在GO语言中使用KubernetesAPI?相关的知识,希望对你有一定的参考价值。
本文由编程笔记#小编为大家整理,主要介绍了如何在GO语言中使用Kubernetes API?相关的知识,希望对你有一定的参考价值。










Rancher Labs首席软件工程师Alena Prokharchyk受邀在2017年12月6-8日的CNCF主办的Kubernetes领域顶级盛会KubeCon + CloudNativeCon 2017北美峰会上进行演讲,本文由演讲内容整理而成。



















随着Kubernetes越来越受欢迎,围绕它的集成和监控服务的数量也在不断增长。Golang编写的所有此类服务的关键组件是kubernetes / client-go——一个用于与Kubernetes集群API通信的软件包。在本文中,我们将讨论client-go使用的基本知识,以及如何为开发人员节约编写实际应用程序逻辑所需的时间。我们还将展示使用该软件包的最佳实践,并从每天与Kubernetes进行集成工作的开发人员的角度,分享我们已有的经验。内容将包括:










●  集群中的客户端认证 vs. 集群外的客户端认证


●  基本列表,使用client-go去创建和删除Kubernetes对象的操作


●  如何使用ListWatch和Informers监视K8s事件并做出反应


●  如何管理软件包依赖










Kubernetes是一个平台








Kubernetes有很多受欢迎的地方。用户喜欢它的丰富功能、稳定性和性能。对贡献者来说,Kubernetes开源社区不仅规模庞大,还易于上手、反馈迅速。而真正让Kubernetes吸引了第三方开发者的是它的可扩展性。该项目提供了很多方式来添加新功能、扩展现有功能而且不会中断主代码库。正是这些,使得Kubernetes发展成为了一个平台。


这里有一些方式来扩展Kubernetes:














上图所示,你可以发现每个Kubernetes集群组件无论是Kubelet还是API服务器,都可以以某种方式进行扩展。今天我们将重点介绍一种“自定义控制器”的方式,从现在起我将它称为Kubernetes控制器(Kubernetes Controller),或者简单地称为控制器(Controller)。










Kubernetes控制器究竟是什么?








控制器最常见的定义是:使得系统的当前状态达到所期望的状态的代码。但这究竟是什么意思呢?我们以Ingress控制器为例。Ingress是一个Kubernetes资源,它能够对集群中服务的外部访问进行定义。通常采用HTTP并且有负载均衡支持。然而Kubernetes的核心代码中并没有ingress的实现。第三方控制器的实现将包含:










1、监控ingress/services/endpoint 资源的事件(创建、更新、删除)


2、程序内部或外部的负载均衡器


















对相同的资源,控制器的实现以及部署他们的方式也可能会有所不同。你可以选择nginx控制器并将其部署到集群中的每个节点上作为守护进程集(Daemon Set),也可以选择在Kubernetes集群外部运行ingress控制器并且对F5编程作为负载均衡器。这里没有严格的规定,Kubernetes就是如此灵活。










Client-go








这里有几种获得Kubernetes集群及其资源相关信息的方法,你可以使用Dashboard、kubectl或者使用对Kubernetes API的编程式访问来实现。Client-go所有用Go语言编写的工具中使用最为广泛的库,还有许多其他语言的版本(java、python等)。如果你还没自己写过控制器,我推荐你首先去尝试go/client-go。Kubernetes是用Go编写的,而且我发现使用和主项目相同的语言来开发插件会更加方便。










我们来搭建吧……








要熟悉相关的平台和工具,最好的办法就是去实践,去实现一些东西。我们从简单入手,先实现一个如下的控制器:










1、监控Kubernetes节点


2、当节点上的镜像占用存储空间时进行警报,并且可以更改










这部分的实现,源码可以在这里找到:


https://github.com/alena1108/kubecon2017
















基本流程
















配置项目






作为一名开发者,我和Rancher Labs的同事们更愿意使用轻便简易的工具,在这里我将分享3个我最喜欢的工具,它们将帮助我们完成第一个项目。










1、go-skel – Go语言的微服务skeleton,只需执行run ./skel.sh test123即可,它会为新的go项目test123创建skeleton。


2、trash – Go语言的供应商管理工具。实际上这儿有很多依赖项管理工具,但是在临时依赖项管理方面,trash使用起来非常出色,而且简单。


3、dapper – 在一致性环境中对任何现有构建工具进行封装的一种工具










添加client-go作为一个依赖项








为了方便使用client-go的代码,我们必须要将其设置为项目的依赖项。将它添加到vendor.conf文件中:








如何在GO语言中使用Kubernetes API?






接着运行trash。它会将vendor.conf中定义的所有依赖项都拉到项目的vendor文件夹中。在这里需要确保client-go与你集群对应的Kubernetes版本是兼容的。










创建一个客户端






在创建与Kubernetes API通信的客户端之前,我们必须要先决定如何运行我们的工具:是在Kubetnetes集群内部还是外部。当应用程序在集群内部运行时,对它进行容器化,部署成为Kubernetes pod。它还提供了一些额外的功能:你可以选择部署它的方式(Deamon set运行在每个节点上,或者作为n个副本的部署),配置针对它的健康检查等等。当应用程序在集群外部运行时,就需要自己来管理它。下面的配置可以让我们的工具变得更灵活,并且支持基于config flag定义客户端的两种方式:








如何在GO语言中使用Kubernetes API?






我们将在调试应用程序时使用集群外部运行的方式,这样你不需要每次都构建镜像并且将其重新部署成Kubernetes pod。在测试好应用程序后,我们就可以构建镜像并将其部署到集群中。










正如在截图中看到的那样,正在构建配置,并将其传递到kubernetes.NewForConfig来生成客户端。










使用基本的CRUDs








我们的工具需要监控节点。在实现逻辑流程之前,我们先来熟悉使用client-go执行CRUD操作:








如何在GO语言中使用Kubernetes API?






上面的截图展示了:










1、List节点minikube,是经过FieldSelector过滤器实现的


2、用新的标注来更新节点


3、使用gracePerios=10秒指令删除节点—意思是从该命令执行后10秒才会执行删除操作










上面所有的步骤都是使用我们之前创建的用户集(clientset)进行的。


我们还需要节点上镜像的相关信息;它可以通过访问相应的字段来检索:








如何在GO语言中使用Kubernetes API?














使用Informer来进行监控/通知








现在我们知道了如何从Kubernetes APIs中获取节点并从中得到镜像信息。那么我们该如何监控镜像大小的变化呢?最简单的方法是周期性轮询节点,计算当前的镜像存储容量,并将其和先前轮询的结果比较。这里的不足之处在于:无论节点是否发生变化,我们执行的列表调用都会获取所有的节点,这可能会很费资源——特别是当轮询间隔很短的时候。而我们真正想要实现的是—在节点发生变化时得到通知,只有在这之后才执行我们的逻辑流程。这些就是client-go的Informer来做的。








如何在GO语言中使用Kubernetes API?






在这个例子中,我们经过watchList指令为节点对象创建Informer来监控节点,设置对象类型为api.Node和30秒的同步周期来周期性地轮询节点,无论节点是否发生改变——这种方式在更新事件出于某种原因发生终止时可以很好的进行撤回。在最后一个参数,我们传递了2个回调函数——handleNodeAdd和handleNodeUpdate。这些回调函数具有实际的逻辑,并且在节点上的镜像占用存储发生改变时触发。NewInformer返回2个对象——controller和store。一旦controller启动,将会开始对node.update和node.add的监控,并且调用回调函数。这部分代码的存储区位于内存缓存中,由informer负责更新,另外你可以在缓存区中获取节点对象而不用直接调用Kubernetes APIs:








如何在GO语言中使用Kubernetes API?






我们的项目中只有一个控制器,使用常规的Informer就足够了。不过,如果未来你的项目最终同一个对象拥有了多个控制器,我建议你使用SharedInformer。这样一来你不用再一个一个为每个控制器配上Informer,只需要注册一个Shared informer即可,并且让每个控制器注册自己的一组回调函数,返回共享缓存,这可以减少内存占用:








如何在GO语言中使用Kubernetes API?














部署时间






是时候来部署和测试代码了!对于第一次运行,我们只需要创建一个go的二进制文件并且在集群外模式下运行它即可:








如何在GO语言中使用Kubernetes API?






如要更改消息输出,那么使用镜像部署一个pod,该镜像是没有在当前节点显示的镜像。




在基本的功能通过测试之后,接下来就是按照集群模式尝试运行它了。为此我们必须先创建镜像,定义它的Dockerfile:








如何在GO语言中使用Kubernetes API?






并使用docker build创建一个镜像,该命令将生成一个可用在Kubernetes中部署pod的镜像。现在你的应用程序可以作为一个pod运行在Kubernetes集群上了。这里是一个部署定义的例子,在之前的截图中,我使用了该例部署我们的应用程序:








如何在GO语言中使用Kubernetes API?














在本文中我们做了如下工作:


1、创建go项目


2、为项目添加client-go包的依赖项


3、创建用于和Kubernetes api通信的客户端


4、定义一个用于监控节点对象改变,并且一旦发生就执行回调函数的Informer


5、在回调函数中实现一个实际的逻辑


6、在集群外运行二进制文件来测试代码,并把它部署到集群中



















 推荐阅读




























如何在GO语言中使用Kubernetes API?


























如何在GO语言中使用Kubernetes API?


























如何在GO语言中使用Kubernetes API?


































































3月7号晚微信技术群分享等你来哦~具体内容及参与方式如下:












推荐阅读
  • ElasticSearch 集群监控与优化
    本文详细介绍了如何有效地监控 ElasticSearch 集群,涵盖了关键性能指标、集群健康状况、统计信息以及内存和垃圾回收的监控方法。 ... [详细]
  • 深入解析ESFramework中的AgileTcp组件
    本文详细介绍了ESFramework框架中AgileTcp组件的设计与实现。AgileTcp是ESFramework提供的ITcp接口的高效实现,旨在优化TCP通信的性能和结构清晰度。 ... [详细]
  • 深入解析 Android IPC 中的 Messenger 机制
    本文详细介绍了 Android 中基于消息传递的进程间通信(IPC)机制——Messenger。通过实例和源码分析,帮助开发者更好地理解和使用这一高效的通信工具。 ... [详细]
  • 在寻找轻量级Ruby Web框架的过程中,您可能会遇到Sinatra和Ramaze。两者都以简洁、轻便著称,但它们之间存在一些关键区别。本文将探讨这些差异,并提供详细的分析,帮助您做出最佳选择。 ... [详细]
  • 基于Node.js、Express、MongoDB和Socket.io的实时聊天应用开发
    本文详细介绍了使用Node.js、Express、MongoDB和Socket.io构建的实时聊天应用程序。涵盖项目结构、技术栈选择及关键依赖项的配置。 ... [详细]
  • 本文探讨了如何通过预处理器开关选择不同的类实现,并解决在特定情况下遇到的链接器错误。 ... [详细]
  • 我有一个SpringRestController,它处理API调用的版本1。继承在SpringRestControllerpackagerest.v1;RestCon ... [详细]
  • 本文详细介绍了Grand Central Dispatch (GCD) 的核心概念和使用方法,探讨了任务队列、同步与异步执行以及常见的死锁问题。通过具体示例和代码片段,帮助开发者更好地理解和应用GCD进行多线程开发。 ... [详细]
  • 本文将详细介绍多个流行的 Android 视频处理开源框架,包括 ijkplayer、FFmpeg、Vitamio、ExoPlayer 等。每个框架都有其独特的优势和应用场景,帮助开发者更高效地进行视频处理和播放。 ... [详细]
  • 本文详细介绍了装饰者(Decorator)模式,这是一种动态地为对象添加职责的方法。与传统的继承方式不同,装饰者模式通过组合而非继承来实现功能扩展,从而提供更大的灵活性和可维护性。 ... [详细]
  • 本文详细介绍了钩子(hook)的概念、原理及其在编程中的实际应用。通过对比回调函数和注册函数,解释了钩子的工作机制,并提供了具体的Python示例代码,帮助读者更好地理解和掌握这一重要编程工具。 ... [详细]
  • Python自动化测试入门:Selenium环境搭建
    本文详细介绍如何在Python环境中安装和配置Selenium,包括开发工具PyCharm的安装、Python环境的设置以及Selenium包的安装方法。此外,还提供了编写和运行第一个自动化测试脚本的步骤。 ... [详细]
  • 本文探讨了在 SQL Server 中使用 JDBC 插入数据时遇到的问题。通过详细分析代码和数据库配置,提供了解决方案并解释了潜在的原因。 ... [详细]
  • 程序员如何优雅应对35岁职业转型?这里有深度解析
    本文探讨了程序员在职业生涯中如何通过不断学习和技能提升,优雅地应对35岁左右的职业转型挑战。我们将深入分析当前热门技术趋势,并提供实用的学习路径。 ... [详细]
  • CentOS 7.6环境下Prometheus与Grafana的集成部署指南
    本文旨在提供一套详细的步骤,指导读者如何在CentOS 7.6操作系统上成功安装和配置Prometheus 2.17.1及Grafana 6.7.2-1,实现高效的数据监控与可视化。 ... [详细]
author-avatar
唇边那烟味世界
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有