19. 资源的调度——Label 与 Selector
本章讲解知识点
- 前言
- Label 与 Selector
<br>
1. 前言
我们来做一个小实验:
给出以下定义文件 my-first-deploy.yaml:
apiVersion: apps/v1 kind: Deployment metadata: name: my-first-deploy spec: replicas: 1 selector: matchLabels: app: my-first-deploy template: metadata: labels: app: my-first-deploy spec: containers: - name: my-first-container image: nginx:latest imagePullPolicy: IfNotPresent ports: - containerPort: 80 tolerations: - key: CriticalAddonsOnly operator: Exists - effect: NoSchedule key: node-role.kubernetes.io/master
创建应用:
[root@master mtuser]# kubectl create -f my-first-deploy.yaml deployment.apps/my-first-deploy created [root@master mtuser]# [root@master mtuser]# kubectl get pod NAME READY STATUS RESTARTS AGE my-first-deploy-84ffb59778-f7bb2 1/1 Running 0 8s [root@master mtuser]# [root@master mtuser]# kubectl get pod -owide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES my-first-deploy-84ffb59778-pmpxt 1/1 Running 0 19s 10.244.0.21 master <none> <none>
我们发现容器在 Master 节点被创建出来,说明 Pod 被调度到了 Master 节点上。但是我们前面内容说过,一般 Master 节点作为管理节点,不直接运行应用。 Deployment 创建出来,Pod 的调度如果不加以人为干预,调度器会选择一个资源更充足的节点进行调度。
那问题来了,我就需要控制 Pod 的调度,让业务应用去工作节点(Node)运行,有没有方法呢?
那么我们从这章节开始,就要讲资源的调度了。
Kubernetes 有好几种手段可以解决上面的场景,分别是:
- Label 与 Selector
- Node 亲和性
- Pod 亲和与反亲和性
- 污点与容忍
- Pod 优先级调度
我们先讲第一种 Label 与 Selector
<br>
2. Label 与 Selector
2.1. 概念
Kubernetes labels 和 selectors 是两个非常重要的概念,用于标识和选择 Kubernetes 中的对象。
Labels:
Labels 是 Kubernetes 中用于标识对象的键值对。一个 label 是一个 key-value 对,其中 key 是一个字符串,value 可以是任意字符串。一个 Kubernetes 对象可以有多个 labels。例如,一个 Pod 可以有 labels,用于标识它属于哪个应用程序、哪个命名空间、哪个环境等等。
Selectors:
Selectors 是一种用于选择 Kubernetes 对象的标准。在 Kubernetes 中,selectors 通常用于选择一个或多个具有特定 label 的对象。例如,一个 Deployment 可以使用 selectors 来选择哪些 Pod 应该被包含在该 Deployment 中。
在 Kubernetes 中,通常使用 labels 和 selectors 一起来管理和选择对象。例如,一个 Deployment 可以使用 labels 来标识它应该管理哪些 Pod,然后使用 selectors 来选择这些 Pod。
比如上图,一个 Deployment 要求匹配标签为 role=backend
,那么拥有 role=backend
标签的 Pod 就将被该 Deployment 管理。
可以使用 Kubernetes 的命令行工具 kubectl 来管理和操作 labels 和 selectors。例如,可以使用 kubectl label
命令来给一个对象添加或删除一个 label。可以使用 kubectl get -l
命令来选择一个或多个具有特定 label 的对象。
比如我们可以通过命令来查看 node 资源的标签:
kubectl get node --show-labels
[root@master mtuser]# kubectl get node --show-labels NAME STATUS ROLES AGE VERSION LABELS master Ready master 5d9h v1.15.5 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=master,kubernetes.io/os=linux,node-role.kubernetes.io/master= node1 Ready <none> 5d9h v1.15.5 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=node1,kubernetes.io/os=linux
通过 describe 命令也可以查看到相关资源的标签:
[root@master mtuser]# kubectl describe pod my-first-deploy-84ffb59778-f7bb2 | grep -i label -A 5 Labels: app=my-first-deploy pod-template-hash=84ffb59778 Annotations: <none> Status: Running IP: 10.244.0.13 Controlled By: ReplicaSet/my-first-deploy-84ffb59778
可以看到,目前 my-first-deploy 资源创建出来的 Pod 被打上了标签 app=my-first-deploy
,这对应了 Deployment 中的定义:
apiVersion: apps/v1 kind: Deployment metadata: name: my-first-deploy spec: replicas: 1 selector: matchLabels: app: my-first-deploy // 匹配 app=my-first-deploy 的 Pod,加入到 Deployment 中进行管理 template: metadata: labels: app: my-first-deploy // 创建出来的 Pod 被打上了标签 ...
Deployment 中对 Pod 定义了标签 app=my-first-deploy
,同时还需要定义 nodeSelector 匹配的标签 app=my
。
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
本专刊适合于立志转行云计算的小白,有一定的编程、操作系统、计算机网络、数据结构、算法基础。 本专刊同时也适合于面向云计算(Docker + Kubernetes)求职的从业者。 本专刊囊括了云计算、VMWare、Docker、Kubernetes、Containerd等一系列知识点的讲解,并且最后总