kubernetes云原生纪元:初识标签(k8s)Label

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节点创建服务

  1. 首先必须在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
  1. 然后在配置文件增加

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
  1. 我们可以通过--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
  1. 查看pod 是否创建到对应的机器上
[root@master-001 ~]# kubectl get pods -n test -o wide

对pod理解到此结束。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zhangchengji1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值