Kubernetes 节点是实际工作发生的工作器或主机。每个 Kubernetes 节点都有执行 Pod 所需的服务,并由控制平面控制。每个 Kubernetes 节点可以有多个 Pod,Pod 内有容器运行。每个节点中有 3 个进程用于调度和管理这些 Pod。
Container runtime:需要容器运行时来运行在 pod 内部 pod 上运行的应用程序容器。示例-> Docker。
kubelet: kubelet 与容器运行时以及 Node 交互。它是负责启动包含容器的 pod 的进程。
kube-proxy:负责将请求从Kubernetes 服务转发到pod 的进程。它具有智能逻辑,可以将请求转发到工作节点中的正确 pod。
Kubernetes
Kubernetes是一个开源容器管理工具,可自动执行容器部署、容器扩展、降级和容器负载平衡(也称为容器编排工具)。它用 Golang 编写,拥有庞大的社区,因为它最初由 Google 开发,后来捐赠给 CNCF(云原生计算基金会)。Kubernetes 可以将“n”个容器分组为一个逻辑单元,以便轻松管理和部署它们。它可以与所有云供应商(即公共、混合和本地)完美配合。
什么是 Kubernetes 节点?
Kubernetes Pod 如何工作?
Pod 是 Kubernetes 中存在的最小单元。它类似于 C 或 C++ 语言中的令牌。特定 Pod 可以有一个或多个应用程序。Pod 的性质是短暂的,这意味着在任何情况下,如果 Pod 发生故障,Kubernetes 都可以自动创建该 Pod 的新副本/重复并继续操作。Pod 可以根据需求包含一个或多个容器。容器甚至可以是 Docker 容器。Kubernetes 中的 Pod 提供环境依赖项,包括持久存储卷,这意味着它是永久性的,并且可用于所述集群中的所有 Pod,甚至在 Pod 内运行容器所需的配置数据。
Kubernetes 节点如何工作?
节点的主要工作是为包含容器的 pod 提供便利。根据分配给它们的角色,节点分为两种:工作节点和主节点。主节点负责工作节点,节点负责 pod。根据项目要求,工作节点没有特定的限制,您可以拥有 n 个节点,并且建议至少拥有两个主节点,以防一个主节点发生故障,另一个将负责管理工作节点。
Kubernetes 节点名称唯一性
在 kubernetes 集群中,两个节点不应该有相同的名称,当集群中的对象被修改时,这将导致集群不一致。Kubernetes 集群假定具有相同名称的节点将具有相同的标签、相同的状态和卷。如果实例被更新,那么具有相同名称的节点将很难找到您当前谈论的节点。
对于具有相同节点名称有一些假设,例如,如果您在每个节点中运行单个 pod,那么多个 pod 具有相同的名称就不会成为问题。
Kubernetes 节点未就绪
要查看 kubernetes 集群中可用的节点数,您可以使用以下命令。
kubectl get nodes
上述命令还将显示以下内容
Kubenrets 节点状态
Ready:节点运行正常,调度程序可以在该节点中调度 Pod。
NotReady:节点尚未准备好运行 Pod。发生这种情况的原因有很多,其中一些是网络问题、Pod 故障或 kubelet 错误。
Unknow:如果节点未响应调度程序来调度 Pod。如果主节点无法与该节点通信,则状态将显示为未知。
Kubernetes 节点的自注册
集群中已经可用的节点或将要新建的节点应该在 API 服务器中注册,这样主服务器将开始识别 kubernetes 集群中可用的节点。
与其手动操作,不如自动化,这也是一种首选方式。默认情况下,kubernetes 集群中将启用此自注册,kubelet 将负责自动注册。
Kubernets 节点自注册的不同选项
访问 Kubeconfig 文件: 我们可以向 kubelet 提供 kubeconfig 文件的路径,以便它可以通过 API 服务器进行身份验证。
设置标志 True:“–register-nodes”默认值为 true,当设置为 true 时,kubelet 将联系 API 服务器并将所有信息发送到新添加的节点,API 服务器在 kubernetes 集群中创建节点对象,kubernetes 调度程序将使用节点对象在节点上调度 pod。
还有其他一些选项,但以上是最常用的选项。
手动 Kubernetes 节点管理
kubernetes 中的手动节点管理是指手动注册节点,而无需任何节点的自我注册,可以使用某些命令来手动管理节点,如下所示。
kubectl create node.
kubectl delete node.
kubectl create node.
kubectl delete node.
在 kubernetes 集群中创建对象之前,您应该在 yaml 文件中提及节点名称、标签和污点。要了解有关 kubectl 的更多命令,请参阅Kubernetes – Kubectl 命令。要控制特定节点上的 pod 调度,您可以使用污点和容忍度或包含 pod 的标签来调度特定节点上的 pod。
Kubernetes 节点状态
要查看节点的状态和其他信息,请使用 kubectl:
$ kubectl describe node <node-name>
一个健康的节点由下面的JSON结构描述:
"conditions": [ { "type": "Ready", "status": "True", "reason": "KubeletReady", "message": "kubelet is posting ready status", "lastHeartbeatTime": <last heartbeat time>, "lastTransitionTime": <last transition time> } ]
Kubernetes 节点控制器
为了监控集群中的节点,Kubernetes 有一组服务可以根据元数据监控数据。名称。如果 –register-node 标志为 true,Kubernetes 会自动注册该节点。
–register-node = true
要手动实现,您需要设置
–register-node = false
资源容量跟踪
当将节点自注册到 Kubernetes API 时,节点对象将跟踪有关节点资源容量的信息。节点报告容量意味着节点中有多少个 CPU、多少内存可用。
以下是注册时将跟踪的节点资源:
CPU
Memory记忆
Ephemeral storage临时存储
Persistent storage持久存储
如果节点没有足够的容量来容纳 pod,那么调度程序会确保 pod 不会在该特定节点上进行调度。
Kubernetes 节点拓扑
在 kubernetes 中,一些 pod 相互依赖,就像 statefullset 应用程序一样,在这种情况下,我们需要确保两个 pod 将部署在同一个节点上,在这种情况下您可以使用节点拓扑。
您可以为 pod 分配标签,这将有助于将所有同名的 pod 调度到某个节点,这对于性能相关的 pod 很有帮助。
节点拓扑的示例 YAML 文件
apiVersion: v1 kind: Pod metadata: name: my-pod spec: containers: – name: my-container image: nginx nodeSelector: topology.kubernetes.io/zone: us-east-1a
节点优雅关闭
节点可以通过两种方式关闭,一种是优雅关闭,另一种是强制关闭。优雅关闭节点将给节点中运行的 pod 留出时间保存其状态,之后它们将优雅地终止,并发出关闭通知,而不是突然关闭。
如果节点上运行的 pod 在宽限期后不会终止,则它们将被强制终止,并且如果 pod 没有响应,它们将自动终止。
优雅终止节点的好处
没有数据丢失。
在终止之前留出时间来保存 pod 的状态。
非正常节点关闭处理
在特定节点上运行的 Pod 将被终止,而不会正常关闭。节点上运行的kubelet CLI将不会向在该 Pod 中运行的 Pod 发出任何通知,因此 Pod 将没有时间存储数据,也无法保留 Pod 的状态。
在 kubernets 集群中,非优雅终止被认为是一个最大的问题,因为包含状态完整应用程序的 pod 将没有时间来保留状态,并且 pod 将自动处于终止状态,这意味着控制器不会在运行良好的节点中创建新的 pod。
Kubernetes 节点与 Kubernetes Pod
节点 |
Pod |
---|---|
Kubernetes 节点将允许一个或多个 pod 在其上运行。 |
Kubernetes pods将包含一个或多个计划在节点上运行的容器。 |
Node 可以表示一个允许您运行 kubernetes 的虚拟机。 |
Pod 将用于在节点上运行容器。 |
CPU、内存和存储等资源将由节点提供 |
pod 将使用来自节点的所有资源。 |
如果您在任何云上使用 kubernetes,那么节点将由云本身负责,或者 kubernetes 将负责节点。 |
节点将负责 kubernetes pod。 |
管理 Kubernetes 节点
管理 Kubernetes 节点涉及许多任务,从部署新节点到管理现有节点,这有助于维护应用程序对最终用户的高可用性,以下是管理 Kubernetes 节点的全面概述。
配置和部署 Kubernetes 节点。
维护和更新 Kubernetes 节点。
扩展 Kubernetes 节点以提高性能和可用性。
优化 Kubernetes 节点性能
通过优化集群节点使用的资源,可以提高 Kubernetes 集群的性能。如果资源利用率很高,性能就会慢慢下降。在调度策略和优化容器运行时参数时,你需要更加小心,这样可以大大提高 Kubernetes 集群的速度。
资源利用优化
集装箱包装。
资源请求和限制。
驱逐政策。
资源监控。
调度策略
节点亲和性和反亲和性。
工作负载感知调度。
动态调度。
容器运行时调优
容器运行时配置。
图像优化。
容器运行时更新。
运行时内存管理。
保护 Kubernetes 节点
为了阻止未经授权的访问、漏洞和潜在攻击,您需要保护您的 kubernetes 集群和容器化应用程序,您可以借助 kubernetes 提供的以下服务来保护 kubernetes 集群。
节点强化和漏洞管理。
网络安全和访问控制。
容器运行时和安全注意事项。