k8s 实战 3----标签

如果你对k8s还不了解,可以看下前文
k8s 实战 1 ---- 初识 (https://www.cnblogs.com/jilodream/p/18245222)
k8s 实战 2 ---- pod 基础 (https://www.cnblogs.com/jilodream/p/18284282)

什么是标签?
标签也就是Label,是作用在k8s的资源上的,用来记录的资源的状态,或元数据的一组数据。
label本质上就是一组键值对。
我们可以将其作用在pod,deployment、node等等资源上。
这一点和java语言中的注解非常像。我们可以通过注解来标记类或者方法或者属性,这些注解并不会直接改变类或者方法什么特性。而是由其它的方法
分析这些注解,从而做出符合需要的判断。
举个例子,假若我们的pod,由于某种需要,分别需要标记出是由谁在维护当前pod,我们就可以通过标签来记录这些信息。
话不多说,来看代码:
1、首先我们按照如下yaml模板,创建一个pod。
注意看metadata 标签下,新加了labels ,表示要添加的标签及其值。
我们这里增加用户(user)和模块 (module)两个标签,yaml文件如下:

 1 apiVersion: v1
 2 kind: Pod
 3 metadata:
 4   name: busyb-p
 5   labels: 
 6     user: happy
 7     module: order
 8 spec:
 9   containers: 
10     - image: docker.io/library/kuard-amd64:blue
11       name: bb-c
12       ports: 
13         - containerPort: 8080
14           name: http
15           protocol: TCP

创建好之后,我们可以追加参数的形式,查看pod中包含的标签
kubectl get xx --show-labels xx表示资源类型

1 [root@iZ2ze3bpa0o5cw6gp42ry2Z learnK8s]# k get pods --show-labels
2 NAME                              READY   STATUS    RESTARTS   AGE    LABELS
3 busyb-p                           1/1     Running   0          11s    module=order,user=happy

注意看,LABELS列即为我们添加的标签:module 和user
我们还可以在pod运行期时,手动的增删标签:
kubectl label xx xxx "标签key=标签value" xx表示资源类型 xxx表示资源名称
如先动态新增version标签,再修改version标签。注意修改时,需要追加参数( --overwrite),否则会修改不成功

 1 [root@iZ2ze3bpa0o5cw6gp42ry2Z learnK8s]# k label pod busyb-p "version=dev"
 2 pod/busyb-p labeled
 3 [root@iZ2ze3bpa0o5cw6gp42ry2Z learnK8s]# k get pods --show-labels
 4 NAME                              READY   STATUS    RESTARTS   AGE    LABELS
 5 busyb-p                           1/1     Running   0          35m    module=order,user=happy,version=dev
 6 
 7 [root@iZ2ze3bpa0o5cw6gp42ry2Z learnK8s]# k label pod busyb-p "version=test" --overwrite
 8 pod/busyb-p labeled
 9 [root@iZ2ze3bpa0o5cw6gp42ry2Z learnK8s]# k get pods --show-labels
10 NAME                              READY   STATUS    RESTARTS   AGE    LABELS
11 busyb-p                           1/1     Running   0          47m    module=order,user=happy,version=test

如果要删除某个标签,kubectl label pod busyb-p "标签key-",如下:

1 [root@iZ2ze3bpa0o5cw6gp42ry2Z learnK8s]# k label pod busyb-p "level-"
2 pod/busyb-p unlabeled
3 [root@iZ2ze3bpa0o5cw6gp42ry2Z learnK8s]# k get pods --show-labels
4 NAME                              READY   STATUS    RESTARTS   AGE    LABELS
5 busyb-p                           1/1     Running   0          71m    module=order,user=happy,version=product

在shell界面,如果标签太多,我们除了可以用管道追加grep的传统过滤办法,也可以使用k8s的过滤参数
kubectl get pods --selector="标签key=标签value"
也可以用-l 代替--selector

1 [root@iZ2ze3bpa0o5cw6gp42ry2Z learnK8s]# kubectl get pods --selector="user=happy,module=order"
2 NAME      READY   STATUS    RESTARTS   AGE
3 busyb-p   1/1     Running   0          74m
4 
5 [root@iZ2ze3bpa0o5cw6gp42ry2Z learnK8s]# kubectl get pods -l "user=happy,module=order"
6 NAME      READY   STATUS    RESTARTS   AGE
7 busyb-p   1/1     Running   0          76m

如果要显示某个指定的标签:
-L "标签key"

1 [root@iZ2ze3bpa0o5cw6gp42ry2Z learnK8s]# kubectl get pods  -L "version" 
2 NAME                              READY   STATUS    RESTARTS   AGE    VERSION
3 busyb-p                           1/1     Running   0          78m    product

以上就是标签的基本操作,那么他除了用户的普通标记还有什么用呢?
其实标签的作用非常之大,k8s整体是一个解耦的系统,组件之间是独立运行的。但是组件之间又互相需要通信或者是标记来感知状态。
此时就需要标签作为媒介,进行信息的传输,比如:
1、我们在启动pod时,要限制pod在哪些节点上运行,此时就需要在节点上打好标签。接着在pod的yaml模板中,限制好要启动节点的标签。(节点就是k8s集群中各个机器,也就是node)
2、deployment要固定pod的副本数,此时就需要通过标签进行过滤,如果筛选出的标签多了,就删除,如果少了就创建。(deployment 是一种更高级的资源,也称之为“部署”,可以简单的理解为批量对一批pod进行管理和部署,后文会专门介绍)

标签就相当于是一个粘合剂,把不同的资源组件通过标签进行关联。使k8s的资源和各个组件可以完整的整合到一起,形成一套完整的系统。

posted @ 2024-07-10 09:52  王若伊_恩赐解脱  阅读(153)  评论(0编辑  收藏  举报