kubernetes云原生纪元:🤥初识标签(k8s)Label
初识
在kubernets 有一个叫标签🏷️的概念,他可以对pod、Deployment、 Service、node打标签,key和value方式存在,而且一个标签做不同参数,个性化的设定,一个资源可以有多个任意标签,可以让kubernetes 做更多的操作。
最常见的给Deployment打上标签,这样就可以让副本控制器知道哪些是自己的,Service也是如此。也可用通过打标签的方式区分节点大小。区分类型前后端服务也可用通过标签区分哪些是前端前些是后端。这样就可以通过标签跑在不同的机器上。
具体使用
以 web-demo.yaml为例:
- matchLabels匹配的标签,app是key web-demo 是value
selector: matchLabels: app: web-demo
- template: #模版 labels:app: web-demo 对应上面的标签
template: #模版 metadata: labels: app: web-demo
- Service下 selector:标签选择器 app: web-demo =标签
selector: app: web-demo
这个Deployment只是负责app: web-demo 这样标签的pod。
这个Deployment 在创建pod 的时候,根据什么样的配置就是这个template: 模版下个东西创建出来的。
Deployment的标签对应的pod 标签必须一致不然副本控制器没人管理这个pod而且无法创建
在Deployment 和pod 之间有一个rc 副本控制器Replication Controller
在1.6之后k8s就有意去隐藏了这个概念,用户可见只有Deployment,而实际上selector:作用于Replication Controller上。
两个Deployment 创建相同标签的pod是 可以,但是他们是不可见的,没有交集
#deploy
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-demo
namespace: dev
spec:
selector:
matchLabels: #匹配的标签
app: web-demo #标签的key=app,value=web-demp
replicas: 1
template: #模版
metadata:
labels:
app: web-demo
spec:
containers:
- name: web-demo
image: hub.zhang.com/kubernetes/demo:2020011512381579063123
ports:
- containerPort: 8080
两个Deployment 创建相同标签的pod是 可以,但是他们是不可见的,没有交集
#deploy
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-demo-new
namespace: dev
spec:
selector:
matchLabels: #匹配的标签
app: web-demo #标签的key=app,value=web-demp
replicas: 1
template: #模版
metadata:
labels:
app: web-demo
spec:
containers:
- name: web-demo
image: hub.zhang.com/kubernetes/demo:2020011512381579063123
ports:
- containerPort: 8080
如果创建两个相同的标签的Deployment ,跟service所要管理的标签一致的情况下service会根据同时管理这俩,然后通过轮循的方式访问。
---
#service
apiVersion: v1
kind: Service
metadata:
name: web-demo
namespace: dev
spec:
ports:
- port: 80
protocol: TCP
targetPort: 8080
selector:
app: web-demo
type: ClusterIP
---
#ingress
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: web-demo
namespace: dev
spec:
rules:
- host: web.demo.com
http:
paths:
- path: /
backend:
serviceName: web-demo
servicePort: 80
复杂化操作
上面我们只是说了key vlaue 相等方式使用,还有有一些条件的操作,比如in、notin …
当matchLabels: 和 matchExpressions:都有的情况下,必须这两个都得满足
- {key: group, operator: In, values: [dev,test]} 解释:key是group,operator条件是In,可以In到的值values可以是dev和test
selector: matchLabels: app: web-demo matchExpressions: - {key: group, operator: In, values: [dev,test]}
上面增加下面就要增加对应的标签
group: dev
- 2
- 2
这么一看上面配置上为什么下面必须要配置,是不是并没有什么用处,Deployment直接写一个 group=dev不就好,如果我们这yaml配置文件如果总是一个整体,其实大部门我们是可以配一份。
但是kubernetes这样设计更加灵活,有一个东西叫PodPreset(Pod预设),他允许template:
模版里面的东西交给你一拨人维护,因为这块比较简单,更是开发人员,上面selector:
里面的东西是一些共有通用的东西。这块就可以交给运维人员去维护。当应用真正要被创建的时候才会以某种方式组合在一起变成一个配置文件。这样他们的配置就可以起到一个校验作用,预先避免问题的发生。
#deploy
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-demo
namespace: dev
spec:
selector:
matchLabels:
app: web-demo
matchExpressions: # key是group,operator条件是In,可以In到的值values可以是dev和test
- {key: group, operator: In, values: [dev,test]}
replicas: 1
template:
metadata:
labels:
app: web-demo
group: dev #增加对应标签
spec:
containers:
- name: web-demo
image: hub.zhang.com/kubernetes/demo:2020011512381579063123
ports:
- containerPort: 8080
其他的就不多说了。
selector:一旦被创建就不能被改变,除非删除。
Kubectl 操作标签
除了用配置文件方式操作标签,我们还可以通过Kubectl 命令操作。-l
🔝指定label
比如:
[root@master-001 ~]# kubectl get pods -l group=dev -n test
NAME READY STATUS RESTARTS AGE
web-demo-57b4b9b96f-7fbtg 1/1 Running 0 62s
可以写多个标签条件再比如:
[root@master-001 ~]# kubectl get pods -l group=dev,app=web-demo -n test
NAME READY STATUS RESTARTS AGE
web-demo-57b4b9b96f-7fbtg 1/1 Running 0 2m44s
还有可以使用更灵活的条件比如:
[root@master-001 ~]# kubectl get pods -l 'group in (dev,test)' -n dev
NAME READY STATUS RESTARTS AGE
web-demo-57b4b9b96f-7fbtg 1/1 Running 0 5m14s
[root@master-001 ~]# kubectl get pods -l 'group notin (dev)' -n dev
No resources found in dev namespace
label用于node
根据标签选择对应的node节点创建服务
- 首先必须在node设置一个标签比如:disktype=ssd
[root@master-001 ~]# kubectl get node
NAME STATUS ROLES AGE VERSION
master-001 Ready master 14d v1.16.3
node-001 Ready <none> 14d v1.16.3
[root@master-001 ~]# kubectl label node node-001 disktype=ssd
node/node-001 labeled
- 然后在配置文件增加
nodeSelector: #节点选择器
disktype: ssd #标签
配置如下:
#deploy
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-demo
namespace: dev
spec:
selector:
matchLabels:
app: web-demo
matchExpressions:
- { key: group, operator: In, values: [dev,test] }
replicas: 1
template:
metadata:
labels:
app: web-demo
group: dev
spec:
containers:
- name: web-demo
image: hub.zhang.com/kubernetes/demo:2020011512381579063123
ports:
- containerPort: 8080
nodeSelector:
disktype: ssd
[root@master-001 ~]# kubectl apply -f web-demo.yaml -n dev
- 我们可以通过
--show-labels
查看
[root@master-001 ~]# kubectl get nodes --show-labels
NAME STATUS ROLES AGE VERSION LABELS
master-001 Ready master 14d v1.16.3 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=master-001,kubernetes.io/os=linux,node-role.kubernetes.io/master=
node-001 Ready <none> 14d v1.16.3 app=ingress,beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,disktype=ssd,kubernetes.io/arch=amd64,kubernetes.io/hostname=node-001,kubernetes.io/os=linux
- 查看pod 是否创建到对应的机器上
[root@master-001 ~]# kubectl get pods -n test -o wide
对pod理解到此结束。