一体化监控管理平台解决方案,一体化监控管理平台的应用范围
730
2022-11-05
k8s部署-35-k8s中的标签如何使用呢?一文带你了解
概念
Label,顾名思义就是标签,在k8s中标签就是一个键值对,key=value,几乎在所有的资源上都可以使用label,非常的灵活:Pod、Deployment、Service、Node上面都可以使用。
其次,同一个资源是可以拥有多个标签的,比如我们的Pod-A,既可以拥有app=tomcat,也可以具有web=nihao的标签,使用上更加方便。
命名规则
Label 必须以字母或数字开头,可以使用字母、数字、连字符、点和下划线,最长63个字符。
作用
我觉得标签的作用是为了统一管理,具有相同特点的pod,可以让其具有同一个label,这样子的话后面管理起来非常方便,也可以指定这个pod在哪个node节点上运行,如果你有特殊需要的话。
实操
首先我们新建一个yaml文件,里面配置上标签;
[root@node1 ~]# cd namespace/[root@node1 namespace]# mkdir label[root@node1 namespace]# cd label/[root@node1 label]# vim label-web-demo.yaml #deployapiVersion: apps/v1kind: Deploymentmetadata: name: tomcat-demospec: selector: matchLabels: app: tomcat-demo replicas: 1 template: metadata: labels: app: tomcat-demo spec: containers: - name: tomcat-demo image: registry.cn-hangzhou.aliyuncs.com/liuyi01/tomcat:8.0.51-alpine ports: - containerPort: 8080 resources: requests: memory: 100Mi cpu: 100m limits: memory: 100Mi cpu: 200m---#serviceapiVersion: v1kind: Servicemetadata: name: tomcat-demospec: ports: - port: 80 protocol: TCP targetPort: 8080 selector: app: tomcat-demo---#ingressapiVersion: extensions/v1beta1kind: Ingressmetadata: name: tomcat-demospec: rules: - host: tomcat.yunweijia.com http: paths: - path: backend: serviceName: tomcat-demo servicePort: 80[root@node1 label]# [root@node1 label]# kubectl apply -f label-web-demo.yaml -n dev[root@node1 label]# kubectl get deploy -n dev | grep tomcattomcat-demo 1/1 1 1 33s[root@node1 label]#
上面可以看到运行成功,那么我们再修改下deployment的名字,name: tomcat-demo-yunweijia,别的配置都不修改。如下:
[root@node1 label]# vim label-deploy-web-demo.yaml#deployapiVersion: apps/v1kind: Deploymentmetadata: name: tomcat-demo-yunweijiaspec: selector: matchLabels: app: tomcat-demo replicas: 1 template: metadata: labels: app: tomcat-demo spec: containers: - name: tomcat-demo image: registry.cn-hangzhou.aliyuncs.com/liuyi01/tomcat:8.0.51-alpine ports: - containerPort: 8080 resources: requests: memory: 100Mi cpu: 100m limits: memory: 100Mi cpu: 200m---#serviceapiVersion: v1kind: Servicemetadata: name: tomcat-demospec: ports: - port: 80 protocol: TCP targetPort: 8080 selector: app: tomcat-demo---#ingressapiVersion: extensions/v1beta1kind: Ingressmetadata: name: tomcat-demospec: rules: - host: tomcat.yunweijia.com http: paths: - path: backend: serviceName: tomcat-demo servicePort: 80[root@node1 label]# [root@node1 label]# kubectl apply -f label-deploy-web-demo.yaml -n dev[root@node1 label]# kubectl get deploy -n dev | grep tomcattomcat-demo 1/1 1 1 2m51stomcat-demo-yunweijia 1/1 1 1 9s[root@node1 label]#
可以看到,我们运行了两个pod,尽管他们的label是一致的,那是因为我们从最上层就给他分开了,所以互不影响。
实际上不推荐此类方法哈,只是验证下结果,我们给他删除掉;
[root@node1 label]# kubectl delete -f label-deploy-web-demo.yaml -n dev[root@node1 label]# kubectl delete -f label-web-demo.yaml -n dev
标签的IN
什么叫标签的IN呢?其实就是标签的一种IN方法,{key: ceshi, operator: In, values: [dev, test]},可以判断某个pod是否具有某个标签,如果没有,就会执行失败,如下:
[root@node1 label]# vim label-web-demo.yaml#deployapiVersion: apps/v1kind: Deploymentmetadata: name: tomcat-demo namespace: devspec: selector: matchLabels: app: tomcat-demo matchExpressions: - {key: ceshi, operator: In, values: [dev, test]} replicas: 1 template: metadata: labels: app: tomcat-demo spec: containers: - name: tomcat-demo image: registry.cn-hangzhou.aliyuncs.com/liuyi01/tomcat:8.0.51-alpine ports: - containerPort: 8080 resources: requests: memory: 100Mi cpu: 100m limits: memory: 100Mi cpu: 200m---#serviceapiVersion: v1kind: Servicemetadata: name: tomcat-demospec: ports: - port: 80 protocol: TCP targetPort: 8080 selector: app: tomcat-demo---#ingressapiVersion: extensions/v1beta1kind: Ingressmetadata: name: tomcat-demospec: rules: - host: tomcat.yunweijia.com http: paths: - path: backend: serviceName: tomcat-demo servicePort: 80[root@node1 label]# [root@node1 label]# kubectl apply -f label-web-demo.yaml service/tomcat-demo createdWarning: extensions/v1beta1 Ingress is deprecated in v1.14+, unavailable in v1.22+; use networking.k8s.io/v1 Ingressingress.extensions/tomcat-demo createdThe Deployment "tomcat-demo" is invalid: spec.template.metadata.labels: Invalid value: map[string]string{"app":"tomcat-demo"}: `selector` does not match template `labels`[root@node1 label]#
从上面看报错了,因为我们这个yaml文件中下面的资源没有标签是ceshi,提示只有一个标签是{"app":"tomcat-demo"},我们新建个label,ceshi: test,再次apply一下看看呢,修改成如下信息:
[root@node1 label]# vim label-web-demo.yaml #deployapiVersion: apps/v1kind: Deploymentmetadata: name: tomcat-demospec: selector: matchLabels: app: tomcat-demo matchExpressions: - {key: ceshi, operator: In, values: [dev, test]} replicas: 1 template: metadata: labels: app: tomcat-demo ceshi: test spec: containers: - name: tomcat-demo image: registry.cn-hangzhou.aliyuncs.com/liuyi01/tomcat:8.0.51-alpine ports: - containerPort: 8080 resources: requests: memory: 100Mi cpu: 100m limits: memory: 100Mi cpu: 200m---#serviceapiVersion: v1kind: Servicemetadata: name: tomcat-demospec: ports: - port: 80 protocol: TCP targetPort: 8080 selector: app: tomcat-demo---#ingressapiVersion: extensions/v1beta1kind: Ingressmetadata: name: tomcat-demospec: rules: - host: tomcat.yunweijia.com http: paths: - path: backend: serviceName: tomcat-demo servicePort: 80[root@node1 label]# [root@node1 label]# kubectl apply -f label-web-demo.yaml deployment.apps/tomcat-demo createdservice/tomcat-demo unchangedingress.extensions/tomcat-demo configured[root@node1 label]#
为什么会有这样的配置呢?这样子是不是可以避免下面的pod乱掉,会强制规定他必须具有某个label呢。查询方式如下:
[root@node1 label]# kubectl get pod -l ceshi=testNAME READY STATUS RESTARTS AGEtomcat-demo-5cb65b749b-sxrzz 1/1 Running 1 20s[root@node1 label]# [root@node1 label]# kubectl get pod -l "ceshi in (dev, test)" -o wideNAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATEStomcat-demo-5cb65b749b-sxrzz 1/1 Running 5 4m27s 10.200.104.3 node2
节点标签
[root@node1 label]# kubectl apply -f label-web-demo.yaml [root@node1 label]# vim label-web-demo.yaml #deployapiVersion: apps/v1kind: Deploymentmetadata: name: tomcat-demo namespace: defaultspec: selector: matchLabels: app: tomcat-demo matchExpressions: - {key: ceshi, operator: In, values: [dev, test]} replicas: 1 template: metadata: labels: app: tomcat-demo ceshi: test spec: containers: - name: tomcat-demo image: registry.cn-hangzhou.aliyuncs.com/liuyi01/tomcat:8.0.51-alpine ports: - containerPort: 8080 resources: requests: memory: 100Mi cpu: 100m limits: memory: 100Mi cpu: 200m nodeSelector: ceshi2: yunweijia ---#serviceapiVersion: v1kind: Servicemetadata: name: tomcat-demospec: ports: - port: 80 protocol: TCP targetPort: 8080 selector: app: tomcat-demo---#ingressapiVersion: extensions/v1beta1kind: Ingressmetadata: name: tomcat-demospec: rules: - host: tomcat.yunweijia.com http: paths: - path: / backend: serviceName: tomcat-demo servicePort: 80[root@node1 label]# [root@node1 label]# kubectl get pod | grep tomcattomcat-demo-8668d869fb-swdsj 0/1 Pending 0 69s[root@node1 label]#
可以看到他是处于一个Pending的状态哈,说明没有找到合适的节点,那么我们给node节点打一个标签再看看呢。
[root@node1 label]# kubectl get nodesNAME STATUS ROLES AGE VERSIONnode2 Ready
至此,本文结束。
发表评论
暂时没有评论,来抢沙发吧~