【Kubernetes】什么是 kubectl ?

什么是 kubectl ?

  • 1.什么是 kubectl ?
  • 2.Kubernetes 内部结构
  • 3.Kubernetes API 的作用

1.什么是 kubectl ?

在学习如何更有效地使用 kubectl 之前,您应该对它是什么以及它如何工作有一个基本的了解。从用户的角度来看,kubectl 是你控制 Kubernetes 的驾驶舱。它允许您执行所有可能的 Kubernetes 操作。从技术角度来看,kubectl 是 Kubernetes API 的客户端。

Kubernetes API 是一个 HTTP REST API。这个 API 是真正的 Kubernetes 用户界面。 Kubernetes 完全通过该 API 进行控制。这意味着每个 Kubernetes 操作都作为 API 端点公开,并且可以通过对此端点的 HTTP 请求来执行。

因此,kubectl 的主要工作是向 Kubernetes API 执行 HTTP 请求:

在这里插入图片描述
Kubernetes 是一个完全以资源为中心的系统。这意味着,Kubernetes 维护了资源的内部状态,所有 Kubernetes 操作都是对这些资源的 CRUD 操作。您可以通过操纵这些资源来完全控制 Kubernetes(并且 Kubernetes 根据资源的当前状态来确定要做什么)。因此,Kubernetes API 参考被组织为资源类型及其关联操作的列表。

让我们来看一个例子。假设您想要创建一个 ReplicaSet 资源。为此,您需要在名为 replicaset.yaml 的文件中定义 ReplicaSet,然后运行以下命令:

$ kubectl create -f replicaset.yaml

显然,这会在 Kubernetes 中创建您的 ReplicaSet。但幕后发生了什么?

Kubernetes 有一个 create ReplicaSet 操作,与所有 Kubernetes 操作一样,它作为 API 端点公开。该操作的具体API端点如下:

POST /apis/apps/v1/namespaces/{namespace}/replicasets

您可以在 API 参考中找到所有 Kubernetes 操作的 API 端点(包括上述端点)。要向端点发出实际请求,您需要将 API 服务器的 URL 添加到 API 参考中列出的端点路径前面。

因此,当您执行上述命令时,kubectl 会向上述 API 端点发出 HTTP POST 请求。 ReplicaSet 定义(您在 replicaset.yaml 文件中提供)在请求正文中传递。

这就是 kubectl 适用于与 Kubernetes 集群交互的所有命令的方式。在所有这些情况下,kubectl 只是向适当的 Kubernetes API 端点发出 HTTP 请求。

请注意,完全可以使用像 curl 这样的工具通过手动向 Kubernetes API 发出 HTTP 请求来控制 Kubernetes。kubectl 只是让您更轻松地使用 Kubernetes API。

这些是 kubectl 是什么及其工作原理的基础知识。但每个 kubectl 用户都应该了解有关 Kubernetes API 的更多信息。为此,让我们简要深入了解 Kubernetes 的内部结构。

2.Kubernetes 内部结构

Kubernetes 由一组独立的组件组成,这些组件作为单独的进程在集群的节点上运行。有些组件运行在主节点上,其他组件运行在工作节点上,每个组件都有非常特定的功能。

这些是主节点上最重要的组件:

  • 存储后端(storage backend):存储资源定义(通常使用 etcd)。
  • API 服务器:提供 Kubernetes API,并管理存储后端控制器管理器;确保资源状态符合规范调度器;将 Pod 调度到工作节点。Pod 是工作节点上最重要的组件。
  • kubelet:管理工作节点上容器的执行。

要了解这些组件如何协同工作,让我们考虑一个示例。假设您刚刚执行了 kubectl create -f replicaset.yaml,此时 kubectlcreate ReplicaSet API 端点发出了 HTTP POST 请求(传递您的 ReplicaSet 资源定义)。

集群中出现这种情况的原因是什么?

在这里插入图片描述
kubectl create -f replicaset.yaml 之后,API 服务器将您的 ReplicaSet 资源定义保存在存储后端中。
在这里插入图片描述
这会触发控制器管理器(controller manager)中的 ReplicaSet 控制器(ReplicaSet controller),该控制器监视 ReplicaSet 资源的创建、更新和删除。

在这里插入图片描述
ReplicaSet 控制器为 ReplicaSet 的每个副本创建一个 Pod 定义(根据 ReplicaSet 定义中的 Pod 模板)并将其保存在存储后端。

在这里插入图片描述
这会触发调度程序(scheduler)监视尚未分配给工作节点的 Pod。

在这里插入图片描述
调度程序为每个 Pod 选择合适的工作节点,并将此信息添加到存储后端的 Pod 定义中。

在这里插入图片描述
这会触发 Pod 已调度到的工作节点上的 kubelet,该节点会监视已调度到其工作节点的 Pod。
在这里插入图片描述
kubelet 从存储后端读取 Pod 定义,并指示 container runtime(例如 Docker)在工作节点上运行容器。

以下是文字描述:

  • 对创建 ReplicaSet 端点的 API 请求由 API 服务器处理。 API 服务器对请求进行身份验证并将您的 ReplicaSet 资源定义保存在存储后端中。
  • 该事件会触发 ReplicaSet 控制器,它是控制器管理器的子进程。 ReplicaSet 控制器监视存储后端中 ReplicaSet 资源的创建、更新和删除,并在发生这种情况时收到事件通知。
  • ReplicaSet 控制器的工作是确保 ReplicaSet 存在所需数量的副本 Pod。在我们的示例中,尚不存在 Pod,因此 ReplicaSet 控制器创建这些 Pod 定义(根据 ReplicaSet 定义中的 Pod 模板)并将它们保存在存储后端。
  • 新 Pod 的创建会触发调度程序,调度程序会监视尚未调度到工作节点的 Pod 定义。调度程序为每个 Pod 选择合适的工作节点,并使用此信息更新存储后端中的 Pod 定义。
  • 请注意,到目前为止,集群中的任何位置都没有运行任何工作负载代码。到目前为止所做的只是在主节点上的存储后端中创建和更新资源。
  • 此事件会触发 kubelet 来监视调度到其工作节点的 Pod。您的 ReplicaSet Pod 已调度的工作节点的 kubelet 指示配置的 container runtime(可能是 Docker)下载所需的容器映像并运行容器。

至此,您的 ReplicaSet 应用程序终于开始运行了!

3.Kubernetes API 的作用

从上面的例子可以看出,Kubernetes 组件(除了 API 服务器和存储后端)通过监视存储后端的资源变化并操作存储后端的资源来工作。

然而,这些组件并不直接访问存储后端,而是只能通过 Kubernetes API 访问。

看一个示例

ReplicaSet 控制器使用 list ReplicaSets API 端点 API 携带监视参数的操作来监视 ReplicaSet 资源的更改。 ReplicaSet 控制器使用 create Pod API 端点来创建 Pod。调度程序使用 patch Pod API 端点来更新 Pod,其中包含有关所选工作节点的信息。如您所见,kubectl 也使用相同的 API。

内部组件和外部用户双重使用 Kubernetes API 是 Kubernetes 的基本设计理念。

有了这些知识,您可以总结 Kubernetes 的工作原理如下:

存储后端存储 Kubernetes 的状态(即资源)。 API 服务器以 Kubernetes API 的形式提供与存储后端的接口。所有其他 Kubernetes 组件和用户都通过 Kubernetes API 读取、观察和操作 Kubernetes 的状态(即资源)。熟悉这些概念将有助于您更好地理解 `kubectl` 并充分利用它!

# 4.使用技巧 现在让我们看看一系列具体的提示和技巧,以帮助您提高 `kubectl` 生产力。

提高 kubectl 生产力的最有用但经常被忽视的技巧之一是 completion 命令。

completion 命令允许您使用 Tab 键自动完成 kubectl 命令的各个部分。这适用于子命令、选项和参数,包括资源名称等难以输入的内容。

在这里您可以看到 kubectl 命令完成的实际效果:

在这里插入图片描述
命令补全适用于 Bash 和 Zsh shell。

一般来说,completion 命令是一种通过 completion 脚本来工作的 shell 功能。completion 脚本是定义特定命令的完成行为的 shell 脚本。获取完成脚本可以完成相应的命令。

Kubectl 可以使用以下命令自动生成并打印出 Bash 和 Zsh 的完成脚本:

kubectl completion bash
# or
kubectl completion zsh

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/586766.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Javaweb-servlet

一、servlet入门 1.Servlet介绍 (1)什么是Servlet Servlet是Server Applet的简称,是用Java编写的是运行在 Web 服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。使用 Servlet&#…

CGAL的三角网格曲面脊线和脐点的近似计算(需要微分几何学的知识)

脊线(Ridges):在光滑曲面上,脊线是一种特殊的曲线。沿着这条曲线,曲面的一个主曲率在其曲率线上达到极值(最大或最小)。这意味着脊线是那些曲率发生突变的区域,它们在形状感知、物体…

Android Studio下载gradle失败

1、打开Android Studio设置Gradle的地方,点击左上角的File->Settings查看gradle存放路径 C:\Users\Administrator.gradle\wrapper\dists\gradle-5.4.1-all\3221gyojl5jsh0helicew7rwx 2、找到正在下载的gradle版本,Android Studio取消下载gradle&…

Tomcat与Servlet是什么关系

Tomcat与Servlet是什么关系 Apache Tomcat和Servlet之间存在密切的关系,可以说它们是一对密切合作的组件。下面是它们的关系: Tomcat是Servlet容器: Tomcat是一个开源的、轻量级的Servlet容器。Servlet容器是一个Web服务器扩展,用…

2023.12.28 关于 Redis 数据类型 List 内部编码、应用场景

目录 List 编码方式 早期版本 现今版本 List 实际应用 多表之间的关联关系 消息队列 频道(多列表)消息队列 微博 Timeline 栈 & 队列 List 编码方式 早期版本 早期版本 List 类型的内部编码方式有两种 ziplist(压缩列表&#xf…

Cisco模拟器-企业网络部署

某企业园区网有:2个分厂(分别是:零件分厂、总装分厂)1个总厂网络中心 1个总厂会议室; (1)每个分厂有自己的路由器,均各有:1个楼宇分厂网络中心 每个楼宇均包含&#x…

004、变量与可变性

1. 变量与可变性 在Rust中,变量默认是不可变的,这一设计是为了让你安全方便地写出复杂、甚至是并行的代码。 当然,Rust也提供了可使用的可变变量的方法,这个待会讨论。 当一个变量是不可变时,一旦它被绑定到某个值上面…

Java之程序、进程、线程、管程和并发、并行的概念

文章目录 1. 进程与线程1.1 程序1.2 进程1.3 线程1.4 管程 2.并行与并发2.1 并发2.2 并行 1. 进程与线程 1.1 程序 程序是指令和数据的有序集合,其本身没有任何运行的含义,是一个静态的概念。简单的说就是我们写的代码。 1.2 进程 (1&…

分布式系统架构设计之分布式数据存储的分类和组合策略

在现下科技发展迅猛的背景下,分布式系统已经成为许多大规模应用和服务的基础架构。分布式架构的设计不仅仅是一项技术挑战,更是对数据存储、管理和处理能力的严峻考验。随着云原生、大数据、人工智能等技术的崛起,分布式系统对于数据的高效存…

科技云报道:开源才是大模型的未来?

科技云报道原创。 一年前,ChatGPT横空出世;7个多月后,Meta宣布开源LLaMA 2,并且可免费商用。 这一天,也成为大模型发展的分水岭。短时间内,LLaMA 2对一些闭源的大模型厂商造成了致命性的打击。 随后&…

【力扣100】207.课程表

添加链接描述 class Solution:def canFinish(self, numCourses: int, prerequisites: List[List[int]]) -> bool:# 思路是计算每一个课的入度,然后使用队列进行入度为0的元素的进出# 数组:下标是课程号,array[下标]是这个课程的入度# 哈希…

轻松调整视频时长,创意与技术的新篇章

传统的视频剪辑工具往往难以精确控制时间,而【媒体梦工厂】凭借其先进的算法和界面设计,让视频时长的调整变得简单而精确,助你释放无限的创意,用技术为你的创意插上翅膀,让每一秒都有意义。 所需工具: 一…

性能优化-如何提高cache命中率

本文主要介绍性能优化领域常见的cache的命中率问题,旨在全面的介绍提高cache命中率的方法,以供大家编写出性能友好的代码,并且可以应对性能优化领域的面试问题。 🎬个人简介:一个全栈工程师的升级之路! &am…

听GPT 讲Rust源代码--src/tools(38)

File: rust/src/tools/clippy/clippy_dev/src/lib.rs rust/src/tools/clippy/clippy_dev/src/lib.rs文件是Clippy开发工具的入口文件,其作用是提供Clippy开发过程中所需的功能和工具。Clippy是一个Rust代码的静态分析工具,用于提供各种有用的代码规范、编…

C++day4作业

定义一个Person类,私有成员int age,string &name,定义一个Stu类,包含私有成员double *score,写出两个类的构造函数、析构函数、拷贝构造和拷贝赋值函数,完成对Person的运算符重载(算术运算符、条件运算…

java企业网站系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java Web企业网站系统是一套完善的java web信息管理系统,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发,数据库为Mysql5.0&…

科技创新实验室数据管理优选:高效企业网盘推荐

科技创新实验室建设是国家加强科技创新基本能力建设的重要措施,企业网盘等高效办公工具的应用是保证科技创新实验室正常运行、提高科研项目团队合作效率的重要手段。 本文将介绍企业网盘Zoho WorkDrive提供的解决方案: 行业痛点1:分散的数据…

听GPT 讲Rust源代码--src/tools(39)

File: rust/src/tools/rustfmt/src/config/config_type.rs 在Rust代码中,rust/src/tools/rustfmt/src/config/config_type.rs文件的作用是定义了与配置相关的数据结构和函数。 Config struct(配置结构体):该结构体用于存储rustfmt…

图形化编程(3)之猜拳的加速度计

今天说我们来学习图形化第三节内容,加速度计。加速度传感器是一种能够测量物体加速度的传感器,在运动过程中,通过测量质量的惯性力和牛顿第二定律得到加速度。 根据传感器敏感元件的不同,常见的加速度传感器有电容式、电感式、应变…

zookeeper之集群搭建

1. 集群角色 zookeeper集群下,有3种角色,分别是领导者(Leader)、跟随着(Follower)、观察者(Observer)。接下来我们分别看一下这三种角色的作用。 领导者(Leader): 事务请求(写操作)的唯一调度者和处理者,保…