Pod资源管理(01)-标签以及Pod的生命周期

在一个pod中,通常只能有一个主容器,其它容器是为了辅助主容器得任务而设定的。

在同一个pod中,它们共享IPC\UTS\Network,因此各容器之间可以通过lo接口互相通信,各容器将共享同一个主机名,共享同一个IP地址,共享同一个网络名称空间。

在同一个pod中的容器可以共享挂载同一个存储卷。

 

Service如何识别哪些是后端得pod?Pod Controller如何识别哪些Pod是当前控制器得Pod?

标签和标签选择器

 

标签

标签就是“键值”类型得数据,它们可于资源创建时直接指定,也可随时按需添加于活动对象,而后即可由标签选择器进行匹配度检查从而完成资源挑选。

  • 一个对象可拥有不止一个标签,而同一个标签也可被添加至多个资源之上
  • 实践中,可以为资源附加多个不同维度得标签以实现灵活得资源分组管理功能,例如版本标签、环境标签、分层架构标签等,用于交叉标识同一个资源所属得不同版本、环境及架构层级等
  • 标签中得键名称通常由键前缀和键名组成,其中键前缀可选,其格式形如下“KEY_PREFIX/KEF_NAME”  前缀/键名

- 键名至多能使用63个字符,可使用字母、数字、连接号(-)、下划线(_)、点号(.)等字符,且只能以字母或数字开头

- 键前缀必须为DNS子域名格式,且不能超过253个字符。省略键前缀时,键将被视为用户得死有数据,不过由Kubernetes系统组件或第三方组件自动为用户资源添加得键必须使用键前缀,而"kubernetes.io/"前缀预留给kubernetes得核心组件使用

- 标签中的键值必须不能多余63个字符,它要么为空,要么是以字母或者数字开头及结尾,且中间仅使用了字母、数字、连接号(-)、下划线(_)或点号(.)等字符的数据

 

 

标签选择器(Label Selector)

  • 标签选择器用于表达标签的查询条件或选择标准,kubernetes API目前支持两个选择器:

- 基于等值关系(equality-based)操作符有=、==和!=三种,其中前两个意义相同,都表示“等值”关系,最后一个表示“不等”关系

- 基于集合关系(set-based)

    KEY in(VALUE1,VALUE2,...)

    KEY not in (VALUE1,VALUE2,...)

    KEY:所有存在此键名标签的资源;

    !KEY:所有不存在此键名标签的资源。

  •  使用标签选择器时还将遵循以下逻辑

- 同时指定的多个选择器之间的逻辑关系为“与”操作;

- 使用空值的标签选择器意味着每个资源对象都将被选中;

- 空的标签选择器将无法选出任何资源。

 

定义标签选择器的方式

  • kubernetes的诸多资源对象必须以标签选择器的方式关联到Pod资源对象,例如Service、Deployment和ReplicaSet类型的资源等,它们在Spect字段中嵌套使用嵌套的‘selector’字段,通过‘matchLabels’来指定标签选择器,有的甚至还支持使用“matchExpressions”构造复杂的标签选择机制。

- 定义标签选择器方式1 matchLabels:通过直接给定键对指定标签选择器;

- 定义标签选择器方式2 matchExpressions: 基于表达式指定的标签选择器列表,每个选择器形如“{key:KEY_NAME在,operator:OPERATOR,values:[VALUE1,VALUE2,...]}”,选择器列表间为“逻辑与”关系;

    使用In或NotIn操作符时,其values非必须为非空的字符串列表,而使用Exists或DostNotExist时,其values必须为空。

 

#显示pod之上的标签,默认是不显示的

[root@master basic]# kubectl get pods --show-labels
NAME                      READY   STATUS    RESTARTS   AGE     LABELS
mypod                     1/1     Running   0          22h     <none>
ng-dep-5fb7d74687-vfssn   1/1     Running   0          4d21h   app=ng-dep,pod-template-hash=5fb7d74687

 #定义标签

[root@master basic]# vim pod.demo-2.yaml

apiVersion: v1
kind: Pod
metadata:
  name: pod-demo-2
  namespace: prod
  labels:      #定义标签
    app: pod-demo
    rel: stable
spec:
  containers:
  - name: myapp
    image: ikubernetes/myapp:v1
  - name: bbox
    image: busybox:latest
    imagePullPolicy: IfNotPresent
    command: ["/bin/sh","-c","sleep 3600"]

[root@master basic]# kubectl apply -f pod.demo-2.yaml
pod/pod-demo-2 configured

[root@master basic]# kubectl get pods -n prod --show-labels  #查看标签
NAME         READY   STATUS    RESTARTS   AGE   LABELS
pod-demo-2   2/2     Running   23         23h   app=pod-demo,rel=stable

 注意:标签可以在创建资源时定义,也可以在创建之后修改它,当然前提是使用apply创建,如果使用create创建在create时会出错的

#给带标签的pod在加标签

[root@master basic]# kubectl get pods -n prod --show-labels   #先查看原有的标签
NAME         READY   STATUS    RESTARTS   AGE   LABELS
pod-demo-2   2/2     Running   23         23h   app=pod-demo,rel=stable
[root@master basic]# kubectl label pods pod-demo-2 -n prod tier=frontend    #给带标签的pod加标签
pod/pod-demo-2 labeled
[root@master basic]# kubectl get pods -n prod --show-labels    #查看pod的标签
NAME         READY   STATUS    RESTARTS   AGE   LABELS
pod-demo-2   2/2     Running   23         23h   app=pod-demo,rel=stable,tier=frontend      #可以发现这里多了一个tier=frontend标签

 

#覆盖标签

[root@master basic]# kubectl get pods -n prod --show-labels
NAME         READY   STATUS    RESTARTS   AGE   LABELS
pod-demo-2   2/2     Running   23         23h   app=pod-demo,rel=stable,tier=frontend
[root@master basic]# kubectl label pods pod-demo-2 -n prod --overwrite app=myapp
pod/pod-demo-2 labeled
[root@master basic]# kubectl get pods -n prod --show-labels
NAME         READY   STATUS    RESTARTS   AGE   LABELS
pod-demo-2   2/2     Running   23         23h   app=myapp,rel=stable,tier=frontend

#删掉标签

[root@master basic]# kubectl label pods pod-demo-2 -n prod rel-    #rel-表示删除rel的标签
pod/pod-demo-2 labeled
[root@master basic]# kubectl get pods -n prod --show-labels     #查看标签
NAME         READY   STATUS    RESTARTS   AGE   LABELS
pod-demo-2   2/2     Running   23         23h   app=myapp,tier=frontend

 

#指定标签选择器来显示

 [root@master basic]# kubectl get pods --show-labels
NAME                      READY   STATUS    RESTARTS   AGE     LABELS
mypod                     1/1     Running   0          22h     <none>
ng-dep-5fb7d74687-vfssn   1/1     Running   0          4d22h   app=ng-dep,pod-template-hash=5fb7d74687
[root@master basic]# kubectl get pods --show-labels -l app=ng-dep    #-l过滤app=ng-dep标签的pod
NAME                      READY   STATUS    RESTARTS   AGE     LABELS
ng-dep-5fb7d74687-vfssn   1/1     Running   0          4d22h   app=ng-dep,pod-template-hash=5fb7d74687

 #过滤!= app=ng-dep的pod

[root@master basic]# kubectl get pods --show-labels -l app!=ng-dep  
NAME    READY   STATUS    RESTARTS   AGE   LABELS
mypod   1/1     Running   0          23h   <none>

 #过滤app=myapp或者app=ng-dep的pod

[root@master basic]# kubectl get pods --show-labels -l "app in (myapp,ng-dep)"   
NAME                      READY   STATUS    RESTARTS   AGE     LABELS
ng-dep-5fb7d74687-vfssn   1/1     Running   0          4d22h   app=ng-dep,pod-template-hash=5fb7d74687

 #-L app是显示pod的APP的键的值是什么

[root@master basic]# kubectl get pods  -l "app in (myapp,ng-dep)" -L app  
NAME                      READY   STATUS    RESTARTS   AGE     APP
ng-dep-5fb7d74687-vfssn   1/1     Running   0          4d22h   ng-dep

#查看app键的pod,不管值是什么

[root@master basic]# kubectl get pods -l "app" --show-labels
NAME                      READY   STATUS    RESTARTS   AGE     LABELS
ng-dep-5fb7d74687-vfssn   1/1     Running   0          4d22h   app=ng-dep,pod-template-hash=5fb7d74687

#查看没有app键的pod,不管值是什么

[root@master basic]# kubectl get pods -l '!app' --show-labels

 

资源注解(annotation)

  • 注释也是“键值”类型的数据,不过它不能用于标签及挑选kubernetes对象,仅用于为资源提供“元数据”信息
  • 注释中的元数据不受字符数量的限制,它可大可小,可以为结构化或非结构化形式,也支持使用在标签中禁止使用的其它字符
  • 在kubernetes的新版本中(Alpha或Beta阶段)为某资源引入新字段时,常以注解方式提供以避免其增删等变动给用户带来困扰,一旦确定支持使用它们,这些新增字段再引入到资源中并淘汰相关的注解

 

#定义注解

[root@master basic]# vim pod.demo-2.yaml  

apiVersion: v1
kind: Pod
metadata:
  name: pod-demo-2
  namespace: prod
  labels:
    app: pod-demo
    rel: stable
  annotations:   #定义注解
    ik8s.io/project: hello
spec:
  containers:
  - name: myapp
    image: ikubernetes/myapp:v1
  - name: bbox
    image: busybox:latest
    imagePullPolicy: IfNotPresent
    command: ["/bin/sh","-c","sleep 3600"]

[root@master basic]# kubectl apply -f pod.demo-2.yaml
pod/pod-demo-2 configured

#查看Annotations

[root@master basic]# kubectl describe pods pod-demo-2 -n prod
Name:         pod-demo-2
Namespace:    prod
Priority:     0
Node:         node1/172.21.96.13
Start Time:   Mon, 09 Nov 2020 16:19:08 +0800
Labels:       app=pod-demo
              rel=stable
              tier=frontend
Annotations:  ik8s.io/project: hello
Status:       Running
IP:           10.244.1.4
IPs:
  IP:  10.244.1.4
Containers:
  myapp:
    Container ID:   docker://db986ffc0061cd365f428889630ccc47f6c18e9f6c35b790b52fed8f7b02e335
    Image:          ikubernetes/myapp:v1
    Image ID:       docker-pullable://ikubernetes/myapp@sha256:9c3dc30b5219788b2b8a4b065f548b922a34479577befb54b03330999d30d513
    Port:           <none>
    Host Port:      <none>
    State:          Running
      Started:      Mon, 09 Nov 2020 16:19:09 +0800
    Ready:          True
    Restart Count:  0
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-996cr (ro)
  bbox:
    Container ID:  docker://11488121eeeb0ab3d62950fa3e8cbcb1e51cce564e54dc12fff63bfd1c26e1a6
    Image:         busybox:latest
    Image ID:      docker-pullable://busybox@sha256:a9286defaba7b3a519d585ba0e37d0b2cbee74ebfe590960b0b1d6a5e97d1e1d
    Port:          <none>
    Host Port:     <none>
    Command:
      /bin/sh
      -c
      sleep 3600
    State:          Running
      Started:      Tue, 10 Nov 2020 16:19:37 +0800
    Last State:     Terminated
      Reason:       Completed
      Exit Code:    0
      Started:      Tue, 10 Nov 2020 15:19:36 +0800
      Finished:     Tue, 10 Nov 2020 16:19:36 +0800
    Ready:          True
    Restart Count:  24
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-996cr (ro)
Conditions:
  Type              Status
  Initialized       True
  Ready             True
  ContainersReady   True
  PodScheduled      True
Volumes:
  default-token-996cr:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  default-token-996cr
    Optional:    false
QoS Class:       BestEffort
Node-Selectors:  <none>
Tolerations:     node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
                 node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:
  Type    Reason   Age                 From     Message
  ----    ------   ----                ----     -------
  Normal  Created  30m (x25 over 24h)  kubelet  Created container bbox
  Normal  Started  30m (x25 over 24h)  kubelet  Started container bbox
  Normal  Pulled   30m (x24 over 23h)  kubelet  Container image "busybox:latest" already present on machine

 

Pod的生命周期

 

Pod的生命周期参考https://www.cnblogs.com/linuxk/p/9569618.html

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值