下文基于kubernetes 1.5.2版本编写
lifecycle
概念
创建资源对象时,可以使用lifecycle来管理容器在运行前和关闭前的一些动作。
lifecycle有两种回调函数:
PostStart:容器创建成功后,运行前的任务,用于资源部署、环境准备等。
PreStop:在容器被终止前的任务,用于优雅关闭应用程序、通知其他系统等等。
例1、部署代码
以下示例中,定义了一个Pod,包含一个JAVA的web应用容器,其中设置了PostStart和PreStop回调函数。即在容器创建成功后,复制/sample.war到/app文件夹中。而在容器终止之前,发送HTTP请求到http://monitor.com:8080/waring,即向监控系统发送警告。
具体示例如下:
......
containers:
- image: sample:v2
name: war
lifecycle:
postStart:
exec:
command:
- “cp”
- “/sample.war”
- “/app”
prestop:
httpGet:
host: monitor.com
psth: /waring
port: 8080
scheme: HTTP
......
例2、优雅删除资源对象
当用户请求删除含有pod的资源对象时(如RC、deployment等),K8S为了让应用程序优雅关闭(即让应用程序完成正在处理的请求后,再关闭软件),K8S提供两种信息通知:
1)、默认:K8S通知node执行docker stop命令,docker会先向容器中PID为1的进程发送系统信号SIGTERM,然后等待容器中的应用程序终止执行,如果等待时间达到设定的超时时间,或者默认超时时间(30s),会继续发送SIGKILL的系统信号强行kill掉进程。
2)、使用pod生命周期(利用PreStop回调函数),它执行在发送终止信号之前。
默认情况下,所有的删除操作的优雅退出时间都在30秒以内。kubectl delete命令支持--grace-period=的选项,以运行用户来修改默认值。0表示删除立即执行,并且立即从API中删除pod这样一个新的pod会在同时被创建。在节点上,被设置了立即结束的的pod,仍然会给一个很短的优雅退出时间段,才会开始被强制杀死。
具体示例如下:
kind: Deployment
metadata:
name: nginx-demo
labels:
app: nginx-demo
spec:
replicas: 1
template:
metadata:
labels:
app: nginx-demo
spec:
containers:
- name: nginx-demo
image: centos:nginx
lifecycle:
preStop:
exec:
# nginx -s quit gracefully terminate while SIGTERM triggers a quick exit
command: ["/usr/local/nginx/sbin/nginx","-s","quit"]
ports:
- name: http
containerPort: 80
Init Container
概念
在K8S的POD中,有两类容器,一类是系统容器(POD Container),一类是用户容器(User Container),在用户容器中,现在又分成两类容器,一类是初始化容器(Init Container),一类是应用容器(App Container)。
Init Container就是做初始化工作的容器。可以有一个或多个,如果多个按照定义的顺序依次执行,只有所有的执行完后,主容器才启动。由于一个Pod里的存储卷是共享的,所以Init Container里产生的数据可以被主容器使用到。
Init Container可以在多种K8S资源里被使用到如Deployment、DaemonSet, StatefulSet、Job等,但都是在Pod启动时,在主容器启动前执行,做初始化工作。
应用场景
等待其它模块Ready
比如使用apache部署web服务,需要做一些准备工作(例如从git服务器上拉取代码、检查运行环境是否到位等),可以在运行Web服务的Pod里使用一个Init Container,去执行准备工作,完成后Init Container结束退出,然后启动正在的apache容器。
做初始化配置
比如集群里检测所有已经存在的成员节点,为主容器准备好集群的配置信息,这样主容器起来后就能用这个配置信息加入集群。
例子
cat << EOF > lykops-deploy-init-container.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: lykops-deploy-init-container
labels:
project: lykops
app: init-container
version: v1
annotations:
pod.beta.K8S.io/init-containers:
- name: apache-web,
image: web:apache,
command: ["sh", "httpd -t"]
spec:
replicas: 1
minReadySeconds: 30
selector:
matchLabels:
name: lykops-deploy-init-container
project: lykops
app: init-container
version: v1
template:
metadata:
labels:
name: lykops-deploy-init-container
project: lykops
app: init-container
version: v1
spec:
containers:
- name: webapache
image: web:apache
command: [ "sh", "/etc/run.sh" ]
ports:
- containerPort: 80
name: http
protocol: TCP
EOF
kubectl create -f lykops-deploy-init-container.yaml
应用程序健康检查
K8S的应用程序健康检查分为livenessProbe和readinessProbe,两者相似,但两者存在着一些区别。
livenessProbe在服务运行过程中检查应用程序是否运行正常,不正常将杀掉进程;而readness Probe是用于检测应用程序启动完成后是否准备好对外提供服务,不正常继续检测,直到返回成功为止。
livenessProbe
许多应用程序经过长时间运行,最终过渡到无法运行的状态,除了重启,无法恢复。通常情况下,K8S会发现应用程序已经终止,然后重启应用程序/pod。
有时应用程序可能因为某些原因(后端服务故障等)导致暂时无法对外提供服务,但应用软件没有终止,导致K8S无法隔离有故障的pod,调用者可能会访问到有故障的pod,导致业务不稳定。K8S提供livenessProbe来检测应用程序是否正常运行,并且对相应状况进行相应的补救措施。
readinessProbe
在没有配置readinessProbe的资源对象中,pod中的容器启动完成后,就认为pod中的应用程序可以对外提供服务,该pod就会加入相对应的service,对外提供服务。但有时一些应用程序启动后,需要较长时间的加载才能对外服务,如果这时对外提供服务,执行结果必然无法达到预期效果,影响用于体验。
比如使用tomcat的应用程序来说,并不是简单地说tomcat启动成功就可以对外提供服务的,还需要等待spring容器初始化,数据库连接连接上等等。对于spring boot应用,默认的actuator带有/health接口,可以用来进行启动成功的判断。
检测方式
exec-命令
在用户容器内执行一次命令,如果命令执行的退出码为0,则认为应用程序正常运行,其他任务应用程序运行不正常。
……
livenessProbe:
exec:
command:
- cat
- /home/laizy/test/hostpath/healthy
……
TCPSocketAction
将会尝试打开一个用户容器的Socket连接(就是IP地址:端口)。如果能够建立这条连接,则认为应用程序正常运行,否则认为应用程序运行不正常。
……
livenessProbe:
tcpSocket:
port: 8080
……
HTTPGetAcction
调用容器内Web应用的web hook,如果返回的HTTP状态码在200和399之间,则认为应用程序正常运行,否则认为应用程序运行不正常。每进行一次HTTP健康检查都会访问一次指定的URL。 …… httpGet: #通过httpget检查健康,返回200-399之间,则认为容器正常 path: / #URI地址 port: 80 #端口号 #host: 127.0.0.1 #主机地址 scheme: HTTP #支持的协议,http或者https httpHeaders:’’ #自定义请求的header ……
例子
cat << EOF > inessprobe.yaml
apiVersion: v1
kind: ReplicationController
metadata:
name: inessprobe
labels:
project: lykops
app: inessprobe
version: v1
spec:
replicas: 6
selector:
project: lykops
app: inessprobe
version: v1
name: inessprobe
template:
metadata:
labels:
project: lykops
app: inessprobe
version: v1
name: inessprobe
spec:
restartPolicy: Always
containers:
- name: inessprobe
image: web:apache
imagePullPolicy: Never
command: ['sh',"/etc/run.sh" ]
ports:
- containerPort: 80
name: httpd
protocol: TCP
readinessProbe:
httpGet:
path: /
port: 80
scheme: HTTP
initialDelaySeconds: 120
periodSeconds: 15
timeoutSeconds: 5
livenessProbe:
httpGet:
path: /
port: 80
scheme: HTTP
initialDelaySeconds: 180
timeoutSeconds: 5
periodSeconds: 15
EOF
cat << EOF > inessprobe-svc.yaml
apiVersion: v1
kind: Service
metadata:
name: inessprobe
labels:
project: lykops
app: inessprobe
version: v1
spec:
selector:
project: lykops
app: inessprobe
version: v1
ports:
- name: http
port: 80
protocol: TCP
EOF
kubectl create -f inessprobe-svc.yaml
kubectl create -f inessprobe.yaml
参数说明
initialDelaySeconds:容器启动后第一次执行探测是需要等待多少秒。
periodSeconds:执行探测的频率。默认是10秒,最小1秒。
timeoutSeconds:探测超时时间。默认1秒,最小1秒。
successThreshold:探测失败后,最少连续探测成功多少次才被认定为成功。默认是1。对于liveness必须是1。最小值是1。
failureThreshold:探测成功后,最少连续探测失败多少次才被认定为失败。默认是3。最小值是1。
相关推荐
它提供了一种声明式的方法来管理容器化应用的生命周期,确保服务的高可用性和可伸缩性。`kubernetes-client`是Kubernetes的核心组成部分之一,允许用户通过命令行与集群进行通信,执行各种操作,如创建、更新、查看...
4. **kubelet**:运行在每个Node上,是Kubernetes与主机系统之间的桥梁,它接收来自apiserver的指令,管理Pod及其中的容器生命周期,包括创建、启动、停止和监控容器。 在Linux环境中部署Kubernetes集群,通常会...
在工作节点上,kubelet是核心组件,它接收并执行API服务器的指令,管理Pod和容器的生命周期。同时,kube-proxy确保网络策略的执行,实现服务发现和负载均衡。每个节点都需要安装和配置这些二进制文件,并确保它们...
标题中的“kubernetes-server-linux-amd64.tar.gz”是一个针对Linux AMD64架构的...Kubernetes提供了一套强大的API和工具,允许用户通过声明式配置来管理容器化应用,从而实现高度自动化的应用程序生命周期管理。
无论是新手还是经验丰富的开发者,都能借助这个客户端轻松地实现容器化应用的生命周期管理,提高开发和运维效率。随着Kubernetes生态系统的发展,kubernetes-client也将持续更新,提供更多功能和优化,以满足日益...
1. Kubelet:管理Pod的生命周期,与API Server通信,确保Pods按要求运行。 2. Container Runtime Interface (CRI):支持多种容器运行时,如Docker、containerd等。 3. Kube-proxy:处理网络规则,实现服务发现和网络...
而kubelet则是运行在每个节点上的代理,负责与apiserver通信,管理Pod的生命周期。 其次,网络策略和网络插件在1.19.7中也得到了强化。网络策略允许用户定义Pod间的通信规则,增强了安全性。同时,支持多种网络插件...
- 在每个Worker节点上,启动`kubelet`,作为Kubernetes的代理,管理Pod的生命周期。 - 启动`kube-proxy`,实现Service的网络规则。 7. **加入Worker节点**:使用`kubeadm join`命令将Worker节点添加到集群。 8. ...
9. **Deployments, StatefulSets, DaemonSets**:这些是控制器,用于管理Pod的生命周期,确保应用的高可用性和一致性。 描述中的"kubernetes-server-linux-amd64.tar.gz"表明这个压缩包是Kubernetes服务器端的二...
Service为应用提供稳定的服务发现和负载均衡,Pod是K8s中的最小部署单元,包含一个或多个紧密关联的容器,Deployment则用于管理Pod的生命周期,保证应用的可用性和一致性。 3. **Kubernetes架构**: K8s架构由...
- **Pod状态与生命周期管理**:涵盖Pod的生命周期事件和管理策略,如Pod Hook、Preset、PDB(Pod中断预算)等。 ### 集群资源管理与调度 - **集群资源管理**:Node、Namespace、Label、Annotation等资源管理机制。 ...
Kubernetes 基于 Docker 容器技术,提供了一套强大的工具来管理分布式系统的生命周期,确保服务的高可用性和可伸缩性。 **2. Kubernetes Dashboard 的功能** - **资源管理**:用户可以通过 Dashboard 创建、更新、...
- **Deployment**:用于管理 Pod 的生命周期,确保指定数量的副本始终运行。 - **ReplicaSet**:保证一组相同 Pod 的副本数量,用于无状态应用。 - **StatefulSet**:处理有状态应用,提供持久化的存储和稳定的...
2. **核心原理**:深入解析Kubernetes的核心组件和工作流程,包括Pod的生命周期管理、复制控制器(ReplicaSet、Deployment)的作用、网络模型(如Pod间的通信机制、Service的实现)以及存储卷(Volume)的使用。...
- **Persistent Volume (PV)**:集群内的持久存储,具有独立生命周期。 - **Persistent Volume Claim (PVC)**:用户请求 Persistent Volume 的方式。 - **Ingress**:一组规则,允许外部流量到达集群中的服务。 - **...
了解了Pod和网络通信后,深入学习Kubernetes还包括掌握如何创建和管理Deployment(用于管理Pod的生命周期)、Service(定义Pod的服务接口)、Volume(为Pod提供持久化存储)、Ingress(定义外部访问应用的路由规则)...
在本次分析中,我们关注的是Kubernetes(k8s)中Pod生命周期管理相关的知识。Kubernetes是一个开源的容器编排系统,用于自动化部署、扩展和管理容器化应用程序。Pod是Kubernetes中的基本部署单位,而Pod的生命周期...