Kubernetes实战(十六)-k8s节点打标签

pod可以根据调度策略让pod调度到想要的节点上运行,或者不在某节点运行。

1 查看现有节点运行环境已有标签

$ kubectl get nodes --show-labels
NAME           STATUS   ROLES                  AGE   VERSION   LABELS
ops-master-1   Ready    control-plane,master   26d   v1.21.9   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=ops-master-1,kubernetes.io/os=linux,node-role.kubernetes.io/control-plane=,node-role.kubernetes.io/master=,node.kubernetes.io/exclude-from-external-load-balancers=
ops-master-2   Ready    control-plane,master   26d   v1.21.9   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=ops-master-2,kubernetes.io/os=linux,node-role.kubernetes.io/control-plane=,node-role.kubernetes.io/master=,node.kubernetes.io/exclude-from-external-load-balancers=
ops-master-3   Ready    control-plane,master   26d   v1.21.9   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=ops-master-3,kubernetes.io/os=linux,node-role.kubernetes.io/control-plane=,node-role.kubernetes.io/master=,node.kubernetes.io/exclude-from-external-load-balancers=
ops-worker-1   Ready    <none>                 26d   v1.21.9   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=ops-worker-1,kubernetes.io/os=linux
ops-worker-2   Ready    <none>                 26d   v1.21.9   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=ops-worker-2,kubernetes.io/os=linux

2 添加标签

#给节点ops-worker-1打上标签env=uat
$ kubectl label node ops-worker-1 env=uat
 
#给节点ops-worker-2打上标签env=prod
$ kubectl label node ops-worker-2 env=prod
 
#查看生成的标签
$ kubectl get node --show-labels | grep env 
ops-worker-1   Ready    <none>                 26d   v1.21.9   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,env=uat,kubernetes.io/arch=amd64,kubernetes.io/hostname=ops-worker-1,kubernetes.io/os=linux
ops-worker-2   Ready    <none>                 26d   v1.21.9   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,env=prod,kubernetes.io/arch=amd64,kubernetes.io/hostname=ops-worker-2,kubernetes.io/os=linux

3 指定标签分发pod

3.1 创建pod时候指定调度节点

3.1.1 生成deployment文件

$ cat nginx.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-test
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      nodeSelector:        #添加此行  
        env: uat      #指定标签
      containers:
      - name: nginx-test
        image: nginx:latest
        ports:
        - containerPort: 80

3.1.2 执行生成pod

$ kubectl apply -f nginx.yaml 
deployment.apps/nginx-test created

3.1.3 查看结果

$ kubectl get pod  -o wide 
NAME                           READY   STATUS    RESTARTS   AGE   IP             NODE           NOMINATED NODE   READINESS GATES
nginx-test-6895cc9759-989h8    1/1     Running   0          7s      172.25.78.78   ops-worker-1   <none>           <none>
nginx-test-6895cc9759-slzcm    1/1     Running   0          7s      172.25.78.79   ops-worker-1   <none>           <none>

3.2 运行状态pod迁移到指定节点

迁移过程相当于删除当前节点pod,再在新node上生成pod,生产环境操作时需要谨慎。

3.2.1 调整pod运行标签

$ kubectl edit deploy nginx-test 
修改
      nodeSelector:
        env: uat
为
      nodeSelector:
        env: prod

deployment.apps/nginx-test edited

3.2.2 查看结果

$ kubectl get pod  -o wide 
NAME                           READY   STATUS    RESTARTS   AGE     IP              NODE           NOMINATED NODE   READINESS GATES
nginx-test-6b7c99bbb-8sfh7     1/1     Running   0          49s     172.25.50.140   ops-worker-2   <none>           <none>
nginx-test-6b7c99bbb-hp62s     1/1     Running   0          67s     172.25.50.139   ops-worker-2   <none>           <none>

pod已经切换至ops-worker-2节点上,且pod创建时间不足1分钟。

4 删除标签

$ kubectl label node ops-worker-1 env-
node/ops-worker-1 labeled

查看节点上pod状态。

$ kubectl get pod  -o wide 
NAME                           READY   STATUS    RESTARTS   AGE     IP              NODE           NOMINATED NODE   READINESS GATES
nginx-node1-5f9555db6b-db2cq   1/1     Running   0          12m     172.25.78.76    ops-worker-1   <none>           <none>
nginx-node1-5f9555db6b-rq2pn   1/1     Running   0          12m     172.25.78.77    ops-worker-1   <none>           <none>

删除节点标签,正在运行的pod不受影响 。

查看节点标签。

$ kubectl get nodes --show-labels | grep ops-worker-1 
ops-worker-1   Ready    <none>                 26d   v1.21.9   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=ops-worker-1,kubernetes.io/os=linux

删除节点上的pod,验证pod重新调度是否正常。

$ kubectl delete pod nginx-node1-5f9555db6b-db2cq 
pod "nginx-node1-5f9555db6b-db2cq" deleted

$ kubectl get pod -o wide 
NAME                           READY   STATUS    RESTARTS   AGE     IP              NODE           NOMINATED NODE   READINESS GATES
nginx-node1-5f9555db6b-ctbb9   0/1     Pending   0          59s     <none>          <none>         <none>           <none>
nginx-node1-5f9555db6b-rq2pn   1/1     Running   0          16m     172.25.78.77    ops-worker-1   <none>           <none>

pod无法调度运行,因为调度策略中的nodeSelector调度策略还存在,因此生产环境在清理了node标签后,如无其他符合条件的可用节点,一定要将运行在节点上的pod中配置的标签清理掉,否则pod重启后将无法调度。

5 多标签

同一个node同类型只能设置一个, 重复设置会报错:

$ kubectl get nodes --show-labels | grep env
ops-worker-2   Ready    <none>                 27d   v1.21.9   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,env=prod,kubernetes.io/arch=amd64,kubernetes.io/hostname=ops-worker-2,kubernetes.io/os=linux

看到ops-worker-2节点上已经有env相关的标签了。

$ kubectl label node ops-worker-2 env=uat
error: 'env' already has a value (prod), and --overwrite is false

再次在 ops-worker-2节点上设置env相关的标签会提示标签已存在,无法重复设置同类型的标签。

相关推荐
土豆沒加1 小时前
K8S的Dashboard登录及验证
云原生·容器·kubernetes
大腕先生2 小时前
微服务环境搭建&架构介绍(附超清图解&源代码)
微服务·云原生·架构
终端行者2 小时前
kubernetes1.28部署mysql5.7主从同步,使用Nfs制作持久卷存储,适用于centos7/9操作系统,
数据库·容器·kubernetes
一ge科研小菜鸡2 小时前
DeepSeek 与后端开发:AI 赋能云端架构与智能化服务
人工智能·云原生
伪装成塔的小兵7 小时前
Windows使用docker部署fastgpt出现的一些问题
windows·docker·容器·oneapi·fastgpt
寂夜了无痕8 小时前
k8s容器运行时环境选型指南
云原生·kubernetes·k8s运行时环境选择
元气满满的热码式8 小时前
logstash中的input插件(http插件,graphite插件)
网络·网络协议·http·elasticsearch·云原生
转身後 默落11 小时前
11.Docker 之分布式仓库 Harbor
分布式·docker·容器
Swift社区11 小时前
【微服务优化】ELK日志聚合与查询性能提升实战指南
spring·elk·微服务·云原生·架构
guihong00411 小时前
深入解析Zookeeper脑裂问题与CAP取舍:从原理到实战
分布式·zookeeper·云原生