• 【云原生 】Kubernetes(k8s)标签详解


    前言

    我们知道使用pod控制器创建的pod,在pod故障以后重建后的pod ip地址和名称是变化的,为了解决pod访问问题,我们特此创建了service,我们访问service的ip地址就可以正常访问到pod;那么问题来了,service是怎样去关联pod的呢?在k8s上如果使用pod控制创建的pod,在pod发生故障以后,对应pod会被对应的控制器重启或重建,一个pod重建以后,对应的ip地址和名称都是会发生变化的,所以靠ip地址和名称关联pod是不行的;那靠什么关联pod呢?在k8s上是使用的标签和标签选择器的机制实现资源和资源间相互关联的。

    什么是标签?它的作用是干嘛用的?

    所谓标签就是指一个键值数据,在k8s上任何资源都可以拥有标签;我们可以在创建资源时在配置清单中指定,也可以创建好资源以后再使用命令添加标签;有了标签以后,我们后续就可以根据标签来管理对应的资源;一个资源可以拥有多个标签,同时一个标签也可以附加给多个资源;我们可以理解为标签就是用来逻辑的对资源进行分组,拥有相同标签的资源为一组;标签的作用是方便用户管理资源;比如在k8s上运行了几百个pod,我们想要管理功能相同的pod,就可以把具有相似功能的pod附加同一个标签,然后要管理这些pod的时,直接指定拥有指定标签的pod即可。

    一、什么是Kubernetes标签

    要学习 k8s 标签,需要从以下几个方面来学习。 首先,我们需要知道什么是 k8s 标签。
    在 k8s 中,标签(Labels)是附加到 k8s 对象(比如 Pods)上的键值对。
    标签的一个示例如下所示:

    “metadata”:{
       “labels”:{
      “key1” : ”value1”
      “key2” : ”value2”
    }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    标签的作用主要有两点:
    一是标签旨在用于指定对用户有意义且相关的对象的标识属性,但不直接对核心系统有语义含义。
    二是标签可以用于组织和选择对象的子集。

    标签的特点主要有如下三点:
    1、每个对象都可以定义一组键值标签。
    2、每个键对于给定对象必须是唯一的。
    3、标签能够支持高效的查询和监听操作,对于用户界面和命令行是很理想的。

    二、设计标签的目的

    设计标签的主要目的是使用户能够以松耦合的方式将他们自己的组织结构映射到系统对象,而无需客户端存储这些映射。

    有如下几个示例标签,例如:

    1、在区分发行版本的时候,可以指定:
    “release” : “canary”
    “release” : “dev”
    “release” : “beta”
    “release” : “stable”
    ……

    2、在定义运行环境时,可以指定:
    “environment”: “dev”
    “environment”: “qa”
    “environment”: “production”
    ……

    三、标签的语法

    接着,我们来学习下标签的语法。

    1、前缀:
    1)前缀是可选的;
    2)如果指定,前缀必须是DNS子域:由点“.”分割的一系列DNS标签,总共不超过253个字符,后跟斜杠“/”;
    3)如果省略前缀,则假定标签键对用户是私有的。向最终用户对象添加标签的自动系统组件(例如:kube-scheduler、kube-controller-manager、kube-apiserver、kubctl或其他第三方自动化工具)必须指定前缀

    2、名称:
    1)名称段是必需的
    2)必须小于等于63个字符,以字母数字字符“[a-z0-9A-Z]”开头和结尾,带有破折号“—”,下划线“_”,点“.”和之前的字母数字

    3、小结:有效的标签值
    1)必须为63个字符或更少(可以为空);
    2)除非标签值为空,必须以字母数字字符“[a-z0-9A-Z]”开头和结尾;
    3)包含破折号“—”,下划线“_”,点“.”和之前的字母数字
    示例:是一个有 environment 为 qa,同时 app 为 nginx 标签的 pod 配置文件。

    apiVersion:v1
    kind:Pod
    metadata:
     name:label-demo
     labels:
    environment:production
    app:nginx
    spec:
      containers:
      -name:nginx
       Image:nginx:1.14.2
       Ports:
       -containerPort:80
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    四、标签选择运算符

    然后,我们来学习下标签选择运算符。 标签选择运算符分为两种:

    一种是基于等值的需求:
    基于等值或基于不等值的需求允许按标签键和值进行过滤。 可接受的运算符有“=”、“==”、“!=”。
    一种是基于集合的需求:
    基于集合的标签需求允许你通过一组值来过滤键。 持有三种操作符:“in”、“notin”、“exists”。

    最后,我们来学习下如何使用 API 来使用标签。 前面提到的两种标签选择算符都可以通过 REST 客户端用于 list 或者 watch 资源。

    基于等值的需求可以使用如下命令来获取 pods。

    Kubectl get pods –l environment-production,tier=frontend

    基于集合的需求可以使用如下命令来获取 pods。

    Kubectl get pods –l ‘environment in (production),tier in (frontend)’

    五、标签的使用

    K8S中资源标签label
    1、说明
    标签label:
    资源标志
    格式 key=value
    可添加删除多个标签

    标签选择器 label selector:
    用于选择资源
    name=name1
    name!=name1
    name in (name1,name2)
    name not in (name1,name2)

    2、指令
    1)帮助:

    kubectl label --help

    2)打标签:

    pod:kubectl label pods busybox app=busybox

    node:kubectl label node k8s-node01 k8s-node02 env=test

    3)查看:
    查看pods为busybox的标签:

    kubectl get pods busybox --show-labels

    查看默认名称空间下所有pod资源的标签:

    kubectl get pods --show-labels

    查看指定名称空间:

    kubectl get pods -n kube-system --show-labels

    4)更新:
    加上–overwrite参数修改标签

    kubectl label po busybox app=busybox2 -n kube-public --overwrite

    5)通过标签筛选:
    列出默认名称空间下标签key是app的pod,不显示标签:

    kubectl get pods -l app

    列出默认名称空间下标签key是app、值是busybox的pod,不显示标签:

    kubectl get pods -l app=busybox

    多个筛选条件:

    kubectl get po -l version!=v1,app=nginx

    6)删除:

    pod:kubectl label po busybox app- -n kube-public

    node:kubectl label node k8s-node02 env-

    3、配置
    1)创建label-nginx.yaml

    apiVersion: v1
    kind: Pod
    metadata:
    	name: nginx
    	namespace: dev
    	labels:
    		version: "1.0.0"
    		env: "test"
    spec:
    	containers: 
    	- image: nginx
    	  imagePullPolicy: IfNotPresent
    	  name: pod
    	  ports:
    	  - name: nginx-port
    	    containerPort: 80
    	    protocol: TCP
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    2)创建

    kubectl create -f label-nginx.yaml

    3)删除

    kubectl delete -f label-nginx.yaml

    以上就是K8s 标签的介绍。

  • 相关阅读:
    [附源码]java毕业设计药品管理系统
    【B3637 最长上升子序列】
    设计模式再探——原型模式
    编程段子│只有程序猿才能看懂的搞笑段子
    (计算机组成原理)第四章指令系统-第三节1:X86汇编语言基础
    总结了一份Java架构师核心知识点PDF丨粉丝福利
    DataGridView可以点击列排序 Sort(使用BindingList改写)
    【代码审计-PHP】phpStudy(新版) + PhpStorm + XDebug动态调试
    【Shiro】入门概述
    【2023】springboot通过阿里云oss进行文件单个批量文件上传下载
  • 原文地址:https://blog.csdn.net/GaussDB/article/details/126538636