1.pod资源-spec.containers

- name:镜像运行起来之后叫容器,该字段为容器名

image:镜像名字

imagePullPolicy:表示从哪拉取镜像,

Always:不管本地有没有镜像,都要从仓库中下载镜像,也就是说,即使本地有镜像了,也不使用本地镜像,而是从仓库下载;

Never:从来不从仓库下载镜像,也就是说本地有镜像就用,没有就算了;

IfNotPresent:如果本地存在就直接使用,不存在才从仓库下载,默认的策略是:当镜像标签版本是latest,则策略是Always;其余都是IfNotPresent.

指定策略为ifNotPresent,即使image指定的版本是latest,每次启动容器,也不会从仓库重新下载镜像.

ports:指定暴露容器端口号,可以指定多个端口,如下:

spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1
ports:
- name: http
containerPort: 80
- name: https
containerPort: 443

在yaml中,docker field name和k8s field name的对应关系:

docker field    k8s field

ENTRYPOINT     command

CMD         args

args:相当于dockerfile里面的cmd
command:相当于docker里面的entrypoint
执行命令的优先级:
如果没有提供command和args,则用docker中的默认启动命令;
如果提供了command,则镜像中的CMD和ENTRYPOINT都不生效;
如果没有提供command,提供了args,则CMD没用了,将args当成参数传给ENTRYPOINT;
如果提供了command和args,则镜像中的CMD和ENTRYPOINT都不生效;

2.标签

一个标签可以对应多个资源,一个资源也可以有多个标签,它们是多对多的关系;一个资源拥有多个标签,可以实现不同维度的管理;标签是key=value格式的,key最大63个字符,只能是字母、数字、_、-、.五种类型的组合,只能以字母或数字开头结尾.

kubectl get pods --show-labels
# 用-l过滤标签中有app的pod
kubectl get pods -l app --show-labels
# 用-L显示pod中的标签哪些有app,哪些有run
kubectl get pods -L app,run
# 多加一个标签
kubectl label pods pod-demo release=haha
# 修改标签
kubectl label pods pod-demo release=stable --overwrite

3.标签选择器

等值关系:=、==、!=
kubectl get pods -l release=stable,app=myapp --show-labels
集合关系:KEY in (VALUE1,VALUE2….)、KEY notin (VALUE1,VALUE2….)、KEY、!KEY
kubectl get pods -l "release notin (stable,haha)" 许多资源支持内嵌字段定义其使用的标签选择器:
matchLabels:直接给定键值;
matchExpressions:基于给定的表达式来定义使用标签选择器,
{key:"KEY",operator:"OPERATOR",values:[VAL1,VAL2,...]} 常见操作符(operator):In、NotIn:values字段的值必须为非空列表;
Exists、NotExists:values字段的值必须为空列表. # nodes对象也有标签
kubectl get nodes --show-labels
# 给node1节点打个disktype=ssd的标签
kubectl label nodes k8s-node1 disktype=ssd
nodeSelector:节点选择器,可以指定pod运行在哪个节点上
nodeName:可以直接指定运行节点
在maniteste/pod-demo.yaml文件spec字段中添加这两行,即可改变pod的运行节点
spec:
...
nodeSelector:
disktype: ssd

4.annotations:资源注释

与label不同的地方在于,它不能用于挑选资源对象,仅用于为对象提供"元数据"
metadata:
name: pod-demo
namespace: default
labels:
app: myapp
tier: frontend
annotations:
mowang.com/create_by: "cluster admin"

5.Pod生命周期

在一个pod中,可以运行多个容器,但通常在一个pod里面运行一个容器,容器在创建之前,有多个初始化容器(init container)用来进行初始化环境,init container执行完,它就退出了,接下来是主容器(main container)开始启动,主容器启动时也要初始化主容器里面的环境,在主容器刚启动时,用户可以手动嵌入一个操作叫post start;在主容器结束前,也可以做一个收尾操作pre stop,用来在主容器结束前做一个清理.

Pod生命周期中的重要行为:初始化容器、容器探测

liveness probe--存活性探测:用于判定主容器是否处于存活状态;

readiness probe--就绪性探测:用于判定容器中的主进程是否准备就绪以及能否对外提供服务.

在post start后,先做存活性探测,再做就绪性探测,Pod的状态:Pending(挂起,没有匹配到可运行节点),Running,Failed,Success,Unknown.

创建pod的大致流程:

apiserver会将创建请求的目标状态保存到etcd,接着请求scheduler进行调度,将调度结果保存到etcd中,目标节点上的kubelet通过apiserver拿到用户提交的创建清单,根据清单在当前节点上创建并运行这个Pod,并将结果返回给apiserver,再把结果存到etcd中.

健康检查分三个层次:1.直接执行命令;2.向tcp连接请求;3.向http发get请求.

6.livenessProbe--存活状态探测

# 探针类型
kubectl explain pod.spec.containers.livenessProbe
exec <Object>
httpGet <Object>
tcpSocket <Object>
failureThreshold:表示探测失败次数,默认是3,探测3次失败,才认为是真失败了;
periodSeconds:周期间隔时长,默认10s探测一次;
timeoutSeconds:超时时间,表示发出探测,对方始终没有响应,需要等多久,默认等1s;
initialDelaySeconds:默认是容器一启动就开始探测,但是此时容器可能还没启动完,此时探测肯定是失败的,
所以initialDelaySeconds表示容器启动多长时间后才开始探测. ExecAction举例:
vim liveness-exec.yaml
apiVersion: v1
kind: Pod
metadata:
name: liveness-exec-pod
namespace: default
spec:
containers:
- name: liveness-exec-container
image: busybox:latest
imagePullPolicy: IfNotPresent
command: ["/bin/sh","-c","touch /tmp/healthy; sleep 30; rm -f /tmp/healthy; sleep 3600"]
livenessProbe:
exec:
command: ["test","-e","/tmp/healthy"]
initialDelaySeconds: 2
periodSeconds: 3
initialDelaySeconds:延迟几秒探测
periodSeconds:探测周期,多长时间探测一次
kubectl create -f liveness-exec.yaml
可以看到restart次数会随着时间增长 liveness-HTTPGetAction举例
vim liveness-httpGet.yaml
apiVersion: v1
kind: Pod
metadata:
name: liveness-httpget-pod
namespace: default
spec:
containers:
- name: liveness-httpget-container
image: ikubernetes/myapp:v1
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 80
livenessProbe:
httpGet:
port: http
path: /index.html
initialDelaySeconds: 1
periodSeconds: 3 kubectl create -f liveness-httpGet.yaml
kubectl exec -it liveness-httpget-pod -- /bin/sh
rm -rf /usr/share/nginx/html/index.html

当删除pod里面的index.html之后,liveness监测到文件被删除了,容器就会重启,容器会重新初始化,里面就会又生成index.html文件,所以只重启一次,restarts次数为1.

7.readlinessProbe--准备就绪型探针

readiness-HTTPGetAction举例

vim readiness-httget.yaml
apiVersion: v1
kind: Pod
metadata:
name: readiness-httpget-pod
namespace: default
spec:
containers:
kind: Pod
metadata:
name: readiness-httpget-pod
namespace: default
spec:
containers:
- name: readiness-httpget-container
image: ikubernetes/myapp:v1
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 80
readinessProbe:
httpGet:
port: http
path: /index.html
initialDelaySeconds: 1
periodSeconds: 3

进入容器删除index.html,ready变成0/1,但是status是runing的,说明nginx进程正常,但index.html丢失,则判定nginx没有就绪.

poststart示例

postStart:如果执行操作失败了,容器将被终止并且重启,而重启与否是由重启策略决定;

preStop:容器在终止前要立即执行的命令,等这些命令执行完了,容器才能终止.

vim poststart-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: poststart-pod
namespace: default
spec:
containers:
- name: busybox-httpd
image: busybox:latest
imagePullPolicy: IfNotPresent
lifecycle:
postStart:
exec:
command: ["/bin/sh","-c","echo Home_Page >> /tmp/index.html"]
#command: ['/bin/sh','-c','sleep 3600']
command: ["/bin/httpd"]
args: ["-f","-h /tmp"] # -f是前台,-h是家目录 容器启动后默认执行的命令,但容器启动不能依赖于postStart执行的结果
kubectl create -f poststart-pod.yaml

restartPolicy--容器的重启策略

一旦pod中的容器挂了,重启容器,有如下策略:

Always:表示容器挂了总是重启,这是默认策略,很耗费资源,所以Always是这么做的:

第一次挂了立即重启,如果再挂了就延时10s重启,第三次挂了就等20s重启...以此类推

OnFailures:状态是Failure时才重启,正常退出则不重启;

Never:表示容器挂了不予重启;

容器的终止策略

k8s会给容器30s的时间进行终止,如果30s后还没终止,就会强制终止.
kill -l
kill -15 pid SIGTERM
系统会发送一个SIGTERM的信号给对应的程序.当程序接收到该signal后,将会发生以下的事情:
a.程序立刻停止;
b.当程序释放相应资源后再停止;
c.程序可能仍然继续运行.
大部分程序接收到SIGTERM信号后,会先释放自己的资源,然后在停止.但是也有程序可以在接受到信号量后,
做一些其他的事情,并且这些事情是可以配置的.
如果程序正在等待IO,可能就不会立马做出相应,也就是说:SIGTERM多半是会被阻塞的、忽略的.
kill -9 pid 强行终止 SIGKILL

参考博客:http://blog.itpub.net/28916011/viewspace-2213957/

k8s-pod的生命周期的更多相关文章

  1. Kubernetes中资源清单与Pod的生命周期(二)

    一.资源清单 1,定义: 在k8s中一般使用yaml格式的文件来创建符合我们预期的资源,这样的yaml被称为资源清单. 使用资源清单创建Pod: kubectl apply -f nginx.yaml ...

  2. Pod 的生命周期

    上图展示了一个 Pod 的完整生命周期过程,其中包含 Init Container.Pod Hook.健康检查 三个主要部分,接下来我们就来分别介绍影响 Pod 生命周期的部分: 首先在介绍 Pod ...

  3. k8s 容器的生命周期钩子

    钩子有两个一个容器起之前定义一个动作PostStart,容器关闭之前定义一个动作PreStop 动作可以是一个命令或http请求 示例 spec: containers: - lifecycle: p ...

  4. k8s的Pod状态和生命周期管理

    Pod状态和生命周期管理   一.什么是Pod? 二.Pod中如何管理多个容器? 三.使用Pod 四.Pod的持久性和终止 五.Pause容器 六.init容器 七.Pod的生命周期 (1)Pod p ...

  5. k8s的pod生命周期

    pod的生命周期: 1.init container 2.main contianer (1) post start hook :容器启动后做什么操作(可以命令查看kubectl explain po ...

  6. Kubernetes学习之路(十一)之Pod状态和生命周期管理

    一.什么是Pod? Pod是kubernetes中你可以创建和部署的最小也是最简的单位.一个Pod代表着集群中运行的一个进程. Pod中封装着应用的容器(有的情况下是好几个容器),存储.独立的网络IP ...

  7. Pod——状态和生命周期管理及探针和资源限制

    一.什么是Podkubernetes中的一切都可以理解为是一种资源对象,pod,rc,service,都可以理解是 一种资源对象.pod的组成示意图如下,由一个叫”pause“的根容器,加上一个或多个 ...

  8. 容器编排系统之Pod生命周期、健康/就绪状态探测以及资源限制

    前文我们了解了在k8s上的资源标签.标签选择器以及资源注解相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/14141080.html:今天我们来聊下k8 ...

  9. pod生命周期

    Pod生命周期 我们一般将pod对象从创建至终这段时间范围成为pod的生命周期,它主要包含以下的过程: pod创建过程 运行初始化容器(init container)过程 运行主容器(main con ...

  10. Kubernetes1.3:POD生命周期管理

    转:http://blog.csdn.net/horsefoot/article/details/52324830 (一)  核心概念 Pod是kubernetes中的核心概念,kubernetes对 ...

随机推荐

  1. Python 建模步骤

    #%% #载入数据 .查看相关信息 import pandas as pd import numpy as np from sklearn.preprocessing import LabelEnco ...

  2. SQL语句小练习

    一.创建如下表结构(t_book) Id         主键   自增一 bookName   可变长 20 Price   小数 Author    可变长20 bookTypeId    图书类 ...

  3. 利用http录制jmeter脚本

    1.在WorkBench下新建HTTP(S) Test Script Recorder,默认端口号为8080,假如8080被占用,则使用其他端口号:且为了使录制保存到线程组里,也同时新建一个线程组Tr ...

  4. vss安装注意点

    一:装好IIS 二:win7用管理员权限打开 server configuration 才能打上勾 三:用计算机名,不要用 Ip地址

  5. Spring core resourc层结构体系及JDK与Spring对classpath中资源的获取方式及结果对比

    1. Spring core resourc层结构体系 1.1. Resource相关结构体系 1.2. ResourceLoader相关体系 2. JDK与Spring对classpath中资源的获 ...

  6. PDO 使用prepared statement 预处理LIMIT等非表字段参数

    由于一些驱动不支持原生的预处理语句,因此PDO可以完全模拟预处理.PDO的模拟预处理是默认打开的,即便MYSQL驱动本身支持预处理,在默认打开的状态下,PDO是不会用到MYSQL本身提供的预处理功能. ...

  7. Linux硬件资源管理与外设设备使用、系统运行机制及用户管理

    Linux硬件资源管理 PCI设备         显卡            $>>dmesg |grep -i vga[    0.000000] Console: colour VG ...

  8. C++之Effective STL学习笔记Item14

    使用reserve来避免不必要的重新分配! The reserve member function allows you to minimize the number ofreallocations ...

  9. Code Jam 2017 Round 1A Problem B. Ratatouille

    传送门 分析 首先把包(package)的克数 $Q_{ij}$ 转化成区间 $[\lceil Q_{ij}/(1.1 r_i )\rceil, \lfloor Q_{ij}/(0.9 r_i)\rf ...

  10. 两种KMP题+KMP模版整理

    最近稍微看了下KMP,不是很懂他们大神的A题姿势,但是模版总该还是要去学的. 其中next数组的求法有两处区别. 第一种:求主串中模式串的个数.HDU2087 剪花布条和HDU4847 Wow! Su ...