开发手册 欢迎您!
软件开发者资料库

Kubernetes(K8s) node(节点)

Kubernetes(简称K8S) 是Google开源的分布式的容器管理平台,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效(powerful),Kubernetes提供了应用部署,规划,更新,维护的一种机制。本文主要介绍Kubernetes(K8s) node(节点)。

1、Kubernetes node

node(节点)是Kubernetes集群中的一个工作机器。它们是工作单元,可以是物理的、VM或云实例。每个节点都拥有运行pod所需的所有配置,例如,代理服务和kubelet服务以及Docker, Docker用于在节点上创建的pod上运行Docker容器。它们不是由Kubernetes创建的,而是由云服务提供商或Kubernetes集群管理器在物理或虚拟机上外部创建的。Kubernetes处理多个节点的关键组件是控制器管理器,它运行多种控制器来管理节点。为了管理节点,Kubernetes创建了一个类节点对象,该对象将验证所创建的对象是否是一个有效的节点。

2、节点管理

向 API 服务器添加节点的方式主要有两种,节点上的 kubelet 向控制面执行自注册,也可以动添加一个 Node 对象。创建了 Node 对象或者节点上的 kubelet 执行了自注册操作之后, 控制面会检查新的 Node 对象是否合法。可以使用YAML或JSON 对象来创建 Node 对象,

例如,

kind: NodeapiVersion: v1metadata:   name: 10.221.31.143   labels:      name: my-first-k8s-node

{  "kind": "Node",  "apiVersion": "v1",  "metadata": {    "name": "10.221.31.143",    "labels": {      "name": "my-first-k8s-node"    }  }}

Kubernetes 会在内部创建一个 Node 对象作为节点的表示。Kubernetes 检查 kubelet 向 API 服务器注册节点时使用的 metadata.name 字段是否匹配。 如果节点是健康的(即所有必要的服务都在运行中),则该节点可以用来运行 Pod。 否则,直到该节点变为健康之前,所有的集群活动都会忽略该节点。

节点调度可以使用nodeSelector和nodeAffinity,NodeSelector 通过标签的方式,简单实现了限制 Pod 所在节点的方式。nodeAffinity 亲和性调度机制则极大的扩展了 Pod 的调度能力。使用 nodeAffinity 可以使用软限制、优先采用等限制方式,取代 nodeSelector 的硬限制。

例如,

apiVersion: v1kind: Podmetadata:  name: with-node-affinityspec:  affinity:         nodeAffinity:        requiredDuringSchedulingIgnoredDuringExecution:           nodeSelectorTerms:        - matchExpressions:          - key: beta.kubernetes.io/arch            operator: In            values:            - amd64      preferredDuringSchedulingIgnoredDuringExecution:       - weight: 1        preference:          matchExpressions:          - key: disk-type            operator: In            values:            - ssd

3、节点控制器

节点控制器(Node Controller)是运行在Kubernetes主节点上的服务的集合,并根据metadata.name持续监控集群中的节点。如果所有必需的服务都在运行,则验证节点,并由控制器将新创建的pod分配给该节点。如果它是无效的,那么主服务器将不会分配任何pod给它,并将等待直到它变得有效。

1)如果–register-node标志为true, Kubernetes master自动注册节点。

–register-node = true

2)手动管理需要将–register-node标志为false

–register-node = false