k8s Labels 和 Selectors
Labels 组织标签,selector 使用标签
·
Labels
Labels 是一对 key/value,被关联到对象上,标签的使用我们倾向于能够标示对象的特殊特点,并且对用户而言是有意义的(就是一眼就看出了这个 Pod 是什么数据库),但是标签对内核系统是没有直接意义的。
标签可以用来划分特定组的对象(比如,所有 带把儿 的),标签可以在创建一个对象的时候直接给与,也可以在后期随时修改。
每一个对象可以拥有多个标签,但是,key 值必须是唯一的。
"labels":{
"key1": "value1",
"key2": "value2"
}
使用标签组织 pod
标签是一个功能强大的 k8s 特性,不仅可以组织 pod,也可以组织所有其他的 k8s 资源。
金丝雀发布(也叫灰度发布):是指在部署新版本时,先只让一小部分用户体验 新版本以观察新版本的表现,然后再向所有用户进行推广,这样可以防 止暴露有问题的版本给过多的用户。
例如在灰度测试的使用场景中:
apiVersion: v1
kind: Pod
metadata:
name: kubeia-manual-v2
labels:
creation_method: manual <-- 标签
env: prod <-- 第二个标签
...
常用命令
//为 pod 添加一个标签
kubectl label po pod_name label_name=label_value
//更改 pod 标签的值
kubectl label po pod_name label_name=label_new_value
//列出标记了 label_name:label_value 的 pod
kubectl label po -l label_name=label_value
//列出包含 env 标签的所有 pod
kubectl label po -l env
//列出没有 env 标签的 pod
kubectl label po -l '!env'
//也可以将pod与以下标签选择器进行匹配
creation_method!=manual 选择带有creation_method 标签,并且值不等于 manual 的 pod
env in(prod,devel)选择带有 env 标签且值为 prod 或 devel 的 pod
env notin(prod,devel)选择带有 env 标签,但其值不是 prod 或 devel 的 pod
//使用多个条件
app=pc,rel=beta // 用逗号分隔
使用标签分类 工作节点
pod 并不是唯一可以附加标签的 k8s 资源,标签可以附加在任何 k8s 对象上,包括节点。
//查看现有 node 及 label
kubectl get nodes --show-labels
//为节点添加 gpu:true 标签
kubectl label node node_name gpu=true
//筛选带某一标签的节点
kubectl get nodes -l gpu=true
//删除 label
kubectl label nodes <node-name> <label-key>-
//删除key为disktype的label
kubectl label nodes node01 disktype-
//修改 label 的值
kubectl label nodes <node-name> <label-key>=<label-value> --overwrite
kubectl label nodes node01 disktype=hdd --overwrite
将 pod 调度到特定节点
使用标签选择器可以将 pod 调度到特定节点:yaml 文件:
apiVersion: v1
kind: Pod
metadata:
name: kubia-gpu
spec:
nodeSelector: <--节点选择器,将 pod 部署到包含 gpu=true 标签的节点上
gpu: true
containers:
- image: lukas/kubia
name: kubia
如果不存在带 gpu=true 标签的 node,那么该 pod 将无法被调度执行。
END
更多推荐
已为社区贡献4条内容
所有评论(0)