kube-apiserver内存占用过多 & go tool pprof 入门

环境

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

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/15174/root/usr/local/bin

cp /proc/15174/root/usr/local/bin /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采集指标,降低采集频率

  • 9
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果您在启动 kube-apiserver.service 时遇到 "Unit kube-apiserver.service not found" 错误,可能是因为服务单元文件未正确安装或未正确配置。 您可以尝试以下步骤来解决该问题: 1. 确认 Kubernetes 的二进制文件已正确安装并可用。您可以通过运行 `which kube-apiserver` 命令来检查 kube-apiserver 的安装路径。如果命令返回路径,则说明二进制文件已正确安装。 2. 检查 Kubernetes 的服务单元文件是否存在。服务单元文件通常位于 `/etc/systemd/system/` 目录下,以 `.service` 结尾。确保存在名为 `kube-apiserver.service` 的服务单元文件。如果文件不存在,您可能需要重新安装 Kubernetes 或手动创建服务单元文件。 3. 如果服务单元文件存在,请确保文件的权限设置正确。运行以下命令来更正权限: ``` sudo chmod 644 /etc/systemd/system/kube-apiserver.service ``` 4. 如果服务单元文件存在但配置有误,您可以尝试重新配置该文件。打开 `/etc/systemd/system/kube-apiserver.service` 文件,并确保其中的配置正确无误。您可以参考 Kubernetes 官方文档或其他可靠来源获取正确的配置信息。 5. 在进行任何更改后,运行以下命令重新加载 systemd 配置并启动 kube-apiserver 服务: ``` sudo systemctl daemon-reload sudo systemctl start kube-apiserver.service ``` 如果问题仍然存在,请提供更多详细信息,以便我能够更好地帮助您解决问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值