[DAY13]给pod上个识别-Label

虾米系Label

当大家都完成第一步往k8s部署,第二步就是要来好好管理这些container,k8s提供了一个简单又好记的东西,方便大家管理container,那就是label

没有透过label管理的pod长的像下图

图片来源
透过定义label的方式来管理pod就像下图

图片来源
使用label看起来是不是比较潮呢/images/emoticon/emoticon01.gif

label主要是对pod提供一个可识别的资料,而label是采用key-value的方式储存,在一个pod上面定义的label的key值是要唯一的喔,ex

#正确
"metadata": {
  "labels": {
    "key1" : "value1",
    "key2" : "value2"
  }
}
#错误
"metadata": {
  "labels": {
    "key" : "value1",
    "key" : "value2"
  }
}

Label有什麽限制

  • 少於63个字
  • 字母或是数字([a-z0-9A-Z])开始或结束
  • 合法的符号 -_.

Label selector

因为label的key值不是唯一值(同个pod底下是唯一值),所以多个pod可能会有相同的label,所以就可以使用selector把相同label的pod捞出来,如果有写过jquery的话,跟jquery selector 87分像的东西。
Label selector有二种类型

  • equality-based :可用 ===(都是同於)、!=(不等於)
  • set-based :可用innotinexists

动手写label

部署二个redis,一个是for前端用,一个是for後端用

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: my-redis-backend
  labels:
    app.kubernetes.io/name: my-redis
    env: dev
    user: backend
spec:
  serviceName: my-redis-backend
  replicas: 1
  selector:
    matchLabels:
       app.kubernetes.io/name: my-redis
  template:
    metadata:
      labels:
        app.kubernetes.io/name: my-redis
        env: dev
        user: backend
    spec:
      containers:
        - name: my-redis-backend
          image: "redis:latest"
          imagePullPolicy: IfNotPresent
          args: ["--appendonly", "yes", "--save", "600", "1"]
          ports:
            - name: redis
              containerPort: 6379
              protocol: TCP
          volumeMounts:
            - name: data
              mountPath: /data
          resources: {}

  volumeClaimTemplates:
      - metadata:
          name: data
        spec:
          accessModes: ["ReadWriteOnce"]
          resources:
            requests:
              storage: 1Gi
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: my-redis-frontend
  labels:
    app.kubernetes.io/name: my-redis
    env: dev
    user: frontend
spec:
  serviceName: my-redis-frontend
  replicas: 1
  selector:
    matchLabels:
       app.kubernetes.io/name: my-redis
  template:
    metadata:
      labels:
        app.kubernetes.io/name: my-redis
        env: dev
        user: frontend
    spec:
      containers:
        - name: my-redis-frontend
          image: "redis:latest"
          imagePullPolicy: IfNotPresent
          args: ["--appendonly", "yes", "--save", "600", "1"]
          ports:
            - name: redis
              containerPort: 6379
              protocol: TCP
          volumeMounts:
            - name: data
              mountPath: /data
          resources: {}

  volumeClaimTemplates:
      - metadata:
          name: data
        spec:
          accessModes: ["ReadWriteOnce"]
          resources:
            requests:
              storage: 1Gi

部署完成後来看一下pod的资料是否跟预期的一样

kubectl get pod --show-labels
NAME                                         READY   STATUS    RESTARTS   AGE     LABELS
dashboard-metrics-scraper-778b77d469-v85pw   1/1     Running   11         11d     k8s-app=dashboard-metrics-scraper,pod-template-hash=778b77d469
k0s-nginx-585449566-4nhvn                    1/1     Running   0          9h      app=nginx,pod-template-hash=585449566
kubernetes-dashboard-5cd89984f5-9vtsm        1/1     Running   11         11d     k8s-app=kubernetes-dashboard,pod-template-hash=5cd89984f5
my-redis-0                                   1/1     Running   0          3m23s   app.kubernetes.io/name=my-redis,controller-revision-hash=my-redis-55cc9bcb54,env=dev,statefulset.kubernetes.io/pod-name=my-redis-0,user=frontend
my-redis-backend-0                           1/1     Running   0          100s    app.kubernetes.io/name=my-redis,controller-revision-hash=my-redis-backend-8d4cc9789,env=dev,statefulset.kubernetes.io/pod-name=my-redis-backend-0,user=backend
my-redis-frontend-0                          1/1     Running   0          105s    app.kubernetes.io/name=my-redis,controller-revision-hash=my-redis-frontend-dfdc9dc7c,env=dev,statefulset.kubernetes.io/pod-name=my-redis-frontend-0,user=frontend

这时候就可以透过Label Selector进行查询

kubectl get pod -l env=dev                                              
NAME                  READY   STATUS    RESTARTS   AGE
my-redis-0            1/1     Running   0          4m11s
my-redis-backend-0    1/1     Running   0          2m28s
my-redis-frontend-0   1/1     Running   0          2m33s

除了在yaml里面宣告label外,也可以透过kubectl语法进行设定

#新增label
kubectl label pods my-redis-backend-0 iamrich=true  
pod/my-redis-backend-0 labeled

kubectl get pod -l iamrich=true
NAME                 READY   STATUS    RESTARTS   AGE
my-redis-backend-0   1/1     Running   0          5m23s
#删除label
kubectl label pods my-redis-backend-0 iamrich-
pod/my-redis-backend-0 labeled

kubectl get pod -l iamrich=true
No resources found in kubernetes-dashboard namespace.

以上大致上就是label的动手做罗/images/emoticon/emoticon01.gif


<<:  Day7 跟着官方文件学习Laravel-开始学习Command用法

>>:  Day6 Milestone怎麽立

JavaScript入门 Day17_阵列3

昨天讲了怎麽将阵列的东西叫出来,那今天讲要怎麽知道阵列里面有多少笔资料 其实用 length 就好了...

Day10_脑细胞死光光的一天…

└第九章、绩效评估 9.1监视、量测、分析与评估 • 监视>通常主管会盯啦,每周进度报告这样。...

Day-10 heap与heap sort

Heap Heap(堆积)是一个阵列,可以把它看作类似完全二元树(也就是按照顺序排放的树)。 p.s...

强型闯入DenoLand[34] - 浅谈跨来源资源共用(CORS)与解决办法

强型闯入DenoLand[34] - 浅谈跨来源资源共用(CORS)与解决办法 在谈完 Web A...

【Day 22】卷积神经网路(Convolutional Neural Network, CNN)(下)

昨天讲完Convolution,接着今天要介绍的就是Max Pooling。 CNN - Max P...