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

    相关实践学习
    容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
    通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
    云原生实践公开课
    课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务&nbsp;ACK 容器服务&nbsp;Kubernetes&nbsp;版(简称&nbsp;ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情:&nbsp;https://www.aliyun.com/product/kubernetes
    相关文章
    |
    4月前
    |
    Kubernetes 负载均衡 Perl
    kubernetes—五个概念入门(二)
    kubernetes—五个概念入门(二)
    70 0
    |
    4月前
    |
    Kubernetes 应用服务中间件 数据中心
    kubernetes—五个概念入门(一)
    kubernetes—五个概念入门(一)
    79 0
    |
    5月前
    |
    Kubernetes 负载均衡 网络协议
    k8s学习-Service(概念、模板、创建、外部代理、删除等)
    k8s学习-Service(概念、模板、创建、外部代理、删除等)
    159 0
    |
    6月前
    |
    Kubernetes Linux Shell
    【K8S 系列】k8s 学习二,kubernetes 核心概念及初步了解安装部署方式
    【K8S 系列】k8s 学习二,kubernetes 核心概念及初步了解安装部署方式
    107 0
    |
    4月前
    |
    存储 Kubernetes 调度
    Kubernetes 基本概念
    Kubernetes 基本概念
    61 0
    |
    14天前
    |
    Kubernetes 测试技术 Docker
    K8S中Deployment控制器的概念、原理解读以及使用技巧
    K8S中Deployment控制器的概念、原理解读以及使用技巧
    |
    19天前
    |
    存储 Kubernetes Docker
    Kubernetes(K8S)集群管理Docker容器(概念篇)
    Kubernetes(K8S)集群管理Docker容器(概念篇)
    |
    3月前
    |
    Kubernetes 网络协议 API
    玩转Kubernetes—基础概念篇
    玩转Kubernetes—基础概念篇
    61 1
    |
    5月前
    |
    Kubernetes Cloud Native 应用服务中间件
    【云原生】kubernetes学习之资源(对象)控制器概述---概念和实战(五)
    【云原生】kubernetes学习之资源(对象)控制器概述---概念和实战(五)
    22 0
    |
    5月前
    |
    Kubernetes Cloud Native 调度
    k8s学习-污点和容忍(概念、模版、创建、删除)
    k8s学习-污点和容忍(概念、模版、创建、删除)
    49 0