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

综上,验证通过。

 

 

 

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐