测试目标: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)