测试目标:pod crash
如何模拟:
因为pod crash状态表明容器已启动,但又遭遇异常退出。所以,我们只需要启动的容器中,没有守护进程或是守护进程执行后退出即可。
测试过程:
首先,选择一个没有守护进程的镜像,比如centos基础镜像。
创建deployment,让k8s,根据deployment,启动pod,pod中的容器,使用不带守护进程的镜像。具体的deployment如下:
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: test-crash
namespace : test
spec:
selector:
matchLabels:
business: monitoring
project: prometheus-jjj
template:
metadata:
labels:
business: monitoring
project: prometheus-jjj
spec:
containers:
- image: hub.mfwdev.com/base/centos:7.5.1804
imagePullPolicy: IfNotPresent
name: prometheus
nodeSelector:
size: large
restartPolicy: Always
|
操作过程:
// 创建deployement
kubectl apply -f test-crash.yaml
|
观察pod状态:
// 查看pod列表
kubectl get pod -n test
// 输出内容如下:
NAME READY STATUS RESTARTS AGE
test-crash-685757d55d-d9ckt 0/1 Completed 1 4s
// 这个pod,最开始变为 completed,表明容器以执行完成(因为没有守护进程,容器启动后,就会变为完成状态)
//再次观察pod
kubectl get pod -n test
// 输出内容如下:
NAME READY STATUS RESTARTS AGE
test-crash-685757d55d-d9ckt 0/1 CrashLoopBackOff 1 6s
// 此时,状态变为 CrashLoopBackOff,是因为k8s不允许pod销毁,会再次创建容器,如此往复,就是 pod crash 的过程。
|
观察Prometheus的告警状态:

图示,说明:
①:Prometheus中的 KubernetesPodCrash 栏,变为红色(也就是触发了告警)。
②:红色标记了 pod的名称,正是我们之前创建出来的pod名称。
③:由于pod触发Prometheus的告警rules,所以导致Prometheus发出告警,Prometheus告警表达式:
expr: changes(kube_pod_container_status_restarts_total{job!= "" }[3m]) > 0
|
综上,验证通过。
测试目标:pod 未运行
如何模拟:
因为pod 未运行状态表明可能是集群内所有的node都不满足该pod请求的所需资源,导致pod无法正确调度。所以,我们只需要使创建的容器不能正常调度到node节点上即可。
测试过程:
首先,在deployment描述文件中定义一个不存在的标签,比如largexxxx。
创建deployment,让k8s,根据deployment,启动pod,具体的deployment如下:
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: test-inactive
namespace : test
spec:
selector:
matchLabels:
business: monitoring
project: prometheus-jjj
template:
metadata:
labels:
business: monitoring
project: prometheus-jjj
spec:
containers:
- image: nginx
imagePullPolicy: IfNotPresent
name: prometheus
nodeSelector:
size: largexxxxx
restartPolicy: Always
|
操作过程:
//创建deployment
kubectl apply -f test-inactive.yaml
|
观察pod状态:
//查看pod列表
[root@node4 test]# kubectl get pods -n test
//输出内容如下:
NAME READY STATUS RESTARTS AGE
test-inactive-85c8b87497-lsjhd 0/1 Pending 0 23s
//pod处于Pending状态,是因为没有符合它所需要调度到带有largexxxxx标签的node节点,所以,它一直处于等待调度状态。
|
观察Prometheus的告警状态:


图示,说明:
①:Prometheus中的KubernetesPodNotRunning变为红色(已触发告警)。
②:图中标记pod名称,正是我们所创建的pod名称。
③:由于pod触发Prometheus的告警rules,所以导致Prometheus发出告警,Prometheus告警表达式:
expr: kube_pod_status_phase{phase!= "Failed" ,phase!= "Running" ,phase!= "Succeeded" }
== 1
|
综上,验证通过。
测试目标:pod ooM
如何模拟:
因为pod oom状态表明pod中容器的使用超出它本身限制的内存,导致内存不足,从而引发 oom(out of memory)现象。因此,我们只需给启动的容器分配一个超出它本身限制的内存大小即可。
首先,给容器分配一个超出pod内存限制的内存。如pod内存限制为100,分配250M的内存。
创建deployment,让k8s,根据deployment,启动pod,具体的deployment如下:
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
labels:
test-app: oom
name: testoom
namespace : test
spec:
replicas: 1
selector:
matchLabels:
test-app: oom
template:
metadata:
labels:
test-app: oom
spec:
containers:
- image: polinux/stress
imagePullPolicy: IfNotPresent
name: testoom
command: [ "stress" ]
args: [ "--vm" , "1" , "--vm-bytes" , "250M" , "--vm-hang" , "1" ]
resources:
limits:
memory: 100Mi
requests:
memory: 50Mi
dnsPolicy: ClusterFirst
nodeSelector:
size: large
restartPolicy: Always
|
操作过程:
//创建Deployment
kubectl apply -f test-oom.yaml
|
观察pod状态:
//查看pod列表
[root@node4 test]# kubectl get pods -n test
//输出内容如下
NAME READY STATUS RESTARTS AGE
testoom-6dd567f54c-v686c 0/1 CrashLoopBackOff 1 36s
//pod处于CrashLoopBackOff状态,是由于给容器分配250M的内存超过了100M的内存限制,导致内存不足,从而导致容器停止运行。
|
观察Prometheus告警:

图示,说明:
①:Prometheus中的KubernetesPodOOMKill变为红色(已触发告警)。
②:图中标记pod名称,正是我们所创建的pod名称。
③:由于pod触发Prometheus的告警rules,所以导致Prometheus发出告警,Prometheus告警表达式:
expr: changes(kube_pod_container_status_terminated_reason{reason= "OOMKilled" }[1m]) > 0
|
综上,验证通过。
测试目标:容器使用的磁盘
如何模拟:
当容器磁盘使用超过规定的时候,便会触发告警。因此,我们在Prometheus告警rules中添加一条磁盘使用的规则即可。
首先,我们在Prometheus rules中添加一条容器磁盘占用超过15G便触发告警的规则,具体规则如下:
- alert: K8SContainerDiakPressure
expr: (container_fs_usage_bytes{image!= "" }) > 16106127360
for : 1m
labels:
service: kubernetes
severity: warning
source: prometheus_dev
alert_type: container
microservice: bistag
operation: bistag
annotations:
summary: "K8S container `{{$labels.container_label_io_kubernetes_pod_namespace}}/{{$labels.kubernetes_container_name}}` 占用超过15GB"
description: "K8S container `{{$labels.container_label_io_kubernetes_pod_namespace}}/{{$labels.kubernetes_container_name}}` 在近1m内,占用超过15GB"
|
操作过程:
//添加规则后,再次创建Deployment,使规则生效
kubectl apply -f prometheus-rules.cm.yaml
|
观察Prometheus告警:


图示,说明:
①:Prometheus中的K8sContainerDiskPressure变为红色(已触发告警)。
②:图中标记,正是满足触发条件的容器磁盘的使用量。
③:由于pod触发Prometheus的告警rules,所以导致Prometheus发出告警,Prometheus告警表达式:
expr: (container_fs_usage_bytes{image!= "" }) > 1.610612736e+10
|
综上,验证通过。
所有评论(0)