节点标签的作用:

   k8s作为一个集群,每个pod都是随机调度到节点运行的,而不同的服务对资源的需求不同,比如mysql,elasticesarch等服务的pod对磁盘I/O要求比较高,这样的服务我们可以把它们手动调度到有ssd磁盘的服务器上运维更为合理,而不是调度到hdd磁盘节点上;

微服务对网络的要求比较高,可以把这些服务调度到网络带宽比较高的服务器运行

        而K8S默认的随机调度方式显然不适用,因此基于此情况,我们可以通过人工干预,把node添加不同的标签,基于这些标签区分调度

1、查看node节点默认的标签:

k8s集群创建好后,每个节点会有一个默认的标签,其中有个labels项目有个参数hostname是每个主机的标签名称,它的角色是node节点

2、node标签使用背景:

可根据业务情况,把不同项目的业务pod分配到指定的一批服务器上运行,只要在那一批服务器打上指定的标签,并且在业务资源的yaml文件中指定这个标签即可

3、打标签(基于key=value格式

把节点打上标签,该节点只用于project(项目)是myserver的,以后有myserver项目的pod调度的话有限调度到这个节点运行

root@master1:~# kubectl label node 172.31.7.111 project="myserver"

再查看node标签发生变化了,多了刚刚打上的标签名,pod的标签是给service筛选用的,而node的标签是给pod进行筛选用的

4、验证:

创建资源设置node标签,查验是否只会调度到对应的node节点

1、编写yaml文件
root@master1:/tmp# cat nodeSelector.yaml
kind: Deployment
#apiVersion: extensions/v1beta1
apiVersion: apps/v1
metadata:
  labels:
    app: myserver-tomcat-app2-deployment-label
  name: myserver-tomcat-app2-deployment
  namespace: myserver
spec:
  replicas: 1
  selector:
    matchLabels:
      app: myserver-tomcat-app2-selector
  template:
    metadata:
      labels:
        app: myserver-tomcat-app2-selector
    spec:
      containers:
      - name: myserver-tomcat-app2-container
        image: tomcat:7.0.94-alpine
        imagePullPolicy: IfNotPresent
        #imagePullPolicy: Always
        ports:
        - containerPort: 8080
          protocol: TCP
          name: http
        env:
        - name: "password"
          value: "123456"
        - name: "age"
          value: "18"
        resources:
          limits:
            cpu: 1
            memory: "256Mi"
          requests:
            cpu: 500m
            memory: "256Mi"
      nodeSelector:
        project: myserver


2、创建资源
root@master1:/tmp# kubectl apply -f nodeSelector.yaml

3、查看资源:如下截图可见,调度到了7.111节点上 

5、删除标签

删除node标签,再查看node标签时就没有了

6、 把之前创建的资源删除,重新部署下

1、删除资源
root@master1:/tmp# kubectl delete -f nodeSelector.yaml

2、重新创建资源
root@master1:/tmp# kubectl apply  -f nodeSelector.yaml

 3、查看资源,显示状态是pending,因为没有node节点满足节点标签这个参数的调度条件

重新把节点打上标签就可以正常调度这个资源正常运行了

如果两个node节点,一个节点用的是ssd磁盘,一共节点用的是hdd的磁盘,当有服务对磁盘要求毕竟高的时候,也可以根据标签进一步筛选

创建yaml资源

1、在yaml文件中最后再加上一个标签
root@master1:/tmp# cat nodeSelector.yaml
kind: Deployment
#apiVersion: extensions/v1beta1
apiVersion: apps/v1
metadata:
  labels:
    app: myserver-tomcat-app2-deployment-label
  name: myserver-tomcat-app2-deployment
  namespace: myserver
spec:
  replicas: 1
  selector:
    matchLabels:
      app: myserver-tomcat-app2-selector
  template:
    metadata:
      labels:
        app: myserver-tomcat-app2-selector
    spec:
      containers:
      - name: myserver-tomcat-app2-container
        image: tomcat:7.0.94-alpine
        imagePullPolicy: IfNotPresent
        #imagePullPolicy: Always
        ports:
        - containerPort: 8080
          protocol: TCP
          name: http
        env:
        - name: "password"
          value: "123456"
        - name: "age"
          value: "18"
        resources:
          limits:
            cpu: 1
            memory: "256Mi"
          requests:
            cpu: 500m
            memory: "256Mi"
      nodeSelector:
        project: myserver
        disktype: ssd

2、创建资源
root@master1:/tmp# kubectl apply -f nodeSelector.yaml

3、查看资源 ,当节点同时符合yaml文件中定义的两个node标签时才给予调度

    有的时候就是这样通过先把K8S集群的各个节点通过项目=namespace,进行第一步的划分,把一类项目的pod分配到指定的那些node上

    然后再根据节点拥有的网卡,磁盘等的资源类型做进一步详细的划分

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐