Sock-Shop
监控
- Prometheus
- Grafana
数据展示工具 - Node-exporter
广义上讲所有可以向Prometheus提供监控样本数据的程序都可以被称为一个Exporter。而Exporter的一个实例称为target,如下所示,Prometheus通过轮询的方式定期从这些target中获取样本数据
安装
- 报错1
path / is mounted on / but it is not a shared or slave mount
解决办法
将microservices-demo\deploy\kubernetes\manifests-monitoring\25-prometheus-node-exporter-daemonset.yaml中的mountPropagation注释掉
- 报错2
无法拉取到k8s.gcrio/kube-state-metrics/kube-statemetrics:v2.1.0
解决办法
# 下载bitnami发布的镜像
docker pull bitnami/kube-state-metrics:2.1.0
# 将其拷贝一份,打上原始的tag,以便安装时能够获取到镜像
docker tag bitnami/kube-state-metrics:2.1.0 k8s.gcr.io/kube-state-metrics/kube-state-metrics:v2.1.0
# 删除bitnami的镜像
docker rmi bitnami/kube-state-metrics:2.1.0
关于Pod和container的区别
- 一个Pod可以包含多个container
- 一个容器可以暴露多个端口
如果一个Pod只包含一个container,那么可以用如下命令进入该容器的命令行模式
同时也可以直通过container-ID进入kubectl exec -ti <your-pod-name> -n <your-namespace> -- /bin/shdocker exec -ti <your-container-name> /bin/sh
查看namespace中有哪些endpoints
kubectl get endpoints -n <your-namespace>
- 并不是所有的endpoints都被prometheus监控
- 关于IP的问题
-
在prometheus中查看到
kubernetes-service-endpoints(一个job)是10.1.0.135:9090 -
使用kubectl查询
prometheus(svc)其Cluster-ip为10.101.184.153,类型为NodePort -
使用kubectl查询
prometheus的endpoints为10.1.0.135:9090 -
使用
kubectl describe svc prometheus -n monitoring查询结果如下Name: prometheus Namespace: monitoring Labels: name=prometheus Annotations: prometheus.io/scrape: true Selector: app=prometheus Type: NodePort IP Family Policy: SingleStack IP Families: IPv4 IP: 10.101.184.153 IPs: 10.101.184.153 LoadBalancer Ingress: localhost Port: prometheus 9090/TCP #其cluster ip,集群内部的访问端口 TargetPort: 9090/TCP #请求的终点,是pod ip上的端口 NodePort: prometheus 31090/TCP #提供给外部访问的端口 Endpoints: 10.1.0.135:9090 #其关联的Pod ip Session Affinity: None External Traffic Policy: Cluster Events: <none>可以看到,其中
10.1.0.135是与service prometheus关联的pod ip -
service不是一个pod
-
查看pod的Uid
kubectl get pod -n <namespace> <pod_name> -o jsonpath='{.metadata.uid}'
k8s容器的命名规则
k8s_{containerName}_{podFullName}_{namespace}_{podUID}_{podrestartCount}
k8s指标分类
- 核心资源指标(metrics-server内建API)
- 自定义指标(prometheus来采集,需要组件k8s-prometheus-adapter)
核心指标的获取
metrics-server: API server
- kubectl api-versions 中默认不包含 metrics.k8s.io
使用
kubectl api-versions查看api-versions
- 使用
kubectl top nodes获取信息 - 也可以使用
kubectl proxy --port=xxxx代理
curl http://localhost:xxxx/apis/metrics.k8s.io/v1beta1/ 接口来获取数据
自定义指标
- nodex_exporter来暴露node信息
- PromQL查询语句,不能直接被k8s直接解析,需要通过kube-state-metrics组件转k8s-promethues-adpater转为Custom Metrics API
kube-state-metrics
使用kube-state-metrics收集k8s集群内资源对象数据
prometheus
安装错误
node_exporter启动失败
Error: failed to start container "node-exporter": Error response from daemon: path / is mounted on / but it is not a shared or slave mount
查看文件夹是否是共享子树
findmnt /sys -o TARGET,PROPAGATION
将文件夹挂载成共享子树
# 其中的r代表递归
mount --make-rshared /sys
查看当前进程挂载信息
# 两者等价,self即为当前进程的pid
cat /proc/self/mountinfo
cat /proc/<pid>/mountinfo
A Deep Dive into Kubernetes Metrics
prometheus常用警告项(包含Node-level或container-level)
使用Node-exporter监控
A Deep Dive into Kubernetes Metrics — Part 1 The Node Metrics
CPU
| 指标名 | 用法 | 说明 |
|---|---|---|
| node_cpu_seconds_total | 系统开机以来CPU的使用时间之和 | |
| node_cpu_seconds_total[5m] | 最近5分钟CPU的使用时间之和(应为5分钟,采样时间在prometheus的configmap中的scarpe_interval进行设置,sock-shop中设置为15s) |
|
| increase(node_cpu_seconds_total{cpu="0",mode="idle"}[5m]) | cpu0在5分钟内的空闲时间,此时是用5分钟内以15秒为间隔的最后一个样本与第一个样本之差 | |
| sum(increase(node_cpu_seconds_total{cpu="0"}[5m])) | cpu0在5分钟内的运行时间就应该是5分钟 | |
| sum(increase(node_cpu_seconds_total[5m])) | 假设CPU是8线程的,那么8个CPU的5分钟运行时间为40分钟,共2400秒 | |
| (1-sum(increase(node_cpu_seconds_total{mode="idle"}[5m])) / sum(increase(node_cpu_seconds_total[5m])))*100 | CPU使用率 | |
| 100 - (avg(irate(node_cpu_seconds_total{mode="idle"}[5m])) by (instance) * 100) | CPU使用率缩写 | |
| irate函数 | avg(irate(node_cpu_seconds_total{mode="idle"}[30s])) | irate取的是最近两个样本之间的变化率,即15秒为间隔的最新两次采样的差值在所有mode之下的比 |
| avg(irate(node_cpu_seconds_total{mode="idle"}[60s])) | 在scrape_interva=15s的设置下 与上面完全一样 |
内存
| 指标名 | 说明 |
|---|---|
| node_memory_MemFree_bytes | |
| node_memory_Cached_bytes | |
| node_memory_Buffers_bytes | |
| node_memory_MemTotal_bytes | |
| (node_memory_MemFree_bytes+node_memory_Cached_bytes+node_memory_Buffers_bytes) / node_memory_MemTotal_bytes * 100 | 剩余空间率 |
| 100 - (node_memory_MemFree_bytes+node_memory_Cached_bytes+node_memory_Buffers_bytes) / node_memory_MemTotal_bytes * 100 | 内存空间使用率 |
磁盘
| 指标名 | 用法 | 说明 |
|---|---|---|
| node_disk_read_time_seconds_total | 自系统开机,磁盘的使用时间 | |
| rate(node_disk_read_time_seconds_total[2m]) | 最近2分钟,磁盘的使用时间,用首位值之差除以时间段 | |
| rate(node_disk_read_time_seconds_total[1m]) / rate(node_disk_reads_completed_total[1m]) | 最近1分钟,磁盘的平均访问延迟(每字节的访问时间) | |
使用cadvisor监控容器指标
A Deep Dive into Kubernetes Metrics — Part 3 Container Resource Metrics
CPU
利用率
对于CPU利用率,Kubernetes仅为我们提供了每个容器的三个指标
| 指标名 | 说明 |
|---|---|
| container_cpu_user_seconds_total | “用户”时间的总数(即不在内核中花费的时间) |
| container_cpu_system_seconds_total | “系统”时间的总数(即在内核中花费的时间) |
| container_cpu_usage_seconds_total | 以上总和 |
饱和度
假设已经对CPU设置了limit值,那么当容器超出limit时,Linux运行时将限制该容器,并在container_cpu_cfs_throttled_seconds_total指标中记录其被限制的时间
错误数
就像node_exporter一样,cAdvisor不会暴露CPU错误。
内存
cAdvisor中提供的内存指标是从node_exporter公开的43个内存指标的子集。以下是容器内存指标:
| 指标名 | 说明 |
|---|---|
| container_memory_cache | 页面缓存的字节数 |
| container_memory_rss | RSS的大小(以字节为单位) |
| container_memory_swap | 容器交换使用量(以字节为单位) |
| container_memory_usage_bytes | 当前内存使用情况(以字节为单位,包括所有内存,无论何时访问) |
| container_memory_max_usage_bytes | 以字节为单位记录的最大内存使用量 |
| container_memory_working_set_bytes | 当前工作集(以字节为单位) |
| container_memory_failcnt | 内存使用次数达到限制 |
| container_memory_failures_total | 内存分配失败的累计计数 |
文件说明
k8s的yaml说明 - 张占岭 - 博客园 (cnblogs.com)
04-prometheus-configmap.yaml
关于/etc/resolv.conf文件
busybox的使用
因为容器中的linux命令不全,例如没有nslookup命令
-
使用
docker pull busybox拉取busybox镜像 -
下载官方的busybox的yaml配置文件
# busybox.yaml apiVersion: v1 kind: Pod metadata: name: busybox namespace: default spec: containers: - name: busybox image: busybox:1.28 command: - sleep - "3600" imagePullPolicy: IfNotPresent restartPolicy: Always -
修改yaml配置文件中的namespace
该pod中的/etc/resolv.conf文件与同一个namespace中的其他pod相同 -
通过k8s命令创建pod,kubectl create -f busybox.yaml
-
通过
nslookup命令查询服务kubectl exec busybox -n monitoring -- nslookup kube-state-metrics结果如下
Server: 10.96.0.10 Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local Name: kube-state-metrics Address 1: 10.1.1.21 10-1-1-21.kube-state-metrics.monitoring.svc.cluster.local关于
Address的说明<服务名>.<命名空间>.<svc>.cluster.local
其中cluster.local是CoreDNS为kubernetes提供的域,如果nslookup能正常解析,CoreDNS即为正常工作状态
使用ping测试kube-state-metrics是否被正确解析kubectl exec busybox -n monitoring -- ping kube-state-metrics结果如下
PING kube-state-metrics (10.1.1.21): 56 data bytes 64 bytes from 10.1.1.21: seq=0 ttl=64 time=0.091 ms 64 bytes from 10.1.1.21: seq=1 ttl=64 time=0.050 ms
一些云原生的网站
云原生实验室 - Kubernetes|Docker|Istio|Envoy|Hugo|Golang|云原生 (fuckcloudnative.io)
部署
K8S单机在Ubuntu18.04上的部署
使用kubeadm初始化集群
# 注意其中的pod子网必须要和kube-flannel.yml中的一致
sudo kubeadm init --image-repository registry.aliyuncs.com/google_containers --kubernetes-version=v1.23.1 --pod-network-cidr=10.244.0.0/16
关于设置主机名
# 本质是修改/etc/hostname文件,但是只修改hostname文件不会生效
hostnamectl set-hostname <hostname>
Event描述
#当创建单机版的k8s时,这个时候 master 节点是默认不允许调度 pod 的,需要执行
Warning FailedScheduling 57s (x2 over 2m8s) default-scheduler 0/1 nodes are available: 1 node(s) had taint {node-role.kubernetes.io/master: }, that the pod didn't tolerate.
解决
# 命令将 master 标记为可调度.
kubectl taint nodes --all node-role.kubernetes.io/master-
使用kubeadm重置K8s
sudo kubeadm reset
systemctl stop kubelet
posted on 2022-01-05 23:09 ctrlplayer 阅读(567) 评论(0) 收藏 举报
浙公网安备 33010602011771号