首页 > 其他分享 >client-go异常场景分析

client-go异常场景分析

时间:2024-01-16 23:24:54浏览次数:20  
标签:multi 场景 err 192.168 0.105 v1 client go

场景1:同步时连不上kube-apiserver

WaitForCacheSync一直阻塞,直到成功或者控制器停止。

W0115 13:01:55.329881   18339 reflector.go:535] pkg/mod/k8s.io/[email protected]/tools/cache/reflector.go:229: failed to list *v1.Node: Get "https://192.168.0.105:6443/api/v1/nodes?limit=500&resourceVersion=0": dial tcp 192.168.0.105:6443: connect: connection refused
E0115 13:01:55.329948   18339 reflector.go:147] pkg/mod/k8s.io/[email protected]/tools/cache/reflector.go:229: Failed to watch *v1.Node: failed to list *v1.Node: Get "https://192.168.0.105:6443/api/v1/nodes?limit=500&resourceVersion=0": dial tcp 192.168.0.105:6443: connect: connection refused
^CF0115 13:02:05.291665   18339 multi_config_multi_clientset.go:48] failed to wait for caches to sync

设置5s同步缓存的超时时间

timeout := 5 * time.Second
ctx, cancel := context.WithTimeout(context.Background(), timeout)
defer cancel()

curStopCh := make(chan struct{})
go func() {
	<-ctx.Done()
	close(curStopCh)
}()

klog.Infof("begin to wait cache sync")
if ok := cache.WaitForCacheSync(curStopCh, hasSynced); !ok {
	klog.Fatalf("failed to wait for caches to sync")
}
I0116 20:32:19.375547   19877 multi_config_multi_clientset.go:60] begin to wait cache sync
W0116 20:32:19.376501   19877 reflector.go:535] pkg/mod/k8s.io/[email protected]/tools/cache/reflector.go:229: failed to list *v1.Node: Get "https://192.168.0.105:6443/api/v1/nodes?limit=500&resourceVersion=0": dial tcp 192.168.0.105:6443: connect: connection refused
E0116 20:32:19.377906   19877 reflector.go:147] pkg/mod/k8s.io/[email protected]/tools/cache/reflector.go:229: Failed to watch *v1.Node: failed to list *v1.Node: Get "https://192.168.0.105:6443/api/v1/nodes?limit=500&resourceVersion=0": dial tcp 192.168.0.105:6443: connect: connection refused
W0116 20:32:20.664333   19877 reflector.go:535] pkg/mod/k8s.io/[email protected]/tools/cache/reflector.go:229: failed to list *v1.Node: Get "https://192.168.0.105:6443/api/v1/nodes?limit=500&resourceVersion=0": dial tcp 192.168.0.105:6443: connect: connection refused
E0116 20:32:20.664422   19877 reflector.go:147] pkg/mod/k8s.io/[email protected]/tools/cache/reflector.go:229: Failed to watch *v1.Node: failed to list *v1.Node: Get "https://192.168.0.105:6443/api/v1/nodes?limit=500&resourceVersion=0": dial tcp 192.168.0.105:6443: connect: connection refused
W0116 20:32:23.771688   19877 reflector.go:535] pkg/mod/k8s.io/[email protected]/tools/cache/reflector.go:229: failed to list *v1.Node: Get "https://192.168.0.105:6443/api/v1/nodes?limit=500&resourceVersion=0": dial tcp 192.168.0.105:6443: connect: connection refused
E0116 20:32:23.771743   19877 reflector.go:147] pkg/mod/k8s.io/[email protected]/tools/cache/reflector.go:229: Failed to watch *v1.Node: failed to list *v1.Node: Get "https://192.168.0.105:6443/api/v1/nodes?limit=500&resourceVersion=0": dial tcp 192.168.0.105:6443: connect: connection refused
F0116 20:32:24.375933   19877 multi_config_multi_clientset.go:62] failed to wait for caches to sync

场景2:shutdown后发送请求

在factory shutdown之后继续发送创建请求,可以成功,因为测试发现大概90s之后才断连。
即使超过90s断连之后,clientset继续发送请求时,依然可以建立连接,请求处理后再过90s断连。

func addListWatchCfgAndClient(stopCh chan struct{}) {
	cfg, err := clientcmd.BuildConfigFromFlags("", "/root/.kube/config")
	if err != nil {
		klog.Fatalf("Error building kubeconfig: %s", err.Error())
	}

	kubeClient, err := kubernetes.NewForConfig(cfg)
	if err != nil {
		klog.Fatalf("Error building kubernetes clientset: %s", err.Error())
	}

	informerFactory := informers.NewSharedInformerFactory(kubeClient, 0)
	hasSynced := informerFactory.Core().V1().Nodes().Informer().HasSynced
	informerFactory.Core().V1().Nodes().Lister()

	informerFactory.Start(stopCh)
	// defer informerFactory.Shutdown()

	klog.Infof("begin to wait cache sync")
	if ok := cache.WaitForCacheSync(stopCh, hasSynced); !ok {
		klog.Fatalf("failed to wait for caches to sync")
	}

	close(stopCh)
	informerFactory.Shutdown()

	ns := &core_v1.Namespace{
		ObjectMeta: metav1.ObjectMeta{
			Name: "test",
		},
	}
	if _, err := kubeClient.CoreV1().Namespaces().Create(context.Background(), ns, metav1.CreateOptions{}); err != nil {
		klog.Infof("create ns test failed, err is %v", err)
	} else {
		klog.Infof("create ns test success")
	}
}
I0116 13:16:22.873697   29268 multi_config_multi_clientset.go:49] begin to wait cache sync
I0116 13:16:22.978257   29268 multi_config_multi_clientset.go:65] create ns test success
func addListWatchCfgAndClient() {
	cfg, err := clientcmd.BuildConfigFromFlags("", "/root/.kube/config")
	if err != nil {
		klog.Fatalf("Error building kubeconfig: %s", err.Error())
	}

	kubeClient, err := kubernetes.NewForConfig(cfg)
	if err != nil {
		klog.Fatalf("Error building kubernetes clientset: %s", err.Error())
	}

	informerFactory := informers.NewSharedInformerFactory(kubeClient, 0)
	hasSynced := informerFactory.Core().V1().Nodes().Informer().HasSynced
	informerFactory.Core().V1().Nodes().Lister()

	newStopCh := make(chan struct{})
	informerFactory.Start(newStopCh)

	klog.Infof("begin to wait cache sync")
	if ok := cache.WaitForCacheSync(newStopCh, hasSynced); !ok {
		klog.Fatalf("failed to wait for caches to sync")
	}

	close(newStopCh)
	informerFactory.Shutdown()

	klog.Infof("shut down completed")

	time.Sleep(2 * time.Minute)
	klog.Infof("after 2 minutes")

	ns := &core_v1.Namespace{
		ObjectMeta: metav1.ObjectMeta{
			Name: "test",
		},
	}
	if _, err := kubeClient.CoreV1().Namespaces().Create(context.Background(), ns, metav1.CreateOptions{}); err != nil {
		klog.Infof("create ns test failed, err is %v", err)
	} else {
		klog.Infof("create ns test success")
	}
}
I0116 21:44:24.638815   66878 multi_config_multi_clientset.go:50] begin to wait cache sync
I0116 21:44:24.740917   66878 multi_config_multi_clientset.go:58] shut down completed
I0116 21:46:24.743508   66878 multi_config_multi_clientset.go:61] after 2 minutes
I0116 21:46:24.753175   66878 multi_config_multi_clientset.go:69] create ns test failed, err is namespaces "test" already exists

client-go和kube-apiserver建立连接后,每隔30s向kube-apiserver发送报文。

建立https连接90s后,client-go向kube-apiserver发送了keep-alive探测报文,之后通过RST报文来关闭tcp连接。

RST用于关闭异常连接,接收端收到RST包后,不需要发送ACK来确认。
例如,向不存在指定端口的地方发送请求,对端发RST,报错connection refused。

标签:multi,场景,err,192.168,0.105,v1,client,go
From: https://www.cnblogs.com/WJQ2017/p/17968836

相关文章

  • Go组合与继承
    转载:原文链接Golang是不支持继承的,因此我们在使用的时候往往使用组合。那么,组合与继承有什么区别呢?组合和继承都是面向对象编程中重要的概念。继承让一个类获得另一个类的属性和方法,形成层级关系,子类可以重用父类的功能。而组合则是将一个类的对象作为另一个类的成员变量,实现代码......
  • Google自研芯片首次交给台厂生产 | 百能云芯
    Google半导体战略有了新的走向,首次将其自家设计的手机系统单晶片(SoC)"Tensor"的测试订单委托给了台湾的京元电。这一举动打破了以往三星包揽晶圆代工与封测的模式,同时也为未来Google可能释出更多自家设计的人工智能(AI)芯片测试订单留下伏笔,象征着台湾在全球AI芯片供应链中的地位不断......
  • vscode报错Pylance client: couldn‘t create connection to server.解决
    问题描述:一打开vscode,右下角就弹报错,Pylanceclient:couldn’tcreateconnectiontoserver.,让我打开output,打开后似乎是在说连不上server因为连不上server,所以我的python代码没法解析,尝试重开vscode也没用问题解决:点开左侧的拓展,找到PythonExtensionPack,这就是解析python代......
  • argo-rollout使用--金丝雀结合ingress-nginx
    1.金丝雀发布流程,安装比例发布,又名灰度发布举例:共10pod第一批发布30%V1:10个PodV2:3个Pod第二批发布60%V1:10个PodV2:6个Pod第三批发布100%V1:10个PodV2:10个Pod第四批发布V2:10个Pod(active)V1:0个Pod 2.资源文件准备文......
  • 以 Golang 为例详解 AST 抽象语法树
    前言各位同行有没有想过一件事,一个程序文件,比如hello.go是如何被编译器理解的,平常在编写程序时,IDE又是如何提供代码提示的。在这奥妙无穷的背后,AST(AbstractSyntaxTree)抽象语法树功不可没,他站在每一行程序的身后,默默无闻的工作,为繁荣的互联网世界立下了汗马功劳。AST抽象......
  • Django 使用swagger自定义自动生成类
    完整代码:https://gitee.com/mom925/django-system之前写的Django配置swagger(https://www.cnblogs.com/moon3496694/p/17657283.html)其实更多还是自己手动的写代码去书写接口文档,我希望它能更加的自动化生成出接口文档,所以我需要自己重写一些函数。安装所需的包,注册app,注册路由参考......
  • Gorm常见映射关系查询实例
    一、概述本小节主要罗列一下常见的查询以及相应的代码示例1.假设你有一个轮播图表,请查询出轮播图中的所有记录2.获取后台管理用户列表,并把用户的角色信息也查询出来3.查询用户订单信息,要求:查询某用户买了某商品的订单信息。本例是查询用户购买的视频的详细的......
  • GOrm多对多(关联查询)
    一、概述现有两张表,一张表代表章节(chapter)、另外一张表代表集(episode)。一个章节中包含多集,一个集中有可能有视频也有可能没有视频,视频表(video)。表结构如下:1.章节表(chapter),ps:一个章节中包含了多集2.集表(episode),集中有视频3.视频表(video) 要求:查......
  • 安卓之图表库的应用场景、技术实现及其优劣分析
    一、引言在移动应用开发中,数据可视化对于提供直观信息、帮助用户理解数据至关重要。安卓平台上的图表库为开发者提供了一系列工具和组件,使他们能够轻松地创建各种类型的图表,如线型图、柱状图、蜡烛图、气泡图、饼状图、雷达图以及散点图等。本文将深入探讨安卓图表库的应用场景、技......
  • 安卓之图表库的应用场景、技术实现及其优劣分析
    一、引言在移动应用开发中,数据可视化对于提供直观信息、帮助用户理解数据至关重要。安卓平台上的图表库为开发者提供了一系列工具和组件,使他们能够轻松地创建各种类型的图表,如线型图、柱状图、蜡烛图、气泡图、饼状图、雷达图以及散点图等。本文将深入探讨安卓图表库的应用场......