POD生命周期
POD生命周期
POD创建流程
生命周期
## init container
初始化容器是指,在主容器启动之前,我们可以让他做一些准备工作。
比如:
1.两个容器做了共享存储,那么我们可以让它先启动一个容器,来对目录进行更改用户和授权
2.容器需要连接数据可,那么可以让初始化容器检测数据库是否可以正常连接,如果可以再启动主容器
## hook
PostStart:在容器启动创建后,立即执行,但时间不能太长,否则容器不会是running状态
PreStop:在容器停止前,执行一些命令,主要用于优雅关闭程序
## liveness probe
存活探针,用于定义容器内,应用是否满足探针指定状态
## readiness probe
就绪探针,指定何时允许容器进入流量
POD针对应用封装
那么我们在工作中,一个pod究竟要放几个容器?
在实际工作中我们除了完成任务以外还需要考虑以后扩容的问题,就拿wordpress举例,有以下两种方案:
第一种:全部放一个pod里
那么如何扩容呢?如果第一种方案大家会发现没有办法很好的扩容,因为数据库和wordpress已经绑定成一个整体了,扩容wordpress就得扩容mysql。而第二种方案就要灵活的多。
初始化容器
## init container
初始化容器是指,在主容器启动之前,我们可以让他做一些准备工作。
比如:
1.两个容器做了共享存储,那么我们可以让它先启动一个容器,来对目录进行更改用户和授权
2.容器需要连接数据可,那么可以让初始化容器检测数据库是否可以正常连接,如果可以再启动主容器
apiVersion: v1
kind: Pod
metadata:
name: nginx-init
spec:
nodeName: node2
volumes:
- name: nginx-index # 变量名
emptyDir: {} # 找一个临时目录挂载,容器删除后也会删除
initContainers: # 初始化容器
- name: init
image: busybox
imagePullPolicy: IfNotPresent
args: [/bin/sh, -c, 'echo k8s >> /usr/share/nginx/html/index.html'] # 传参
args:
- /bin/sh
- -c
- 'echo k8s >> /usr/share/nginx/html/index.html'
volumeMounts:
- name: nginx-index
mountPath: "/usr/share/nginx/html"
containers:
- name: nginx
image: nginx:alpine
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
volumeMounts:
- name: nginx-index
mountPath: "/usr/share/nginx/html"
hook
postStart(启动钩子)
# 在容器启动创建后,立即执行,但时间不能太长,否则容器不会是running状态
apiVersion: v1
kind: Pod
metadata:
name: postStart
spec:
nodeName: node2
containers:
- name: nginx
image: nginx:alpine
lifecycle: # 钩子
postStart:
exec:
command: [/bin/sh, -c, 'echo k8s > /usr/share/nginx/html/index.html']
ports:
- containerPort: 80
preStop(停止钩子)
apiVersion: v1
kind: Pod
metadata:
name: prestop
spec:
volumes:
- name: nginxlog
hostPath:
path: /var/log/nginx/
containers:
- name: nginx
image: nginx:alpine
lifecycle:
postStart:
exec:
command: [/bin/sh, -c, 'echo postStart and preStop > /usr/share/nginx/html/index.html']
preStop:
exec:
command: [/bin/sh, -c, 'echo bye > /var/log/nginx/stop.log']
ports:
- containerPort: 80
volumeMounts:
- name: nginxlog
mountPath: /var/log/nginx/
存活探针
存活探针简单来说就是用来检测容器的应用程序是否还正常工作,如果应用程序不正常,即使容器还活着也没有意义了,所以这时候就可以使用存活探针来探测,如果应用程序不正常,就重启POD。
## 使用exec方法
apiVersion: v1
kind: Pod
metadata:
name: liveness-pod
spec:
nodeName: node2
volumes:
- name: nginx-html
hostPath:
path: /usr/share/nginx/html/
containers:
- name: liveness
image: nginx
imagePullPolicy: IfNotPresent
lifecycle:
postStart:
exec:
command: [/bin/sh, -c, 'echo k8s > /usr/share/nginx/html/index.html']
livenessProbe:
exec:
command:
- cat
- /usr/share/nginx/html/index.html
initialDelaySeconds: 3
periodSeconds: 1
volumeMounts:
- name: nginx-html
mountPath: /usr/share/nginx/html/
# 创建
[root@k8s-m01 ~]# kubectl apply -f liveness.yaml
# 自动修复,重启
[root@k8s-n01 html]# rm -f index.html
[root@k8s-n01 html]# ll
total 4
-rw-r--r-- 1 root root 9 Sep 14 01:00 index.html
## 使用getHttp方法
apiVersion: v1
kind: Pod
metadata:
name: liveness-pod
spec:
nodeName: node2
volumes:
- name: nginx-html
hostPath:
path: /usr/share/nginx/html/
containers:
- name: liveness
image: nginx
imagePullPolicy: IfNotPresent
lifecycle:
postStart:
exec:
command: [/bin/sh, -c, 'echo k8s > /usr/share/nginx/html/index.html']
livenessProbe:
#exec:
# command:
# - cat
# - /usr/share/nginx/html/index.html
httpGet:
path: /index.html
port: 80
initialDelaySeconds: 3
periodSeconds: 3
volumeMounts:
- name: nginx-html
mountPath: /usr/share/nginx/html/
### 参数解释
livenessProbe:
httpGet: #基于http请求探测
path: /index.html #请求地址,如果这个地址返回的状态码在200-400之间正常
port: 80 #请求的端口
initialDelaySeconds: 3 #第一次启动探测在容器启动后3秒开始
periodSeconds: 3 #容器启动后每隔3秒检查一次
# 检查不一致会退出,重启
就绪探针
有时候我们Pod本身已经起来了,但是pod的容器还没有完全准备好对外提供服务,那么这时候流量进来就会造成请求失败的情况出现,针对这种情况k8s有一种探针叫就绪探针,他的作用就是让k8s知道你的Pod内应用是否准备好为请求提供服务。只有就绪探针ok了才会把流量转发到pod上。
有时候,应用程序会暂时性的不能提供通信服务。 例如,应用程序在启动时可能需要加载很大的数据或配置文件,或是启动后要依赖等待外部服务。 在这种情况下,既不想杀死应用程序,也不想给它发送请求。 Kubernetes 提供了就绪探测器来发现并缓解这些情况。 容器所在 Pod 上报还未就绪的信息,并且不接受通过 Kubernetes Service 的流量。
apiVersion: v1
kind: Pod
metadata:
name: liveness-pod
spec:
containers:
- name: liveness-pod
image: nginx
lifecycle:
postStart:
exec:
command: ["/bin/sh", "-c", "echo ok > /usr/share/nginx/html/health.html"]
readinessProbe: ## 就绪探针
httpGet:
path: /actuator/health
port: 8080
initialDelaySeconds: 5
timeoutSeconds: 3
periodSeconds: 3
successThreshold: 3
failureThreshold: 3
livenessProbe:
httpGet:
path: /health.html
port: 80
initialDelaySeconds: 3
periodSeconds: 3
POD资源限制
在学习Docker的时候我们知道容器可以使用Linux系统的CGroup技术限制内存和CPU的使用率,那么POD里应该如何限制容器的CPU和内存资源呢?
apiVersion: v1
kind: Pod
metadata:
name: resource-demo
spec:
containers:
- name: resource-demo
image: nginx
ports:
- containerPort: 80
resources:
requests:
memory: 50Mi
cpu: 1500m
limits:
memory: 100Mi
cpu: 2000m
# 不接受nodeIP和classIP的流量,本地curlpodip可以的
参数解释:
requests :节点所需的最小计算资源量,k8s调度的时候的依据值
limits :限制允许的最大计算资源量,真正的资源限制参数
数值的转换:
1 CPU = 1000m
0.5 CPU = 500m
1 Mib = 1024 Kib
1 MB = 1000 KB
查看验证:
docker inspect 容器ID|grep CgroupParent
cd /sys/fs/cgroup/cpu/kubepods.slice/kubepods-burstable.slice/kubepods-burstable-podxxxx.slice
cat cpu.cfs_quota_us