kubernetes 概念讲解(三)(1)

简介: kubernetes 概念讲解(三)(1)

18)  Label

19)  Selectors

20)  etcd

label

1 Label含义

1.1 Label其实就一对 key/value ,被关联到对象上,比如Pod,标签的使用我们倾向于能够标示对象的特殊特点,Labels的值对系统本身并没有什么含义,只是对用户才有意义。同一个资源对象的labels属性的key必须唯一,label可以附加到各种资源对象上,如Node,Pod,Service,RC等。一个资源拥有多个标签,可以实现不同维度的管理。标签(Label)的组成: key=value。Label可以在创建对象时就附加到对象上,也可以在对象创建后通过API进行额外添加或修改

2 Label命名规范

label 必须以字母或数字开头,可以使用字母、数字、连字符、点和下划线,最长63个字符。

3 使用Label原因

当相同类型的资源越来越多,对资源划分管理是很有必要,此时就可以使用Label为资源对象 命名,以便于配置,部署等管理工作,提升资源的管理效率。label 作用类似Java包能对不同文件分开管理,让整体更加有条理,有利于维护。

通过Label来对对象进行引用

4 Label创建脚本

4.1 命令创建

label [--overwrite] (-f FILENAME | TYPE NAME) KEY_1=VAL_1 ... KEY_N=VAL_N [--resource-version=version]

4.1.1 kubectl get pods 命令默认不会列出任何标签,使用 --show-labels 选项来查看 :

kubectl get po --show-labels

4.1.2 指定标签查看

kubectl get po -L creation_method,env

查看匹配标签条件的node

kubectl get nodes -l 标签key=标签values
kubectl get nodes -l  app=tomcat

查看匹配 标签key的pod

kubectl get po -L  app

4.1.3 给名为tomcat 的Pod添加label app=tomcat。

kubectl label pods tomcat  app=tomcat

4.1.4 把名为tomcat 的Pod修改label 为 app=tomcat1,且覆盖现有的value

kubectl label --overwrite pods tomcat app=tomcat1

4.1.5 把 namespace 中的所有 pod 添加 label

kubectl label pods --all test=test

4.1.6 删除名为“app”的label 。(使用“ - ”减号相连)

kubectl label pods tomcat app-

4.2 yaml脚本创建

vim label-pod-test.yaml
apiVersion: v1
kind: Pod
metadata:
  name: tomcat
  labels:
    app: tomcat
    release: stable
spec:
  containers:
  - name: tomcat
    image: tomcat
    ports:
    - containerPort: 80

tomcat的Pod添加了两个Label,分别为app: tomcatrelease: tomcat

5 Label使用场景

常用的,多维度标签分类:

版本标签(release):stable(稳定版),canary(金丝雀版本),beta(测试版)

环境类(environment):dev(开发),qa(测试),production(生产),op(运维)

应用类(applaction):ui(设计),as(应用软件),pc(电脑端),sc(网络方面)

架构层(tier):frontend(前端),backend(后端),cache(缓存)

分区标签(partition):customerA(客户),customerB

品控级别(track):daily(每天),weekly(每周)

vim label-pod-test.yaml
apiVersion: v1
kind: Pod
metadata:
  name: label-pod-test
  labels:       #使用labels字段来定义标签,可以一次定义多个标签,这里定义3个标签
    release: stable   #版本:稳定版
    env: qa              #环境:测试
    tier: frontend   #架构类:前端
spec:
  containers:
  - name: testTomcatLabel
    image: tomcat    #部署的是tomcat服务

selectors

Selector含义

标签选择器是Kubernetes中的核心分组原语,通过标签选择器,客户端/用户可以识别一组对象。

通俗理解为查找在yaml脚本配置的标签名并进行绑定,前提资源对象需要添加标签名。

Selector使用场景

通过node添加标签,再配置nodeSelector标签值,让pod运行在选择的节点上。

pod添加label,Service持续的监听selector下面的相同标签的Pod,通过Service的Label Selector来选择对应的Pod,实现Service的负载均衡机制。

kube-controller进程,通过资源对象RC上定义的Label Selector来筛选要监控和管理的Pod副本的数量

selector常见种类

field-selector

字段选择器允许您根据一个或多个资源字段的值筛选 Kubernetes 资源。下面是一些使用字段选择器查询的例子:

metadata.name=my-service
metadata.namespace!=default
status.phase=Pending

下面这个 kubectl 命令将筛选出status.phase字段值为 Running 的所有 Pod:

kubectl get pods --field-selector status.phase=Running

注意:

字段选择器本质上是资源过滤器。默认情况下,字段选择器/过滤器是未被应用的,这意味着指定类型的所有资源都会被筛选出来。这使得以下的两个 kubectl 查询是等价的:

kubectl get pods
kubectl get pods --field-selector ""

支持的字段

不同的 Kubernetes 资源类型支持不同的字段选择器。所有资源类型都支持 metadata.name和 metadata.namespace 字段。使用不被支持的字段选择器会产生错误,例如:

kubectl get ingress --field-selector foo.bar=baz
Error from server (BadRequest): Unable to find "ingresses" that match label selector "", field selector "foo.bar=baz": "foo.bar" is not a known field selector: only "metadata.name", "metadata.namespace"

支持的运算符

您可以使用 =、==和 != 对字段选择器进行运算(= 和 == 的意义是相同的)。例如,下面这个 kubectl 命令将筛选所有不属于 default 名称空间的 Kubernetes Service:

kubectl get services  --all-namespaces --field-selector metadata.namespace!=default

链式选择器

同标签和其他选择器一样,字段选择器可以通过使用逗号分隔的列表组成一个选择链。下面这个 kubectl 命令将筛选 status.phase 字段不等于 Running 同时 spec.restartPolicy字段等于 Always 的所有 Pod:

kubectl get services  --all-namespaces --field-selector metadata.namespace!=default

多种资源类型

您能够跨多种资源类型来使用字段选择器。下面这个 kubectl 命令将筛选出所有不在 default 命名空间中的 StatefulSet 和 Service:

kubectl get statefulsets,services --all-namespaces --field-selector metadata.namespace!=default

labels-selector

Label不是唯一的,很多object可能有相同的label。

通过label selector,客户端/用户可以指定一个object集合,通过label selector对object的集合进行操作。

Label selector有两种类型:


equality-based :可以使用=、==、!=操作符,可以使用逗号分隔多个表达式

set-based :可以使用in、notin、!操作符,另外还可以没有操作符,直接写出某个label的key,表示过滤有某个key的object而不管该key的value是何值,!表示没有该label的object

使用

kubectl get pods -l environment=production,tier=frontend
kubectl get pods -l 'environment in (production, qa)'

    API使用 label selector

    1.在service、replicationcontroller等object中有对pod的label selector,使用方法只能使用等于操作,例如:

    selector:
        component: redis

    Job, Deployment, Replica Set, Daemon Set 类型支持set-based 操作

    selector:
      matchLabels:
        component: redis
      matchExpressions:
        - {key: tier, operator: In, values: [cache]}
        - {key: environment, operator: NotIn, values: [dev]}

    matchlabels是{key,value}对的映射。matchlabels映射中的单个{key,value}等价于matchexpressions的元素,其键字段为“key”,运算符为“in”,值数组仅包含“value”。matchexpressions是pod选择器需求的列表。有效的运算符包括in、notin、exists和doesnotexist。对于in和notin,设置的值必须为非空。matchlabels和matchexpressions中的所有要求都被放在一起-必须满足所有这些要求才能匹配

    nodeSelector

    nodeSelector 是最简单的约束方式。nodeSelectorPodSpec 的一个字段。

    通过 --show-labels 可以查看当前 nodeslabels

     

    $ kubectl get nodes --show-labels
    NAME       STATUS    ROLES     AGE       VERSION   LABELS
    minikube   Ready     <none>    1m        v1.10.0   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/
    hostname=minikube

    如果没有额外添加 nodes labels,那么看到的如上所示的默认标签。我们可以通过 kubectl label node 命令给指定 node 添加 labels:

    $ kubectl label node minikube disktype=ssd
    node/minikube labeled
    $ kubectl get nodes --show-labels
    NAME       STATUS    ROLES     AGE       VERSION   LABELS
    minikube   Ready     <none>    5m        v1.10.0   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,disktype=ssd,kubernetes.io/host

    当然,你也可以通过 kubectl label node 删除指定的 labels(标签 key 接 - 号即可)

    $ kubectl label node minikube disktype-
    node/minikube labeled
    $ kubectl get node --show-labels
    NAME       STATUS    ROLES     AGE       VERSION   LABELS
    minikube   Ready     <none>    23m       v1.10.0 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/hostname=minikube

    创建测试 pod 并指定 nodeSelector 选项绑定节点:

    $ cat nginx.yaml
    apiVersion: v1
    kind: Pod
    metadata:
      name: nginx
      labels:
        env: test
    spec:
      containers:
      - name: nginx
        image: nginx
        imagePullPolicy: IfNotPresent
      nodeSelector:
        disktype: ssd
    $ kubectl create -f nginx.yaml
    pod/nginx created

    查看 pod 调度的节点,即我们指定有 disktype=ssd label 的 minikube 节点:

    $ kubectl get pods -o wide
    NAME      READY     STATUS    RESTARTS   AGE       IP           NODE
    nginx     1/1       Running   0          1m        172.18.0.4

    相关实践学习
    通过Ingress进行灰度发布
    本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
    容器应用与集群管理
    欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
    相关文章
    |
    6月前
    |
    Kubernetes 负载均衡 Perl
    kubernetes—五个概念入门(二)
    kubernetes—五个概念入门(二)
    122 0
    |
    6月前
    |
    Kubernetes 应用服务中间件 数据中心
    kubernetes—五个概念入门(一)
    kubernetes—五个概念入门(一)
    128 0
    |
    3月前
    |
    Kubernetes 调度 Perl
    在K8S中,Pod亲和性概念是什么?
    在K8S中,Pod亲和性概念是什么?
    |
    1月前
    |
    Kubernetes 持续交付 微服务
    深入浅出:理解 Kubernetes 核心概念
    Kubernetes 是一个由 Google 开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。它已成为微服务架构下的行业标准。本文深入浅出地介绍了 Kubernetes 的核心概念和组件,包括 Master 和 Node 组件、Pod、Service、Deployment 等,并提供了基本操作示例和实战应用,帮助你更好地管理和利用容器环境。
    |
    23天前
    |
    存储 Kubernetes 调度
    K8S中的核心概念
    【10月更文挑战第26天】云原生环境下的安全问题易被忽视,导致潜在风险。应用层渗透测试和漏洞扫描是检测安全的关键,尤其是对于CVE漏洞的修复。然而,常见误解认为安全由外部防护处理且不易引入问题。
    |
    3月前
    |
    Kubernetes 负载均衡 安全
    在k8S中,网络模型概念是什么?
    在k8S中,网络模型概念是什么?
    |
    3月前
    |
    存储 Kubernetes Cloud Native
    在k8S中,rook概念是什么?
    在k8S中,rook概念是什么?
    |
    3月前
    |
    JSON Kubernetes Cloud Native
    在k8S中,CNI模型概念是什么?
    在k8S中,CNI模型概念是什么?
    |
    3月前
    |
    消息中间件 Kubernetes 数据库
    在k8S中,初始化容器(init container)概念原理是什么?
    在k8S中,初始化容器(init container)概念原理是什么?
    |
    3月前
    |
    存储 Kubernetes Docker
    在K8S中,与K8S相关基础概念有哪些?
    在K8S中,与K8S相关基础概念有哪些?
    下一篇
    无影云桌面