目录
一、资源限制:
1. 资源限制的两种规范:
2. Pod 和 容器 的资源请求和限制:
3. CPU 资源单位:
4. 内存资源单位 :
5. 资源限制示例:
二、健康检查:探针(Probe)
1. 探针的三种规则:
2. 探针健康检查机制的优势:
3. Probe支持三种检查方法:
每次探测都将获得以下三种结果之一:
3. 探针探测参数:
4. 示例:
4.1 livenessProbe(exec):
4.2 livenessProbe(httpGet方式):
4.3 tcpSocket方式:
三、启动、退出动作:
当定义 Pod 时可以选择性地为每个容器设定所需要的资源数量。 最常见的可设定资源是 CPU 和内存大小,以及其他类型的资源。
如果给容器设置了内存的 limit 值,但未设置内存的 request 值,Kubernetes 会自动为其设置与内存 limit 相匹配的 request 值。 类似的,如果给容器设置了 CPU 的 limit 值但未设置 CPU 的 request 值,则 Kubernetes 自动为其设置 CPU 的 request 值 并使之与 CPU 的 limit 值匹配。
spec.containers[].resources.requests.cpu //定义创建容器时预分配的CPU资源
spec.containers[].resources.requests.memory //定义创建容器时预分配的内存资源
spec.containers[].resources.limits.cpu //定义 cpu 的资源上限
spec.containers[].resources.limits.memory //定义内存的资源上限
内存的 request 和 limit 以字节为单位。可以以整数表示,或者以10为底数的指数的单位(E、P、T、G、M、K)来表示, 或者以2为底数的指数的单位(Ei、Pi、Ti、Gi、Mi、Ki)来表示。
如:1KB=10^3=1000,1MB=10^6=1000000=1000KB,1GB=10^9=1000000000=1000MB
1KiB=2^10=1024,1MiB=2^20=1048576=1024KiB
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
run: nginx01
name: nginx01
spec:
containers:
- image: nginx
name: nginx01
ports:
- containerPort: 80
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
- name: db
image: mysql
env:
- name: MYSQL_ROOT_PASSWORD
value: "abc123"
resources:
requests:
memory: "512Mi"
cpu: "0.5"
limits:
memory: "1Gi"
cpu: "1"
kubectl describe pod nginx01 #查看pod资源
kubectl describe node node01 #查看node资源
特殊容器,资源限制不能太低,例如mysql 内存不能低于512,否则会报OOM
yaml文件配置中与image同
#注:以上规则可以同时定义。在readinessProbe检测成功之前,Pod的running状态是不会变成ready状态的。
总的来说,使用探针提供了更大的灵活性和控制,使你能够根据应用程序的需求和特性进行定制,从而提高容器的可靠性和性能。
apiVersion: v1
kind: Pod
metadata:
name: wzw01
spec:
containers:
- image: busybox
name: busybox01
ports:
- containerPort: 80
args:
- /bin/sh
- -c
- touch /tmp/test.txt; sleep 30; rm -rf /tmp/test.txt; sleep 60;
livenessProbe:
exec:
command:
- /bin/sh
- cat
- /tmp/test.txt
failureThreshold: 1 连续探测失败一次则下线容器
initialDelaySeconds: 5 第一次探测的开始时间
periodSeconds: 5 每次探测的间隔时间
apiVersion: v1
kind: Pod
metadata:
name: wzw02
spec:
containers:
- image: nginx
name: wzw-nginx
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
livenessProbe:
httpGet:
port: 80
path: /wzw.html #/index.html
failureThreshold: 2
initialDelaySeconds: 5
periodSeconds: 5
apiVersion: v1
kind: Pod
metadata:
name: wzw02
spec:
containers:
- image: nginx
name: wzw-nginx
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
readinessProbe:
tcpSocket:
port: 80
initialDelaySeconds: 5
periodSeconds: 5
livenessProbe:
tcpSocket:
port: 80
initialDelaySeconds: 20
periodSeconds: 5
这个例子同时使用 readinessProbe 和 livenessProbe 探测。kubelet 会在容器启动 5 秒后发送第一个 readinessProbe 探测。这会尝试连接 nginx 容器的 80 端口。如果探测成功,kubelet 将继续每隔 5 秒运行一次检测。除了 readinessProbe 探测,这个配置包括了一个 livenessProbe 探测。kubelet 会在容器启动 20 秒后进行第一次 livenessProbe 探测。就像 readinessProbe 探测一样,会尝试连接 nginx 容器的 80 端口。如果 livenessProbe 探测失败,这个容器会被重新启动。
readinessProbe探测失败,无法进入READY状态
apiVersion: v1
kind: Pod
metadata:
name: lifecycle-demo
spec:
containers:
- name: lifecycle-demo-container
image: soscscs/myapp:v1
lifecycle: #此为关键字段
postStart:
exec:
command: ["/bin/sh", "-c", "echo Hello from the postStart handler >> /var/log/nginx/message"]
preStop:
exec:
command: ["/bin/sh", "-c", "echo Hello from the poststop handler >> /var/log/nginx/message"]
volumeMounts:
- name: message-log
mountPath: /var/log/nginx/
readOnly: false
initContainers:
- name: init-myservice
image: soscscs/myapp:v1
command: ["/bin/sh", "-c", "echo 'Hello initContainers' >> /var/log/nginx/message"]
volumeMounts:
- name: message-log
mountPath: /var/log/nginx/
readOnly: false
volumes:
- name: message-log
hostPath:
path: /data/volumes/nginx/log/
type: DirectoryOrCreate
kubectl get pods -o wide #在node02节点
kubectl exec -it lifecycle-demo -- cat /var/log/nginx/message
##进入pod查看文件
cat /data/volumes/nginx/log/message
由上可知,init Container先执行,然后当一个主容器启动后,Kubernetes 将立即发送 postStart 事件。
kubectl delete pod lifecycle-demo
cat /data/volumes/nginx/log/message
由此可知,当在容器被终结之前, Kubernetes 将发送一个 preStop 事件。