目录
环境
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
4、通过prom查看指标
apiserver_request_duration_seconds_bucket
apiserver_request_total
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
在Kubernetes(K8s)中,Unmarshal
通常是指将JSON或YAML格式的数据转换为Go语言中的具体数据结构。Kubernetes API返回的数据通常是JSON格式,而Kubernetes的配置文件通常是YAML格式。Go语言的encoding/json
和gopkg.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的一半
2、kube-apiserver优化?
1)参数-解决gc慢
2)负载不均衡