20、K8S-控制资源-标签选择器

Kubernetes学习目录

1、基础知识

1.1、简介

Kubernetes通过标签来管理对应或者相关联的各种资源对象,Lable是kubernetes中的核心概念之一。

1.2、特点

1、创建:
 Lable通常在资源对象定义时确定,也可以在对象创建后动态添加或者删除
2、作用: 一个资源对象可以定义多个Lable,同一个Lable也可以关联多个资源对象上去
3、本质: lable本质上是一个key/value键值对,其中key与value由用户自己指定,Lable可以附加到各种资源对象上(比如我们学过的Node和Pod等)。
注意: key的命名:由
"字母、数字、_、.、-"这五类组成,只能以字符或数字作为开头和结尾。 标签名称不能多于63个字符

1.3、应用目的

Labe1关联到各种资源对象上,通过对Lable的管理从而达到对同Lable的资源进行分组管理(分配、调度、配置、部署等)。
常用标签使用场景:
版本标签: "release" : "stable""release" : "canary", "release" : "beta".。
环境标签: "environment" : "dev","environment" : "qa","environment": "prod"。
应用标签: "app" : "ui""app" : "as""app" : "pc", "app" : "sc""
架构层级标签: "tier" : "frontend""tier" : "backend", "tier" : "cache".
分区标签: "partition" : "customerA""partition": "customerB"。
品控级别标签: "track" : "daily""track" : "week1y"

1.4、操作方法

1.4.1、yaml令行方法

yaml方法:
   在特定的属性后面按照指定方式增加内容即可,格式如下:
       labels:
         key: value
   注意:
   labels 是 一个

1.4.2、命令行方法

查看标签:kubectl get pods -l label_name=label_value
    参数:
        -l 就是指定标签条件,获取指定资源对象,=表示匹配,!= 表示不匹配
        如果后面的选择标签有多个的话,使用逗号隔开
        如果针对标签的值进行范围过滤的话,可以使用如下格式:
        -l "label_name in|notin (value1, value2, value3, ...)"
增加标签:kubectl label 资源类型 资源名称 label_name=label_value 参数: 同时增加多个标签,只需要在后面多写几个就可以了,使用空格隔开 默认情况下,已存在的标签是不能修改的,使用 --overwrite=true 表示强制覆盖
删除标签:
label_name
=label_value样式写成 label_name- ,表示删除label

2、简单实践

2.1、资源文件方式

2.1.1、资源清单

cat > pod-test.yml<<'EOF'
apiVersion: v1
kind: Pod
metadata:
  name: nginx-test
  labels:
    app: nginx
spec:
  containers:
  - name: nginx
    image: 192.168.10.33:80/k8s/my_nginx:v1
    env:
    - name: HELLO
      value: "Hello kubernetes nginx"
EOF

2.1.2、还没有增加标签的查询

master1 ]# kubectl get pods
...
Labels:           <none>
...

2.1.3、应用清单并且查询标签

master1 ]# kubectl apply -f pod-test.yml 
pod/nginx-test created

master1 ]# kubectl get pod nginx-test --show-labels
NAME         READY   STATUS    RESTARTS   AGE   LABELS
nginx-test   1/1     Running   0          31s   app=nginx

2.1.4、通过标签过滤查询pod

master1 ]# kubectl get pods -l app=nginx
NAME         READY   STATUS    RESTARTS   AGE
nginx-test   1/1     Running   0          92s

2.2、命令行方式

master1 ]# kubectl run nginx-test --image=192.168.10.33:80/k8s/my_nginx:v1 --labels="app=nginx,env=prod"

master1 ]# kubectl get pod --show-labels
NAME         READY   STATUS    RESTARTS   AGE     LABELS
nginx-test   1/1     Running   0          2m43s   app=nginx,env=prod

master1 ]# kubectl get pod -l app=nginx
NAME         READY   STATUS    RESTARTS   AGE
nginx-test   1/1     Running   0          2m57s

3、标签管理【命令行】

3.1、增加标签

kubectl label pod nginx-test version=1.0

3.2、查询标签

kubectl get pod --show-labels 

3.3、删除标签

kubectl label pod nginx-test version-

4、标签选择器

4.1、基础知识

4.1.1、简介

Lablel附加到Kubernetes集群中的各种资源对象上,目的就是对这些资源对象进行分组管理,而分组管理的核心就是:Lablel Selector。
 
分组管理的原理:
 我们可以通过Label Selector(标签选择器)查询和筛选某些特定Label的资源对象,进而可以对他们进行相应的操作管理,类似于我们的sql语句中where的条件:
 select * from where ...
Lablel Selector跟Label一样,不能单独定义,必须附加在一些资源对象的定义文件上。一般附加在RC和Service的资源定义文件中。

4.1.2、表达式

Label Selector使用时候有两种常见的表达式:等式和集合

等式:
    name = nginx 匹配所有具有标签 name = nginx 的资源对象
    name != nginx 匹配所有不具有标签 name = nginx 的资源对象

集合:
    env in (dev, test) 匹配所有具有标签 env = dev 或者 env = test 的资

源对象
    name not in (frontend) 匹配所有不具有标签 name = frontend 的资源对象

4.2、集合表达式

随着Kubernetes功能的不断完善,集合表达式逐渐有了两种规范写法:匹配标签、匹配表达式

4.2.1、匹配标签

matchLabels:
    name: nginx

4.2.2、匹配表达式

matchExpressions:
     - {key: name, operator: NotIn, values: [frontend]}

常见的operator操作属性值有:
  In、NotIn、Exists、NotExists等
  Exists和DostNotExist时,values必须为空,即
  { key: environment, opetator: Exists,values:}

注意:
这些表达式,一般应用在RS、RC、Deployment等其它管理对象中。

4.3、应用场景

标签选择器的主要应用场景:
监控具体的Pod、负载均衡调度、定向调度,常用于 Pod、Node等资源对象

 

 

当设置 env=dev的Label Selector,则会匹配到Node1和Node2上的Pod

4.4、表达式过滤查询pod

4.4.1、等值过滤

# 等值过滤
master1 ]# kubectl get pods -l env=test

# 等值过滤
master1 ]# kubectl get pods -l env==test

4.4.2、不相等

# 不相等
master1 ]# kubectl get pods -l app!=nginx

4.4.3、包含标签的key

# 包含app的key
master1 ]# kubectl get pods -l app

4.4.4、多条件过滤

# 多条件过滤
master1 ]# kubectl get pods -l "env in(test,prod)"

4.4.5、多条件过滤取反

# 多条件过滤取反
master1 ]# kubectl get pods -l "env notin(test,prod)"

4.5、service资源对象关联对应标签的Pod

4.5.1、创建3个Pod

kubectl run nginx-test1 --image=192.168.10.33:80/k8s/my_nginx:v1 --labels='app=nginx'
kubectl run nginx-test2 --image=192.168.10.33:80/k8s/my_nginx:v1 --labels='app=nginx'
kubectl run nginx-test3 --image=192.168.10.33:80/k8s/my_nginx:v1 --labels='app=nginx'

master1 ]# kubectl get pods --show-labels -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES LABELS
nginx-test1 1/1 Running 0 63s 10.244.3.99 node1 <none> <none> app=nginx
nginx-test2 1/1 Running 0 58s 10.244.3.100 node1 <none> <none> app=nginx
nginx-test3 1/1 Running 0 52s 10.244.4.59 node2 <none> <none> app=nginx

4.5.2、创建service对象关联对应标签的Pod

cat >service-test.yml<<'EOF'
kind: Service
apiVersion: v1
metadata:
  name: service-test
spec:
  selector:
    app: nginx
  ports:
  - name: http
    protocol: TCP
    port: 80
    targetPort: 80
EOF

master1 ]# kubectl apply -f service-test.yml 


# 访问集群IP地址,是负载至每个pod节点上
master1 ]# kubectl get svc -o wide
NAME               TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE     SELECTOR
service-test       ClusterIP   10.103.165.52   <none>        80/TCP    61s     app=nginx

# 看到已经关联到相关的pod
master1 ]# kubectl describe service service-test 
...
TargetPort:        80/TCP
Endpoints:         10.244.3.100:80,10.244.3.99:80,10.244.4.59:80
...

 

posted @ 2023-03-20 14:44  小粉优化大师  阅读(139)  评论(0编辑  收藏  举报