k8s Label 2

简介: k8s Label 2

在 k8s 中,我们会轻轻松松的部署几十上百个微服务,这些微服务的版本,副本数的不同进而会带出更多的 pod

这么多的 pod ,如何才能高效的将他们组织起来的,如果组织不好便会让管理微服务变得混乱不堪,杂乱无章

因此,就有了标签 Label

标签 Label

标签是一种简单的却功能强大的 K8S 的其中一个特性,可以组织 K8S 中的资源,包括 pod 资源

标签是可以被附加到资源的任意键值对的,用来选择具有该确切标签的资源

也就是说,咱们的标签的 key 在资源内部是任意的,可以自己定义,只要是资源内唯一就可以

举个例子

我们可以将上述混乱的多个 pod,定义 2 个标签来进行组织

  • app

标识这个 pod 是属于什么应用

  • rel

标识这个 pod 中运行的应用版本,例如可以设置如下版本

  • stable
  • beta
  • canary

可以这样来组织

通过上述标签的方式来组织微服务,我们可以很轻易的就可以通过 pod 标签来查看我们期望看到的 pod 状态

写个 demo

就用之前的 xmt-kubia,yaml 文件改改,命名为 xmt-kubia-labels.yaml

加上 2 个自定义的标签:

  • xmt_create: auto
  • rel: stable
apiVersion: v1
kind: Pod
metadata:
  name: xmt-kubia-labels
  labels:
    xmt_create: auto
    rel: stable
spec:
  containers:
  - image: xiaomotong888/xmtkubia
    name: xmtkubia-labels
    ports:
    - containerPort: 8080
      protocol: TCP

通过 kubectl create -f xmt-kubia-labels.yaml 将 pod 运行起来

查看实际的标签情况

查看标签

kubectl get pod --show-labels

查看指定的标签

kubectl get po -L rel,xmt_create

修改 pod 的标签

kubectl label pod xmt-kubia-labels key=value

修改已有标签

kubectl label pod xmt-kubia-labels rel=dev --overwrite

标签选择器

就通过上面的案例,发现标签好像用处也不大,其实标签是要和标签选择器结合起来用的

标签选择器可以让我们根据特定的标签查出对应的 pod 集合,并且可以对这些 pod 集合做操作

标签选择器就是一种准则,用于过滤包含具有特定值的特定标签的资源,筛选条件如下:

  • 包含或者不包含使用特定键的标签
  • 包含具有特定键值的标签
  • 包含具有特定键值的标签,但是对应的值和我们指定的不同

使用标签选择器

列出 pod

kubectl get po -l key=value

kubectl get po -l rel=dev

列出包含某个标签的 pod

kubectl get po -l rel

列出不包含某个标签的 pod,需要使用单引号将条件包起来

kubectl get po -l '!rel'

使用感叹号,这个条件可以写成 !rel 表示不包含这个 rel 标签,因为 bash shell 会解析感叹号,所以我们使用 ! ,可以使用单引号 ‘’ 来进行包含和处理

也可以是 在 -l 后面添加 key=value

或者 key != value,

使用 inkubectl get po -l 'rel in (dev,prod)'

使用 notinkubectl get po -l 'rel notin (dev,prod)'

标签选择器中使用多个条件

kubectl get pod -l 条件1,条件2...

标签选择器可以帮助我们列出筛选后的 pod,我们还可以对于一个子集中的所有 pod 都执行某一类操作,例如删除某个子集内的所有 pod ,就可以是这样写kubectl delete pod -l xx=xx

标签可以用于工作节点的分类

当我们创建 pod 的时候,会有这样的需求,创建的某些 pod 对于 CPU 的计算性能要求比较高,那么我就需要将这类 pod 部署到 性能好的节点上面去,这样的话其实是将 程序和基础架构强耦合了

但是对于 K8S 的思想就不对等了,K8S 中的思想是应用程序隐藏实际的基础架构,在 K8S 中,创建出来的 pod 都是随机分配到不同的 节点上的,

那么,我们需要实现如上的需求,我们可以通过 标签来完成

给 node 加上标签

前面我们说过标签不仅仅是可以加在 pod 上面,实际上可以加上 K8S 中的所有资源上

例如,我们可以给我们的 node 加上一个标签,如: gpu=true,就指定这个 node 的 gpu 比较好,暂时使用 minikube 来演示

将 pod 调度到指定的 node 上面

继续上面的 demo,新建 xmt-kubia-gpu.yaml 文件,在 Spec 下面添加一个 node 选择器, nodeSlector指定选择 gpu: ”true” 的 node

使用kubectl create -f xmt-kubia-gpu.yaml 即可将创建的 pod 放到 标签为gpu: ”true” 的 node 上进行调度

我们应该通过标签选择器考虑符合特定标准的逻辑节点组 来调度 pod

顺带说一下:

我们若是真想指定 pod 被调度到一个指定的节点上也是可以做的,我们可以通过 kubectl get node --show-labels 查看 node 的标签

能够看到有一个键为 kubernetes.io/hostname 的标签,对应的值是该节点的主机名,因此我们可以利用这个标签来将我们的 pod 调度到指定的节点上面

这种做法会有一个风险,若我们指定的这个节点处于离线状态,那么我们创建的 pod 是不可调度的,这种方式技术上可行,但是不建议这么玩

注解

注解 annotations

注解和标签类似,但是和标签不同,注解不能像标签一个用于对对象的分组

注解能够容纳更多的信息,帮助我们对于资源的作用理解的更加顺畅,注解也是一个键值对的形式

添加和修改注解

kubectl annotate pod podName 具体的键值对

命名空间

命名空间 namespace

不同命名空间内可以有相同的资源名

查看命名空间

kubectl get ns

查看指定命名空间的 pod

kubectl get pod --namespace xxx

创建一个命名空间

  • 使用命令的方式

kubectl create namespace xxx

  • 使用 yaml 的方式

编写 yaml 文件,使用 kubectl create 创建即可

apiVersion: v1
kind: Namespace
metadata:
  name: test_ns

删除命名空间

kubectl delete ns xxx

删除命名空间的 pod,但是保留 命名空间

kubectl delete pod --all

如果 命名空间中有 RC,那么删除的 pod,还会被重新创建出来,RC 会去检测 pod 的副本数量,如果小于设定的副本数量,那么就会动态的创建

删除命名空间中的所有资源

kubectl delete all --all

今天就到这里,学习所得,若有偏差,还请斧正

欢迎点赞,关注,收藏

朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力

好了,本次就到这里

技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。

我是阿兵云原生,欢迎点赞关注收藏,下次见~

更多的可以查看 零声每晚八点直播:https://ke.qq.com/course/417774

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
Kubernetes Shell 调度
【k8s 系列】k8s 学习十六,Label 2
在 k8s 中,我们会轻轻松松的部署几十上百个微服务,这些微服务的版本,副本数的不同进而会带出更多的 pod
189 0
|
Kubernetes 容灾 应用服务中间件
【k8s 系列】k8s 学习十一,Label,RC,HPA
上面简单说了一下 pod 的基本知识点,待到后面会使用到 pod 的一些高阶知识点的时候,还可以再细细琢磨底层原理
135 0
|
Kubernetes 应用服务中间件 nginx
|
Kubernetes 容器 Perl
kubernetes资源对象--Label
概念 Label机制是K8S中一个重要设计,通过Label进行对象弱关联,灵活地分类和选择不同服务或业务,让用户根据自己特定的组织结构以松耦合方式进行服务部署。 Label是一对KV,对用户而言非常有意义的,但对K8S本身而言没有直接意义的。
1119 0
|
1月前
|
缓存 容灾 网络协议
ACK One多集群网关:实现高效容灾方案
ACK One多集群网关可以帮助您快速构建同城跨AZ多活容灾系统、混合云同城跨AZ多活容灾系统,以及异地容灾系统。
|
2月前
|
Kubernetes Ubuntu 网络安全
ubuntu使用kubeadm搭建k8s集群
通过以上步骤,您可以在 Ubuntu 系统上使用 kubeadm 成功搭建一个 Kubernetes 集群。本文详细介绍了从环境准备、安装 Kubernetes 组件、初始化集群到管理和使用集群的完整过程,希望对您有所帮助。在实际应用中,您可以根据具体需求调整配置,进一步优化集群性能和安全性。
148 12
|
2月前
|
Prometheus Kubernetes 监控
OpenAI故障复盘 - 阿里云容器服务与可观测产品如何保障大规模K8s集群稳定性
聚焦近日OpenAI的大规模K8s集群故障,介绍阿里云容器服务与可观测团队在大规模K8s场景下我们的建设与沉淀。以及分享对类似故障问题的应对方案:包括在K8s和Prometheus的高可用架构设计方面、事前事后的稳定性保障体系方面。
|
2月前
|
Kubernetes 网络协议 应用服务中间件
Kubernetes Ingress:灵活的集群外部网络访问的利器
《Kubernetes Ingress:集群外部访问的利器-打造灵活的集群网络》介绍了如何通过Ingress实现Kubernetes集群的外部访问。前提条件是已拥有Kubernetes集群并安装了kubectl工具。文章详细讲解了Ingress的基本组成(Ingress Controller和资源对象),选择合适的版本,以及具体的安装步骤,如下载配置文件、部署Nginx Ingress Controller等。此外,还提供了常见问题的解决方案,例如镜像下载失败的应对措施。最后,通过部署示例应用展示了Ingress的实际使用方法。
86 2
|
2月前
|
存储 Kubernetes 关系型数据库
阿里云ACK备份中心,K8s集群业务应用数据的一站式灾备方案
本文源自2024云栖大会苏雅诗的演讲,探讨了K8s集群业务为何需要灾备及其重要性。文中强调了集群与业务高可用配置对稳定性的重要性,并指出人为误操作等风险,建议实施周期性和特定情况下的灾备措施。针对容器化业务,提出了灾备的新特性与需求,包括工作负载为核心、云资源信息的备份,以及有状态应用的数据保护。介绍了ACK推出的备份中心解决方案,支持命名空间、标签、资源类型等维度的备份,并具备存储卷数据保护功能,能够满足GitOps流程企业的特定需求。此外,还详细描述了备份中心的使用流程、控制台展示、灾备难点及解决方案等内容,展示了备份中心如何有效应对K8s集群资源和存储卷数据的灾备挑战。