Kubernetes学习之Labels、Namespace

本文介绍了Kubernetes中的Labels和Namespace。Labels作为K8S资源的重要标记,用于服务发现和服务注册,允许用户对资源进行多维度组织。Namespace则用于隔离不同的用户或项目组,提供资源的逻辑划分。文章详细讲解了Labels的创建、查询和使用,以及Namespace的操作方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、认识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命名空间不可删除。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值