作者介绍:简历上没有一个精通的运维工程师。请点击上方的蓝色《运维小路》关注我,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。
我们上一章介绍了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也是通过标签来进行建立对应关系的。
运维小路
一个不会开发的运维!一个要学开发的运维!一个学不会开发的运维!欢迎大家骚扰的运维!
关注微信公众号《运维小路》获取更多内容。