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之上的标签,默认是不显示的
[[email protected] 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
#定义标签
[[email protected] 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"][[email protected] basic]# kubectl apply -f pod.demo-2.yaml
pod/pod-demo-2 configured[[email protected] 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在加标签
[[email protected] 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
[[email protected] basic]# kubectl label pods pod-demo-2 -n prod tier=frontend #给带标签的pod加标签
pod/pod-demo-2 labeled
[[email protected] 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标签
#覆盖标签
[[email protected] 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
[[email protected] basic]# kubectl label pods pod-demo-2 -n prod --overwrite app=myapp
pod/pod-demo-2 labeled
[[email protected] 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
#删掉标签
[[email protected] basic]# kubectl label pods pod-demo-2 -n prod rel- #rel-表示删除rel的标签
pod/pod-demo-2 labeled
[[email protected] 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
#指定标签选择器来显示
[[email protected] 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
[[email protected] 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
[[email protected] 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
[[email protected] 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的键的值是什么
[[email protected] 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,不管值是什么
[[email protected] 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,不管值是什么
[[email protected] basic]# kubectl get pods -l '!app' --show-labels
资源注解(annotation)
- 注释也是“键值”类型的数据,不过它不能用于标签及挑选kubernetes对象,仅用于为资源提供“元数据”信息
- 注释中的元数据不受字符数量的限制,它可大可小,可以为结构化或非结构化形式,也支持使用在标签中禁止使用的其它字符
- 在kubernetes的新版本中(Alpha或Beta阶段)为某资源引入新字段时,常以注解方式提供以避免其增删等变动给用户带来困扰,一旦确定支持使用它们,这些新增字段再引入到资源中并淘汰相关的注解
#定义注解
[[email protected] 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"][[email protected] basic]# kubectl apply -f pod.demo-2.yaml
pod/pod-demo-2 configured
#查看Annotations
[[email protected] 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/[email protected]: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://[email protected]: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