淘先锋技术网

首页 1 2 3 4 5 6 7

一. 标签

  1. 标签:是附加在Kubernetes对象上的一组键值对,意图是对指定资源进行有意义的标识
  2. 以前面封装k8sService为例,针对部署的指定标签,对一组部署封装为一个service统一向外暴露服务地址,通过标签去选择
kubectl expose deploy my-nginx2 --port=8888 --target-port=8080 --type=NodePort
  1. 标签创建规则:
  1. 标签的key可以有两个部分:可选的前缀和标签名,通过"/"分割
  2. 标签名是必填的,不能多于63个字符,必须由字母、数字开始和结尾,可以包含字母,数字,减号,下划线,小数点
  3. 标签前缀部分是可选的,如果指定,必须是一个DNS的子域名,例如:k8s.eip.work, 不能多于253个字符,使用"/"分隔
  4. 标签value必填, 不能多于63个字符,可以为空字符串,否则必须由字母,数字开始和结尾,可以包含字母,数字,减号,下划线,小数点
  1. 创建标签命令
#针对资源添加标签
kubectl label 资源类型 标签名=标签值

#针对资源下的指定资源添加标签
kubectl label 资源类型 资源名 标签名=标签值
  1. 获取标签
kubectl get labels
//查询资源信息时显示标签
kubectl get pod --show-labels
  1. 删除标签
kubectl label 资源类型 资源名 标签名-

yaml中对资源添加标签

  1. 查询已经存在的资源的标签yaml
kubectl get 资源类型 资源名 -o yaml
//以pod为例
kubectl get pod pod名称 -o yaml
  1. yaml中metadata.labels下就是标签相关信息,模范这个给指定资源添加标签
    在这里插入图片描述
apiVersion: v1 
kind: Pod
metadata:
	name: label-demo
	labels:#设置标签(可以有多个)
 		environment: production  
 		app: nginx

标签的分类

  1. 标签是用来标识和选择资源的元数据,为了方便使用可以对标签进行分类,例如
//1.应用程序和服务分类:
app: 标识应用程序或服务名称。示例:app: myapp
tier: 标识服务层级。示例:tier: backend
component: 标识组件或模块。示例:component: web
//2.环境分类:
environment: 标识环境,如开发、测试和生产。示例:environment: production
region: 标识区域或地理位置。示例:region: us-west
//3.版本控制和发布分类:
version: 标识应用程序或镜像版本号。示例:version: v1.2.3
release: 标识发布版本或构建编号。示例:release: 20210830
//4.部门和团队分类:
team: 标识部门或负责团队。示例:team: devops
owner: 标识资源的所有者或责任人。示例:owner: john.doe
//5.可用性和容错分类:
zone: 标识可用区或数据中心。示例:zone: us-west-1a
region: 标识区域或数据中心的逻辑分组。示例:region: us-west
//6.部署策略和调度分类:
affinity: 标识亲和性规则,用于约束资源之间的关系。示例:affinity: frontend
anti-affinity: 标识反亲和性规则,用于避免资源之间的互相部署。示例:anti-affinity: database

二. 标签选择器

  1. 通常情况下多个Kubernetes对象包含相同的标签。通过使用标签选择器(label selector),用户/客户端可以选择一组对象进行设置操作等,标签选择器是 Kubernetes 中最主要的分类和筛选手段
  2. Kubernetes api server支持两种形式的标签选择器
  1. equality-based: 基于等式的
  2. set-based 基于集合的,标签选择器可以包含多个条件,使用逗号分隔,只有满足所有条件的Kubernetes对象才会被选中
  1. 命令行方式创建标签选择器
//
kubectl get pods -l environment=production,tier=frontend 
//选择了标签名为 `environment` 且 标签值为 `production` 的Kubernetes对象
environment = production 
//选择了标签名为 `tier` 且标签值不等于 `frontend` 的对象,以及不包含标签 `tier` 的对象 
tier != frontend


//Set-based 标签选择器可以根据标签名的一组值进行筛选。支持的操作符有三种:in、notin、 exists。例如 
//选择所有的包含 `environment` 标签且值为 `production` 或 `qa` 的对象
environment in (production, qa)
//选择所有的 `tier` 标签不为 `frontend` 和 `backend`的对象,或不含 `tier` 标签的对象
tier notin (frontend, backend) 
//选择所有包含 `partition` 标签的对象
partition
//选择所有不包含 `partition` 标签的对象 
!partition
//选择包含 `partition` 标签(不检查标签值)且 `environment` 不是 `qa` 的对象 
partition,environment notin (qa)


kubectl get pods -l 'environment in (production),tier in (frontend)'
  1. 其它操作命令
kubectl label --help
//添加或者修改标签 
//Update pod 'foo' with the label 'unhealthy' and the value 'true'. 
kubectl label pods foo unhealthy=true 
//Update pod 'foo' with the label 'status' and the value 'unhealthy', overwriting any existing value. kubectl label --overwrite pods foo status=unhealthy # Update all pods in the namespace kubectl label pods --all status=unhealthy # Update a pod identified by the type and name in "pod.json" kubectl label -f pod.json status=unhealthy # Update pod 'foo' only if the resource is unchanged from version 1. kubectl label pods foo status=unhealthy --resource-version=1 # Update pod 'foo' by removing a label named 'bar' if it exists. # Does not require the --overwrite flag. kubectl label pods foo bar-
  1. yaml中配置选择器
  1. matchLabels 是一个 {key,value} 组成的 map,map 中的一个 {key,value} 条目相当于 matchExpressions 中的一个元素,其 key 为 map 的 key,operator 为 In, values 数组则只包 含 value 一个元素。matchExpression 等价于基于集合的选择方式,支持的 operator 有 In、 NotIn、Exists 和 DoesNotExist。当 operator 为 In 或 NotIn 时,values 数组不能为空。所有 的选择条件都以 AND 的形式合并计算,即所有的条件都满足才可以算是匹配
#Job、Deployment、ReplicaSet 和 DaemonSet 同时支持基于等式的选择方式和基于集合的选择方式。 例如:
selector: 
	matchLabels: 
		component: redis 
	matchExpressions:
		- {key: tier, operator: In, values: [cache]}
		- {key: environment, operator: NotIn, values: [dev]}