k8s部署-35-k8s中的标签如何使用呢?一文带你了解

网友投稿 730 2022-11-05

本站部分文章、图片属于网络上可搜索到的公开信息,均用于学习和交流用途,不能代表睿象云的观点、立场或意见。我们接受网民的监督,如发现任何违法内容或侵犯了您的权益,请第一时间联系小编邮箱jiasou666@gmail.com 处理。

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]# [root@node1 label]# kubectl get pod -l "ceshi notin (dev, default)" -o wideNAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATESdeploy-springboot-5dbfc55f78-sfqck 1/1 Running 0 90m 10.200.104.6 node2 nginx-ds-q2pjt 1/1 Running 22 15d 10.200.135.32 node3 nginx-ds-zc5qt 1/1 Running 27 21d 10.200.104.2 node2 tomcat-demo-5cb65b749b-sxrzz         1/1     Running            5          4m43s   10.200.104.3    node2              [root@node1 label]#

节点标签

[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 22d v1.20.2node3 Ready 22d v1.20.2[root@node1 label]# [root@node1 label]# kubectl label node node3 ceshi2=yunweijianode/node3 labeled[root@node1 label]# kubectl get nodes --show-labelsNAME STATUS ROLES AGE VERSION LABELSnode2 Ready 22d v1.20.2 app=ingress,beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=node2,kubernetes.io/os=linuxnode3 Ready 22d v1.20.2 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,ceshi2=yunweijia,kubernetes.io/arch=amd64,kubernetes.io/hostname=node3,kubernetes.io/os=linux[root@node1 label]# kubectl get pod | grep tomcattomcat-demo-8668d869fb-swdsj 1/1 Running 0 3m34s[root@node1 label]# kubectl get pod -o wide| grep tomcattomcat-demo-8668d869fb-swdsj 1/1 Running 1 4m22s 10.200.135.40 node3 [root@node1 label]#

至此,本文结束。

上一篇:软件测试培训之关于测试工作的思考与启示
下一篇:软件测试培训之如何设计模块测试需求
相关文章

 发表评论

暂时没有评论,来抢沙发吧~