Kubernetes(k8s)-标签(label)和nodeSelector介绍

作者介绍:简历上没有一个精通的运维工程师。请点击上方的蓝色《运维小路》关注我,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。

图片

我们上一章介绍了Docker基本情况,目前在规模较大的容器集群基本都是Kubernetes,但是Kubernetes涉及的东西和概念确实是太多了,而且随着版本迭代功能在还增加,笔者有些功能也确实没用过,所以只能按照我自己的理解来讲解。

我们前面介绍了Kubernetes的在调度过程中会进行预选,其中资源是一个很重要的因素,另外其他预选条件很大部分都是通过标签(label)来实现的。

Kubernetes(简称K8s)中的标签(Labels)是一种识别Kubernetes对象(如Pods, Nodes, Services等)的键值对。标签是Kubernetes管理对象的重要机制之一,它们用来选择对象并将其组织成逻辑组。今天我们要讲的标签是是工作负载和Node之间的匹配。

1.查看Node标签

#当然这里的标签都部署k8s自动生成的
#master节点标签数量默认会多于node节点
[root@master01 ~]# kubectl get nodes --show-labels
NAME       STATUS   ROLES                  AGE    VERSION    LABELS
master01   Ready    control-plane,master   4d1h   v1.23.12   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=master01,kubernetes.io/os=linux,node-role.kubernetes.io/control-plane=,node-role.kubernetes.io/master=,node.kubernetes.io/exclude-from-external-load-balancers=
node01     Ready    <none>                 4d1h   v1.23.12   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=node01,kubernetes.io/os=linux
node02     Ready    <none>                 15m    v1.23.12   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=node02,kubernetes.io/os=linux

2.查看Pod标签

#查看所有pod的标签
kubectl get pods --show-labels

#根据标签查询pod
kubectl get pods -l app=myapp 

3.给Node添加标签​​​​​​​

# node01是节点名字
# role=worker是标签对
[root@master01 ~]# kubectl label nodes node01 role=worker
node/node01 labeled

# 删除标签
[root@master01 ~]# kubectl label nodes node01 role-
node/node01 unlabeled

我们通过给不同的Node打上不同的标签,有利于把同一类型的Node节点进行归类,然根据不同的节点类型结合业务特性进行调度,有利于集群资源的合理利用。

比如当前Node01节点我希望我的某个业务都调度到有这个标签的节点,而不调度到我们新加入的Node02节点,我在创建Pod的时候就可用通过给Pod添加控制条件的方式调度过去。

4.创建Pod​​​​​​​

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: myapp
spec:
  replicas: 3
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      nodeSelector:
        #role: myrole  #错误的标签会调度失败
        role: worker   #正确的标签才会调度成功
      containers:
      - name: nginx
        image: nginx
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80

由于我上面首先使用的是错误的标签,调度就会失败,会处于Pending(等待调度)状态。这个时候我的2个服务器都是空的,但是由于标签不匹配,均无法调度成功,修改匹配的调度标签以后调度成功。

图片

    [root@master01 label]# kubectl get event
    LAST SEEN   TYPE      REASON              OBJECT                                   MESSAGE
    56s         Warning   FailedScheduling    pod/nginx-deployment-7976f7c899-dh7bd    0/3 nodes are available: 1 node(s) had taint {node-role.kubernetes.io/master: }, that the pod didn't tolerate, 2 node(s) didn't match Pod's node affinity/selector.
    56s         Warning   FailedScheduling    pod/nginx-deployment-7976f7c899-j6xdz    0/3 nodes are available: 1 node(s) had taint {node-role.kubernetes.io/master: }, that the pod didn't tolerate, 2 node(s) didn't match Pod's node affinity/selector.
    56s         Warning   FailedScheduling    pod/nginx-deployment-7976f7c899-pb5xl    0/3 nodes are available: 1 node(s) had taint {node-role.kubernetes.io/master: }, that the pod didn't tolerate, 2 node(s) didn't match Pod's node affinity/selector.

    这里调度失败提示3个节点(包括Master),其中一个节点有污点(Taint),这个稍后就会讲;另外2个节点没有对应的标签,所以调度失败。

    从调度解读来说:标签属于Pod选Node,Node必须满足Pod的要求才能被调度成功。

    我们前面讲控制器和Pod的时候,其实他们之间也是通过标签来区分和识别的;Service和Pod也是通过标签来进行建立对应关系的。

    运维小路

    一个不会开发的运维!一个要学开发的运维!一个学不会开发的运维!欢迎大家骚扰的运维!

    关注微信公众号《运维小路》获取更多内容。

    猜你喜欢

    转载自blog.csdn.net/dessler/article/details/146428665
    今日推荐