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 labelsselectors 是两个非常重要的概念,用于标识选择 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等一系列知识点的讲解,并且最后总

全部评论

相关推荐

不愿透露姓名的神秘牛友
11-21 22:29
点赞 评论 收藏
分享
安全劝退第二人:给我发个
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务