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的区别

  1. 一个Pod可以包含多个container
  2. 一个容器可以暴露多个端口
    如果一个Pod只包含一个container,那么可以用如下命令进入该容器的命令行模式
    kubectl exec -ti <your-pod-name> -n <your-namespace> -- /bin/sh
    
    同时也可以直通过container-ID进入
    docker exec -ti <your-container-name> /bin/sh
    

查看namespace中有哪些endpoints

kubectl get endpoints -n <your-namespace>
  1. 并不是所有的endpoints都被prometheus监控
  2. 关于IP的问题
    1. 在prometheus中查看到kubernetes-service-endpoints(一个job)是10.1.0.135:9090

    2. 使用kubectl查询prometheus(svc)其Cluster-ip10.101.184.153,类型为NodePort

    3. 使用kubectl查询prometheus的endpoints为10.1.0.135:9090

    4. 使用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

    5. service不是一个pod

查看pod的Uid

kubectl get pod -n <namespace> <pod_name> -o jsonpath='{.metadata.uid}'

k8s容器的命名规则

k8s_{containerName}_{podFullName}_{namespace}_{podUID}_{podrestartCount}

k8s容器的命名规则

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

prometheus默认支持的exporters

A Deep Dive into Kubernetes Metrics

prometheus常用警告项(包含Node-level或container-level)

使用Node-exporter监控

Node_exporter的默认收集指标

A Deep Dive into Kubernetes Metrics — Part 1 The Node Metrics

PromQL常用计算公式

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

参考文章翻译版

K8S常用指标分析

Node-exporter常用指标示例

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命令

  1. 使用docker pull busybox拉取busybox镜像

  2. 下载官方的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
    
  3. 修改yaml配置文件中的namespace
    该pod中的/etc/resolv.conf文件与同一个namespace中的其他pod相同

  4. 通过k8s命令创建pod,kubectl create -f busybox.yaml

  5. 通过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.localCoreDNSkubernetes提供的域,如果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)    收藏  举报

导航