书籍来源:《CKA/CKAD应试指南:从Docker到Kubernetes完全攻略》
一边学习一边整理读书笔记,并与大家分享,侵权即删,谢谢支持!
附上汇总贴:Kubernetes认证考试自学系列 | 汇总_COCOgsta的博客-CSDN博客
当我们运行一个pod的时候,master会根据自己的算法来调度pod运行在哪个节点之上,具体是在哪个节点上,我们只有在pod被创建出来之后才知道。
5.6.1 给节点设置标签
我们可以通过在每个节点上设置一些标签,然后指定pod运行在特定标签的节点上,就可动手动地指定pod运行在哪个节点之上。
标签的格式:key=value,key的值里可以包括符号“/”或者“.”,多个标签用逗号隔开。
步骤1:查看所有节点的标签。
[root@vms10 ~]# kubectl get nodes --show-labels
NAME STATUS ROLES AGE VERSION LABELS
vms10.rhce.cc Ready control-plane, master 30h v1.21.1 ... 省略 ...
vms11.rhce.cc Ready <none> 30h v1.21.1 ... 省略 ...
vms12.rhce.cc Ready <none> 30h v1.21.1 ... 省略 ...
[root@vms10 ~]#
步骤2:查看某特定节点的标签。
[root@vms10 ~]# kubectl get nodes vms12.rhce.cc --show-labels
NAME STATUS ROLES AGE VERSION LABELS
vms12.rhce.cc Ready <none> 30h v1.21.1 ... 省略 ...
[root@vms10 ~]#
给节点设置标签的语法如下。
kubectl label node 节点名 key=value
步骤3:给vms12节点设置一个标签diskxx=ssdxx。
[root@vms10 ~]# kubectl label node vms12.rhce.cc diskxx=ssdxx
node/vms12.rhce.cc labeled
[root@vms10 ~]#
步骤4:查看标签是否生效。
[root@vms10 ~]# kubectl get nodes vms12.rhce.cc --show-labels
NAME STATUS ROLES AGE VERSION LABELS
vms12.rhce.cc Ready <none> 30h v1.21.1 ...,diskxx=ssdxx,...
[root@vms10 ~]#
如果要取消节点的某个标签,语法如下。
kubectl label node 节点名 key-
注意:在key后面加上-, -前面不要有空格。
步骤5:现在取消vms12的diskxx-ssdxx标签。
[root@vms10 ~]# kubectl label node vms12.rhce.cc diskxx-
node/vms12.rhce.cc labeled
[root@vms10 ~]#
步骤6:再次查看vms12的标签。
[root@vms10 ~]# kubectl get nodes vms12.rhce.cc --show-labels
NAME STATUS ROLES AGE VERSION LABELS
vms12.rhce.cc Ready <none> 30h V1.21.1 ... 省略 ...
[root@vms10 ~]#
可以看到diskxx这个标签, 已经不存在了。
如果要给所有的节点设置标签,语法如下。
kubectl label node --all key=value
这里有个特殊的标签, 格式为node-role.kubernetes.io/名字。
这个标签是用于设置kubectl get nodes结果里ROLES那列值的, 比如master节点上会显示control-plane和master, 其他节点显示为。
[root@vms10 pod]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
vms10.rhce.cc Ready control-plane, master 30h v1.21.1
vms11.rhce.cc Ready <none> 30h v1.21.1
vms12.rhce.cc Ready <none> 30h v1.21.1
[root@vms10 pod]#
这里vms10上会显示control-plane和master,就是因为系统自动设置了标签
node-role.kubernetes.io/control-plane和node-role.kubernetes.io/master, 其中node-role.kubernetes.io后面的部分就是显示在ROLES下面的。
这个键有没有值都无所谓, 如果不设置值的话, value部分直接使用""替代即可, 假设现在把vms11 ROLES位置设置为worker1,vms12 Roles位置设置为worker2。
步骤7:给两台worker设置node-role.kubernetes.io标签, 并把master上的control-plane给去掉。
[root@vms10 pod]# kubectl label nodes vms11.rhce.cc node-role.kubernetes.io/worker1="" # 给vms11添加worker1标记
node/vms11.rhce.cc labeled
[root@vms10 pod]# kubectl label nodes vms12.rhce.cc node-role.kubernetes.io/worker2="" # 给vms12添加worker2标记
node/vms12.rhce.cc labeled
[root@vms10 pod]# kebectl label nodes vms10.rhce.cc node-role.kubernetes.io/control-plane- # 去掉master的control-plane标记
[root@vms10 pod]#
步骤8:查看结果。
[root@vms10 pod]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
vms10.rhce.cc Ready master 30h v1.21.1
vms11.rhce.cc Ready worker1 30h v1.21.1
vms12.rhce.cc Ready worker2 30h v1.21.1
[root@vms10 pod]#
步骤9:如果要取消这个名字的话,和取消普通标签是一样的。
[root@vms10 pod]# kubectl label nodes vms11.rhce.cc node-role.kubernetes.io/worker1-
node/vms11.rhce.cc labeled
[root@vms10 pod]# kubectl label nodes vms12.rhce.cc node-role.kubernetes.io/worker2-
node/vms12.rhce.cc labeled
[root@vms10 pod]#
步骤10:再次给vms12设置diskxx=ssdxx标签。
[root@vms10 ~]# kubectl label node vms12.rhce.cc diskxx=ssdxx
node/vms12.rhce.cc labeled
[root@vms10 ~]#
5.6.2 创建在特定节点上运行的pod
在pod里通过nodeSelector可以让pod在含有特定标签的节点上运行。
创建新pod, 让其在vms12节点上运行。
步骤1:创建pod所需的yaml文件podlabel.yaml, 内容如下。
[root@vms10 pod]# cat podlabel.yaml
apiVersion: v1
kind: Pod
metadata:
name: web1
labels:
role: myrole
spec:
nodeSelector:
diskxx: ssdxx
containers:
- name: web
image: nginx
imagePullPolicy: IfNotPresent
[root@vms10 pod]#
这样web1只会在含有标签为diskxx=ssdxx的节点上运行, 如果有多个节点都含有标签diskxx=ssdxx的话, 则k8s会在这几个节点中的一个节点运行。
请注意nodeSelector的缩进, 是和containers同级的。
步骤2:创建pod。
[root@vms10 pod]# kubectl apply -f podlabel.yaml
pod/web1 created
[root@vms10 pod]#
步骤3:查看pod运行的节点。
[root@vms10 pod]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE ...
web1 1/1 Running 0 29s 10.244.3.9 vms12.rhce.cc ...
[root@vms10 pod]#
步骤4:自行删除此pod。
5.6.3 Annotations设置
不管是node还是pod, 包括后面讲述的其他对象(比如deployment),都还有一个属性Annotations, 这个属性可以理解为注释。
步骤1:现在查看vms12.rhce.cc的Annotations属性。
[root@vms10 pod]# kubectl describe nodes vms12.rhce.cc
Name: vms12.rhce.cc
Roles: <none>
...
Annotations: kubeadm.alpha.kubernetes.io/cri-socket: /var/run/dockershim.sock
node.alpha.kubernetes.io/ttl: 0
projectcalico.org/IPv4Address: 192.168.26.12/24
projectcalico.org/IPv4IPIPTunnelAddr: 192.168.14.0
volumes.kubernetes.io/controller-managed-attach-detach: true
[root@vms10 pod]#
步骤2:要设置此节点的Annotations, 可以通过如下命令设置。
[root@vms10 pod]# kubectl annotate nodes vms12.rhce.cc aa=123
node/vms12.rhce.cc annotated
[root@vms10 pod]#
步骤3:查看节点vms12.rhce.cc的属性。
[root@vms10 pod]# kubectl describe nodes vms12.rhce.cc
Name: vms 12.rhce.cc
Roles: <none>
...
Annotations: aa: 123
kubeadm.alpha.kubernetes.io/cri-socket: /var/run/dockershim.sock
... 输出 ...
volumes.kubernetes.io/controller-managed-attach-detach: true
... 输出 ...
[root@vms10 pod]#
步骤4:要是取消的话,用如下命令。
[root@vms10 pod]# kubectl annotate nodes vms12.rhce.cc aa-
node/vms12.rhce.cc annotated
[root@vms10 pod]#