3.5.1 Node

Node
Node是Kubernetes集群的工作节点,可以是物理机或者虚拟机。

Node的状态
Node包括如下状态信息:

  • Address

    1. HostName:可以被kubelet中的 --hostname-override参数替代。<br />• ExternalIP:可以被集群外部路由到的IP地址。<br /> InternalIP:集群内部使用的IP,集群外部无法访问。
  • Condition

• OutOfDisk:磁盘不足时为True。
• Ready:Node Controller 40秒内没有node的状态报告为Unkown,健康为True,否则为False。
• MemoryPressure:当node有内存压力时为True,否则为False。
• DiskPressure:当node有磁盘压力时为True,否则为False。

  • Capacity

• CPU
• 内存
• 可运行的最大Pod个数

  • Info:节点的一些版本信息,如OS、Kubernetes、Docker等。

Node管理
禁止Pod调度到该节点上:

kubectl cordon <node>

驱逐该节点上的所有Pod:

kubectl drain <node>

3.5.2 Namespace

Namespace使用
获取集群中的namespace列表

kubectl get ns

集群中默认有default和kube-system两个namespace。

在执行kubectl命令时可以使用-n 指定操作的namespace。

用户的普通应用默认在default下。
与集群管理相关的,为整个集群提供服务的应用一般都在kube-system的namespace下。例如:kubedns、heapseter、EFK等。

3.5.3 Label

Label Selector
Label Selector有两种类型:

  • equality-based:可以使用=、==、!=操作符,可以使用逗号分隔多个表达式。
  • set-based:可以使用in、notin、!操作符,还可以没有操作符,直接写出某个label的key,表示过滤某个key的object而不管该key的value为何值,!表示没有该label的object。

在API Object中设置label Selector
在service、replication controller等object中有对Pod的label selector,使用方法只能使用等于操作;

在Job、Deployment、ReplicaSet和DaemonSet这些object中,支持set-based的过滤。

image.png

3.5.4 Annotation

Annotation可以将Kubernetes资源对象关联到任意的非标识性元数据。
使用客户端可以检索到这些元数据。

关联到元数据到对象

Label和Annotation都可以将元数据关联到Kubernetes资源对象。
Label主要用于选择对象,可以挑选出满足特定条件的对象。
Annotation不能用于标识及选择对象。
Label和Annotation一样都是k/v键值对映射结构。

以下列出了一些可以记录在annotation中的对象信息:

  • 声明配置层管理的字段。使用annotation关联这类字段可以用于区分以下几种配置来源:客户端或服务器设置的默认值,自动生成的字段或自动生成的auto-scaling和auto-sizing系统配置的字段。
  • 创建信息、版本信息或镜像信息。例如:时间戳、版本号、git分支、PR序号、镜像哈希值以及仓库地址。
  • 记录日志、监控、分析或审计存储仓库的指针。
  • 可以用于debug的客户端信息,例如名称、版本和创建信息。
  • 用户信息,以及工具或系统来源信息、例如来自非kubernetes生态的相关对象的URL信息。
  • 轻量级部署工具元数据,例如配置或检查点。
  • 负责人的电话或联系方式。

    3.5.5 Taint和Toleration(污点和容忍)

    Taint和Toleration可以作用于node和pod上,目的是优化pod在集群中的调度。
    具有Taint的node和pod是互斥关系,而具有节点亲和性关系的node和pod是相吸的。

Taint和Toleration相互配合,可用来避免Pod被分配到不合适的节点上。
每个节点上都可以应用一个或多个taint,表示对于那些不能容忍这些taint的pod,是不会被该节点接受的。
如果将toleration应用于Pod上,则表示这些Pod可以被调度到具有相应taint的节点上。

为node设置taint
为node1设置taint:

kubectl taint nodes node1 key1=value1:NoSchedule
kubectl taint nodes node1 key1=value1:NoExecute
kubectl taint nodes node1 key2=value2:NoSchedule

删除上面的taint:

kubectl taint nodes node1 key1:NoSchedule-
kubectl taint nodes node1 key1:NoExecute-
kubectl taint nodes node1 key2:NoSchedule-

查看node1上的taint:

kubectl describe nodes node1


为pod设置toleration**
只要在pod的spec中设置toleration字段即可,可以有多个key,如下所示:

tolerations:
- key: "key1"
  operator: "Equal"
  value: "value1"
  effect: "NoSchedule"
- key: "key1"
  operator: "Equal"
  value: "value1"
  effect: "NoExecute"
- key: "node.alpha.kubernetes.io/unreachable"
  operator: "Exists"
  effect: "NoExecute"
  tolerationSeconds: 6000
  • value的值可以为NoSchedule、PreferNoSchedule或NoExecute。
  • tolerationSeconds是当Pod需要被驱逐时,可以继续在node上运行的时间。