Kubernetes认证考试自学系列 | 手动指定pod运行位置

书籍来源:《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]#

猜你喜欢

转载自blog.csdn.net/guolianggsta/article/details/130668049