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: tomcat和release: 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
是最简单的约束方式。nodeSelector
是 PodSpec
的一个字段。
通过 --show-labels
可以查看当前 nodes
的labels
$ 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