# K8s底层cgroup占用内存

在Kubernetes (K8s) 中, cgroup (Control Groups) 是 Linux 内核提供的一个机制,用于限制和分配系统资源,包括 CPU、内存、磁盘等。在这篇文章中,我将会教你如何在K8s环境中监控和管理cgroup占用的内存。

## 流程概述

下面是监控和管理K8s底层cgroup占用内存的整体流程:

| 步骤 | 描述 |
| ---- | ---- |
| 1 | 部署Prometheus Operator |
| 2 | 创建Prometheus监控资源 |
| 3 | 配置Prometheus监控规则 |
| 4 | 使用Grafana展示监控数据 |

## 具体步骤

### 步骤 1: 部署Prometheus Operator

首先,我们需要部署Prometheus Operator,它将负责在K8s集群中监控资源使用情况。

```yaml
# prometheus-operator.yaml

apiVersion: monitoring.coreos.com/v1
kind: PrometheusOperator
metadata:
name: prometheus-operator
namespace: monitoring
spec: {}
```

使用 `kubectl apply -f prometheus-operator.yaml` 命令来部署Prometheus Operator。

### 步骤 2: 创建Prometheus监控资源

接着,我们需要创建Prometheus监控资源,用于收集cgroup的内存使用数据。

```yaml
# prometheus.yaml

apiVersion: monitoring.coreos.com/v1
kind: Prometheus
metadata:
name: prometheus
namespace: monitoring
spec:
serviceMonitorSelector: {}
resources: {}
serviceAccountName: prometheus
ruleSelector: {}
```

使用 `kubectl apply -f prometheus.yaml` 命令来创建Prometheus监控资源。

### 步骤 3: 配置Prometheus监控规则

然后,我们需要配置Prometheus监控规则,来定义cgroup占用内存的监控指标。

```yaml
# prometheus-rules.yaml

apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
name: memory-usage
namespace: monitoring
spec:
groups:
- name: cgroup_memory_usage
rules:
- alert: HighMemoryUsage
expr: sum(container_memory_usage_bytes) by (node) / sum(container_memory_limit_bytes) by (node) * 100 > 80
for: 1m
labels:
severity: warning
annotations:
summary: "High memory usage on node"
```

使用 `kubectl apply -f prometheus-rules.yaml` 命令来配置Prometheus监控规则。

### 步骤 4: 使用Grafana展示监控数据

最后,我们可以使用Grafana来展示cgroup的内存使用情况。

```yaml
# grafana.yaml

apiVersion: v1
kind: ConfigMap
metadata:
name: grafana-dashboard-cm
namespace: monitoring
data:
grafana-dashboard.json: |
{
...
}
```

使用 `kubectl apply -f grafana.yaml` 命令来创建Grafana的配置。

## 总结

通过以上步骤,我们成功地在K8s环境中监控和管理了cgroup占用的内存。这个过程中,Prometheus负责收集监控数据,Grafana则负责展示这些数据,帮助我们更好地了解系统资源的使用情况。希望这篇文章可以帮助你更好地理解和实践K8s底层cgroup占用内存的相关内容。