环境

K8s:v1.18
OS:Kylin v10 (Tercel) 4.19.90-23.8.v2101
docker:19.3.15
CPU:kunpeng-920 16c64g

问题

节点NotReady,SystemOOM。

排查

1、kube-apiserver %CPU 146 正常,%MEM 高达70,,load average 400+,出现kswapd0进程。

2、k describe node 看到 SystemOOM

ContainerGCFailed - 容器垃圾数据收集失败。

SystemOOM - System OOM encountered, victim process: prometheus

journalctl --no-pager --unit kubelet | grep "sys oom"

docker stats --no-stream |grep -E 'kube-apiserver|prometheus'

https://cloud.tencent.com/developer/article/2289874

3、是否大量连接导致?

netstat -nat | grep -i "6443" | wc -l
ss -nat | grep -i "6443" | wc -l

如何解决“kube-apiserver 负载不均衡的问题”

Nginx四层代理

4、通过prom查看指标

apiserver_request_duration_seconds_bucket
apiserver_request_total

kube-apiserver组件监控指标及大盘使用说明

5、访问K8s API

kubectl proxy --disable-filter --address='0.0.0.0':& 

kubectl proxy 运行Kubectl的机器和kubernets apiserver之间的一个反向代理

curl 127.0.0.1:8001/metrics |grep apiserver_request_duration_seconds_bucket|more

curl 127.0.0.1:8001/metrics |grep apiserver_request_total|more

Add
kubectl proxy &
在这里插入图片描述
curl 127.0.0.1:8001/debug/pprof/heap?debug=1 |grep Heap
在这里插入图片描述

prometheus上也有这个指标

go_memstats_heap_sys_bytes - go_memstats_heap_released_bytes{ job=“kubernetes-apiservers”}

6、pprof 火焰图

go tool pprof -http=0.0.0.0:30065  127.0.0.1:8001/debug/pprof/profile?seconds=300

go tool pprof --http=0.0.0.0:30065 x.x.x.:8001/debug/pprof/heap

curl 127.0.0.1:8001/debug/pprof/profile?seconds=300 > api.profile

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

使用pprof对程序进行性能剖析

在Kubernetes(K8s)中,Unmarshal通常是指将JSON或YAML格式的数据转换为Go语言中的具体数据结构。Kubernetes API返回的数据通常是JSON格式,而Kubernetes的配置文件通常是YAML格式。Go语言的encoding/jsongopkg.in/yaml.v2(或类似的库)提供了将JSON或YAML字符串转换为Go数据结构的功能。

以下是使用Go语言进行JSON和YAML的Unmarshal操作的基本示例:

JSON Unmarshal示例:

package main

import (
    "encoding/json"
    "fmt"
    "log"
)

type MyObject struct {
    Name string `json:"name"`
    Age  int    `json:"age"`
}

func main() {
    jsonStr := `{"name": "John", "age": 30}`
    var obj MyObject

    err := json.Unmarshal([]byte(jsonStr), &obj)
    if err != nil {
        log.Fatal(err)
    }

    fmt.Printf("Name: %s, Age: %d\n", obj.Name, obj.Age)
}

YAML Unmarshal示例:

package main

import (
    "fmt"
    "log"
    "github.com/go-yaml/yaml"
)

type MyObject struct {
    Name string `yaml:"name"`
    Age  int    `yaml:"age"`
}

func main() {
    yamlStr := `name: John\nage: 30`
    var obj MyObject

    err := yaml.Unmarshal([]byte(yamlStr), &obj)
    if err != nil {
        log.Fatal(err)
    }

    fmt.Printf("Name: %s, Age: %d\n", obj.Name, obj.Age)
}

在Kubernetes的Go客户端中,当你需要处理Kubernetes API返回的数据或者配置文件时,你可能需要使用到Unmarshal。例如,当你从API获取到一个Pod的JSON数据并希望将其转换为Go中的Pod结构体时,你可以使用Unmarshal来实现。

请注意,你需要根据实际的数据结构来定义你的Go结构体,以便正确地映射JSON或YAML中的数据字段。

如果你有特定的Kubernetes相关的Unmarshal问题或者需要处理特定的Kubernetes资源,请提供更多的上下文,我会尽力提供帮助。

7、统计资源

@1

find / -name etcdctl        

alias ec="/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/16/fs/usr/local/bin/etcdctl --endpoints=https://127.0.0.1:2379 --cacert /etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/server.crt --key=/etc/kubernetes/pki/etcd/server.key"

@2

ps -ef | grep etcd

ls /proc/xx/root/usr/local/bin

cp /proc/xx/root/usr/local/bin/etcdctl /usr/bin/etcdctl

alias ec="etcdctl --endpoints=https://127.0.0.1:2379 --cacert /etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/server.crt --key=/etc/kubernetes/pki/etcd/server.key"
ec get /registry --prefix --keys-only | grep -v ^$ | awk -F '/'  '{ h[$3]++ } END {for (k in h) print h[k], k}' | sort -nr | head

解决方案

1、prometheus 配置GOMEMLIMIT参数,limit的一半

Go内存优化与垃圾收集

2、kube-apiserver优化?

1)参数-解决gc慢
2)负载不均衡

3、优化prom采集指标,降低采集频率

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐