Kubernetes应用

2019-07-26-Kubernetes应用

应用

1. 安装metrics-server 监控

1.1 介绍

metrics-server 是一个用于收集 Kubernetes 集群中节点和容器指标的组件。它通过 API 服务器提供节点和容器的指标数据,包括 CPU、内存、磁盘和网络使用情况。

1.2 安装步骤

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 下载
wget https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml -O metrics-server.yaml

# 加参数(kubeadm 集群必须加 --kubelet-insecure-tls)
sed -i '/- args:/a\ - --kubelet-insecure-tls' metrics-server.yaml

# 换国内镜像
sed -i 's#registry.k8s.io/metrics-server#docker.m.daocloud.io/rancher/mirrored-metrics-server#g' metrics-server.yaml

# 降低它自己的资源
sed -i 's#memory: 200Mi#memory: 80Mi#g' metrics-server.yaml

# 部署
kubectl apply -f metrics-server.yaml

# 等 1-2 分钟后用
kubectl top nodes
kubectl top pods -A --sort-by=memory

1.3 验证

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 1. 看整体内存
free -h
# available 应该 > 300M

# 2. 看 Pod 内存(需要先装 metrics-server)
kubectl top pods -A --sort-by=memory
# 所有 Pod 应该都在 limits 以下

# 3. 看组件状态
kubectl get pods -A
# 全部 Running,没有 CrashLoopBackOff

# 4. 模拟压力
kubectl create deployment stress --image=nginx:alpine
kubectl scale deployment stress --replicas=10
sleep 60
kubectl get pods
# 如果 master 没卡死、Pod 能正常调度到 worker,说明稳

# 清理
kubectl delete deployment stress

2. Prometheus + Grafana 完整教程

2.1 介绍

prometheus 是一个监控系统和时间序列数据库。它通过一个 HTTP API 接口暴露指标数据,支持通过一个查询语言(PromQL)来查询和处理指标数据。 它的架构包括一个主节点(Prometheus 服务器)和多个从节点(Prometheus 从节点)。主节点负责接收、存储和查询指标数据,从节点负责采集指标数据并将其发送到主节点。 它的架构允许在集群中部署多个从节点,以实现高可用和可扩展性。

grafana 是一个开源的监控和分析平台。它提供了一个用户友好的界面,用于可视化指标数据和创建自定义的监控仪表板。 它支持从多个数据源(包括 Prometheus)获取指标数据,并提供丰富的可视化图表和警报功能。 它的架构包括一个主节点(Grafana 服务器)和多个从节点(Grafana 从节点)。主节点负责接收、存储和查询指标数据,从节点负责将指标数据发送到主节点。 它的架构允许在集群中部署多个从节点,以实现高可用和可扩展性。

2.2 安装步骤

方案 特点 资源占用 推荐度
kube-prometheus-stack (Helm) 一套全家桶,含 Prometheus Operator、Grafana、各种 exporter、告警规则 1.5G+ ⭐⭐⭐(功能全但重)
单独装 Prometheus + Grafana 按需组合,轻量 500-800M ⭐⭐⭐⭐⭐(推荐使用,资源紧张)

2.2.1 前置步骤

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 1. 给 worker 节点打标签
kubectl label nodes node01 workload=apps --overwrite
kubectl label nodes node02 workload=apps --overwrite

# 验证
kubectl get nodes --show-labels | grep workload

# 2. 安装 Helm
curl -fsSL https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash

# 验证
helm version

# 3. 创建命名空间
kubectl create namespace monitoring

2.2.2 安装 kube-prometheus-stack

2.2.2.1 方案一: 安装 kube-prometheus-stack
1
helm install kube-prometheus-stack kube-prometheus-stack --namespace monitoring --create-namespace
2.2.2.2 方案二: 安装 Prometheus + Grafana
安装Prometheus
1
2
3
4
5
6
7
8
# 添加 Prometheus Helm 仓库
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update

# 安装 Prometheus
helm install prometheus prometheus-community/prometheus \
-f prometheus-values.yaml \
-n monitoring
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
# 模拟创建(语法+结构检查)
# yamllint prometheus-values.yaml
# kubectl apply --dry-run=client -f prometheus-values.yaml

cat > prometheus-values.yaml <<EOF
# ==========================================
# Prometheus Server
# ==========================================
server:
# 调度到 worker
nodeSelector:
workload: apps

# 资源限制(针对 2G worker)
resources:
requests:
memory: 256Mi
cpu: 100m
limits:
memory: 512Mi
cpu: 500m

# 数据保留时间(默认 15 天,缩短到 7 天省内存和磁盘)
retention: "7d"

# 持久化存储(如果没有 StorageClass 先用 emptyDir)
persistentVolume:
enabled: false # 学习环境,不用 PV 简单
# 想持久化改成 true,并指定 storageClass

# 对外暴露(NodePort 方便访问)
service:
type: NodePort
nodePort: 30090

# ==========================================
# Alertmanager(学习环境关掉省内存)
# ==========================================
alertmanager:
enabled: false

# ==========================================
# Pushgateway(用不到,关掉)
# ==========================================
prometheus-pushgateway:
enabled: false

# ==========================================
# Node Exporter(每个节点一个 DaemonSet,跑在所有节点监控机器)
# ==========================================
prometheus-node-exporter:
# node-exporter 必须在每个节点上,不能只跑 worker
# 它就是轻量级的,10M 内存
resources:
requests:
memory: 32Mi
cpu: 50m
limits:
memory: 64Mi
cpu: 100m

# ==========================================
# Kube-state-metrics(监控 k8s 对象状态)
# ==========================================
kube-state-metrics:
nodeSelector:
workload: apps
resources:
requests:
memory: 64Mi
cpu: 50m
limits:
memory: 128Mi
cpu: 200m

# ==========================================
# 配置文件 reload 工具
# ==========================================
configmapReload:
prometheus:
nodeSelector:
workload: apps
EOF
验证Prometheus
1
2
3
4
5
6
7
8
9
10
11
[root@master01 monitor]# kubectl get pods -n monitoring
NAME READY STATUS RESTARTS AGE
prometheus-kube-state-metrics-6d7d7d9b78-f6rl9 1/1 Running 0 2m40s
prometheus-prometheus-node-exporter-25knx 1/1 Running 0 21m
prometheus-prometheus-node-exporter-lmvpp 1/1 Running 0 21m
prometheus-prometheus-node-exporter-ndqqw 1/1 Running 0 21m
prometheus-server-59d754bf78-hbwk8 2/2 Running 0 21m

# 访问 Prometheus: http://任意节点IP:30090
# Status → Targets:看所有监控目标,都应该是 UP
# Graph → 试试查询 up,看有数据
安装 Grafana
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 添加 Grafana Helm 仓库
helm repo add grafana https://grafana.github.io/helm-charts
helm repo update

# 安装 Grafana
helm install grafana grafana/grafana \
-f grafana-values.yaml \
-n monitoring

# 直接手动下载 chart 并安装
helm pull grafana/grafana --version 10.5.15
helm install grafana ./grafana-10.5.15.tgz \
-f grafana-values.yaml
-n monitoring

# 查看 Grafana Pod 状态
kubectl get pods -n monitoring -l app.kubernetes.io/name=grafana

# 看密码(如果不是自己设的)
kubectl get secret grafana -n monitoring -o jsonpath='{.data.admin-password}' | base64 -d
echo

# 访问 Grafana: http://任意节点IP:30030
# 登录账号密码: admin/admin123
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
# 定义 Grafana 配置
cat > grafana-values.yaml <<'EOF'
# 调度到 worker
nodeSelector:
workload: apps

# 资源限制
resources:
requests:
memory: 150Mi
cpu: 50m
limits:
memory: 400Mi
cpu: 300m

# 持久化(学习环境不用)
persistence:
enabled: false

# 管理员密码(默认是随机的,设置成自己的)
adminPassword: admin123

# 对外暴露
service:
type: NodePort
nodePort: 30030

# 预配置 Prometheus 作为数据源
datasources:
datasources.yaml:
apiVersion: 1
datasources:
- name: Prometheus
type: prometheus
url: http://prometheus-server.monitoring.svc.cluster.local
access: proxy
isDefault: true

# 预装一些常用 Dashboard(从 grafana.com 导入)
dashboardProviders:
dashboardproviders.yaml:
apiVersion: 1
providers:
- name: 'default'
orgId: 1
folder: ''
type: file
disableDeletion: false
editable: true
options:
path: /var/lib/grafana/dashboards/default

dashboards:
default:
# Kubernetes 集群监控(ID: 7249)
k8s-cluster:
gnetId: 7249
revision: 1
datasource: Prometheus

# Node Exporter Full(ID: 1860)
node-exporter:
gnetId: 1860
revision: 37
datasource: Prometheus

# Kubernetes Pod(ID: 6417)
k8s-pods:
gnetId: 6417
revision: 1
datasource: Prometheus
EOF

2.3 问题解决

2.3.1 问题描述

镜像拉取失败

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 查看所有镜像拉取失败的 Pod
[root@master01 monitor]# kubectl get pods -n monitoring
NAME READY STATUS RESTARTS AGE
prometheus-kube-state-metrics-5579fcf48f-g7xss 0/1 ErrImagePull 0 17s
prometheus-kube-state-metrics-6856dd4f55-dnhld 0/1 ImagePullBackOff 0 16m

# 查 Deployment 里定义的镜像
kubectl get deploy -n monitoring prometheus-kube-state-metrics -o jsonpath='{.spec.template.spec.containers[0].image}'

# 查看镜像拉取失败的原因
[root@master01 monitor]# kubectl describe pod -n monitoring prometheus-kube-state-metrics-5579fcf48f-g7xss
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 11m default-scheduler Successfully assigned monitoring/prometheus-kube-state-metrics-6856dd4f55-dnhld to node02
Warning Failed 9m53s (x2 over 10m) kubelet Failed to pull image "registry.k8s.io/kube-state-metrics/kube-state-metrics:v2.18.0": failed to pull and unpack image "registry.k8s.io/kube-state-metrics/kube-state-metrics:v2.18.0": failed to resolve reference "registry.k8s.io/kube-state-metrics/kube-state-metrics:v2.18.0": failed to do request: Head "https://europe-west4-docker.pkg.dev/v2/k8s-artifacts-prod/images/kube-state-metrics/kube-state-metrics/manifests/v2.18.0": dial tcp 74.125.20.82:443: connect: connection refused

# [DaoCloud](https://github.com/DaoCloud/public-image-mirror) 提供的镜像加速服务
[root@master01 monitor]# kubectl set image deployment/prometheus-kube-state-metrics -n monitoring kube-state-metrics=k8s.m.daocloud.io/kube-state-metrics/kube-state-metrics:v2.18.0

3. 待续


Kubernetes应用
https://blog.nivago.xyz/posts/fcc6c73f.html
作者
anyu967
发布于
2019年7月26日
许可协议