一、认识Labels
Labels即为标签的意思,标签就是一对key/value键值对,被关联到对象之上,比如Pod,标签的使用可以方便的对K8S所创建的资源进行标记和记录对象资源的一些特殊特点;并且这些对用户而言是有意义的(比如可以对提供web服务的Pod和提供db存储的Pod进行标记与区分)。但是标签对内核系统是没有直接意义的。标签可以用来划分特定组的对象,标签可以在创建一个对象的时候直接给与,也可以在后期随时修改,每一个对象可以拥有多个标签,但是,key值必须是唯一的。
K8S的Labels是非常重要的一个资源,K8S中很多地方都需要Labels来进行服务注册与服务发现,比如Service是通过Label来发现后端Pod的。Label可以让用户将他们自己的有组织目的的结构以一种松耦合的方式应用到系统的对象上,且不需要客户端存放这些对应关系(mapping)。服务部署和批处理管道通常是多维的实体(例如多个分区或者部署,多个发布轨道,多层,每层多微服务)。管理通常需要跨越式的切割操作,这会打破有严格层级展示关系的封装,特别是对那些由基础设施而非用户决定的很死板的层级关系。我们最终会索引并且反向索引(reverse-index)labels,以获得更高效的查询和监视,把他们用到UI或者CLI中用来排序或者分组等等。我们不想用那些不具有指认效果的label来污染label,特别是那些体积较大和结构型的数据。不具有指认效果的信息应该使用annotation来记录。
Label其实是一对key/value,有效的Label keys必须是部分:一个可选前缀+名称,通过/来区分。名称部分是必须的,并且最多63个字符,开始和结束字符必须是字母或者数字,中间是字母数据和"_","-",".",前缀可有可无,如果指定了,那么前缀必须是一个DNS子域,一系列的DNSlabel通过".“来划分,长度不超过253个字符,”/"来结尾。如果前缀被省略了,这个Label的key被假定为对用户私有的,自动系统组成部分(比如kube-scheduler,kube-controller-manager,kube-apiserver,kubectl),这些为最终用户添加标签的必须要指定一个前缀,Kubernetes.io前缀是为Kubernetes内核部分保留的。合法的label值必须是63或者更短的字符,要么是空,要么首位字符必须为字母数字字符,中间必须是横线,下划线,点或者数字字母。
Label选择器是用来筛选符合对象资源的一种对象,与Name和Uid不同,label不提供唯一性;通常,我们会看到很多对象有着一样的label;通过label选择器,客户端/用户能方便辨识出一组对象;label选择器是kubernetes中核心的组织原语。API目前支持两种选择器:基于相等和基于集合的,一个label选择器可以由多个必须条件组成,由逗号分隔,在多个必须条件指定的情况下,所有的条件都必须满足,因而逗号起着AND逻辑运算符的作用。一个空的label选择器(即有0个必须条件的选择器)会选择集合中的每一个对象;一个null型label选择器(仅对于可选的选择器字段才可能)不会返回任何对象。
Label例子:
“release” : “stable”, “release” : “canary”, …
“environment” : “dev”, “environment” : “qa”, “environment” : “production”
“tier” : “frontend”, “tier” : “backend”, “tier” : “middleware”
“partition” : “customerA”, “partition” : “customerB”, …
“track” : “daily”, “track” : “weekly”
标签选择器:
等值选择器:=,==,!=
集合关系:
KEY in (VALUE1,VALUE2,...)
KEY not in (VALUE1,VALUE2,...)
KEY
!KEY
二、Label使用操作
1)创建具有label资源的Pod
]# cat label.yaml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: test-label
namespace: default
spec:
replicas: 3
selector:
matchLabels:
app: myapp
release: canary
template:
metadata:
name: myapp-pod
labels:
app: myapp
release: canary
environment: qa
spec:
containers:
- name: myapp-container
image: ikubernetes/myapp:v1
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 80
]# kubectl create -f label.yaml
2)查看所有Pod的标签与值
# 查看每个Pod的Label
]# kubectl get pods --show-labels
NAME READY STATUS RESTARTS AGE LABELS
test-label-rczsn 1/1 Running 0 16m app=myapp,environment=qa,release=canary
test-label-smgfm 1/1 Running 0 16m app=myapp,environment=qa,release=canary
test-label-wg69h 1/1 Running 0 16m app=myapp,environment=qa,release=canary
3)查看具有指定标签的Pod
# 查看具有app标签的Pod
]# kubectl get pods -l app
NAME READY STATUS RESTARTS AGE
test-label-rczsn 1/1 Running 0 20m
test-label-smgfm 1/1 Running 0 20m
test-label-wg69h 1/1 Running 0 20m
# 查看具有release标签的Pod
]# kubectl get pods -l release
NAME READY STATUS RESTARTS AGE
test-label-rczsn 1/1 Running 0 20m
test-label-smgfm 1/1 Running 0 20m
test-label-wg69h 1/1 Running 0 20m
# 查看具有environment标签的Pod
]# kubectl get pods -l environment
NAME READY STATUS RESTARTS AGE
test-label-rczsn 1/1 Running 0 18m
test-label-smgfm 1/1 Running 0 18m
test-label-wg69h 1/1 Running 0 18m
4)根据Pod的Key获取其值
# 获取Pod中key为app的信息值
]# kubectl get pods -L app
NAME READY STATUS RESTARTS AGE APP
test-label-rczsn 1/1 Running 0 5m13s myapp
test-label-smgfm 1/1 Running 0 5m13s myapp
test-label-wg69h 1/1 Running 0 5m13s myapp
# 获取Pod中key为release的信息值
]# kubectl get pods -L release
NAME READY STATUS RESTARTS AGE RELEASE
test-label-rczsn 1/1 Running 0 5m20s canary
test-label-smgfm 1/1 Running 0 5m20s canary
test-label-wg69h 1/1 Running 0 5m20s canary
# 获取Pod中key为environment的信息值
]# kubectl get pods -L environment
NAME READY STATUS RESTARTS AGE ENVIRONMENT
test-label-rczsn 1/1 Running 0 8m21s qa
test-label-smgfm 1/1 Running 0 8m21s qa
test-label-wg69h 1/1 Running 0 8m21s qa
5)修改Pod的标签的值
# 修改Pod的environment的值;注意:如果该Pod的environment上已经有值了,则需要加上--overwrite选项来强制修改
]# kubectl label pod test-label-rczsn environment=dev --overwrite=True
pod/test-label-rczsn labeled
# 再次查询Pod的environment值
]# kubectl get pods -L environment
NAME READY STATUS RESTARTS AGE ENVIRONMENT
test-label-rczsn 1/1 Running 0 13m dev
test-label-smgfm 1/1 Running 0 13m qa
test-label-wg69h 1/1 Running 0 13m qa
6)根据in条件来查询Pod
# 过滤满足environment标签指定值的Pod;有多个查询条件是使用,进行分隔,多个条件默认为and关系
]# kubectl get pods -l "environment in (dev,pro)"
NAME READY STATUS RESTARTS AGE
test-label-rczsn 1/1 Running 0 23m
# 过滤满足release标签指定值的Pod
]# kubectl get pods -l "release in (stabel,canary)"
NAME READY STATUS RESTARTS AGE
test-label-rczsn 1/1 Running 0 25m
test-label-smgfm 1/1 Running 0 25m
test-label-wg69h 1/1 Running 0 25m
7)根据notin来查询Pod
# 查询envroment标签中不是qa值的Pod
]# kubectl get pods -l "environment notin (qa)"
NAME READY STATUS RESTARTS AGE
test-label-rczsn 1/1 Running 0 27m
# 修改Pod的environment标签的值
kubectl label pods test-label-7794b environment=production --overwrite=True
pod/test-label-7794b labeled
# 查询environment中标签不是qa值的Pod
]# kubectl get pods -l "environment notin (qa)"
NAME READY STATUS RESTARTS AGE
test-label-7794b 1/1 Running 0 14m
test-label-rczsn 1/1 Running 0 48m
8)删除指定Pod的标签与值
# 删除标签只需要在对于的Pod的标签后加上一个-号即可
]# kubectl label pods test-label-7794b environment-
pod/test-label-7794b labeled
]# kubectl get pods --show-labels
NAME READY STATUS RESTARTS AGE LABELS
test-label-7794b 1/1 Running 0 19m app=myapp,release=canary
test-label-rczsn 1/1 Running 0 52m app=myapp,environment=dev,release=canary
test-label-smgfm 1/1 Running 0 52m app=myapp,environment=qa,release=canary
9)查询具有指定key的Pod信息值
]# kubectl get pods -l environment
NAME READY STATUS RESTARTS AGE
test-label-rczsn 1/1 Running 0 55m
test-label-smgfm 1/1 Running 0 55m
10)查看满足多个标签条件的Pod
]# kubectl get pods -l "environment in (qa,dev),release in (canary)"
NAME READY STATUS RESTARTS AGE
test-label-rczsn 1/1 Running 0 62m
test-label-smgfm 1/1 Running 0 62m
三、认识Namespace
Namespace是一组资源和对象的抽象几何,比如可以用来将系统内部的对象划分为不同的项目组或用户组。常见的pods,services,replicaion controller和deplovments等都是属于系统中的某一个namespace的(所有的资源当未指定namespace时,默认都属于default名称空间),而node,persistentVolumes等则不属于任何namespace。
Namespace常用来隔离不同的用户,比如Kubernetes自带的服务一般运行在kube-system namespace中。
四、Namespace操作
kubectl可以通过-namespace或者-n选项指定namespace。如果不指定,默认为default。
查看操作下,也可以设置-all-namespace=true来查看所有namespace下的资源。
1)查询Namespace
]# kubectl get namespace
NAME STATUS AGE
default Active 10d
kube-node-lease Active 10d
kube-public Active 10d
kube-system Active 10d
kubernetes-dashboard Active 9d
注意:Namespace包括两种状态"Active"和"Terminating";在Namespace删除过程中,Namespace状态被设置成"Terminating"。
2)创建Namespace
使用命令行创建
]# kubectl create namespace mytest-ns
namespace/mytest-ns created
注意:命名空间名称满足正则表达式[a-z0-9]([a-z0-9]*[a-z0-9])?,最大长度为63位。
通过yaml文件创建
]# cat ns.yaml
apiVersion: v1
kind: Namespace
metadata:
name: mytest-ns
]# kubectl create -f ns.yaml
namespace/mytest-ns created
3)删除Namespace
]# kubectl delete namespace mytest-ns
namespace "mytest-ns" deleted
注意:删除一个Namespace会自动删除所有属于该Namespace的全部资源;default和kube-system命名空间不可删除。