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的资源和各个组件可以完整的整合到一起,形成一套完整的系统。
如果你觉得写的不错,欢迎转载和点赞。 转载时请保留作者署名jilodream/王若伊_恩赐解脱(博客链接:http://www.cnblogs.com/jilodream/