kubectl源码分析之drain

Elasticsearch 报错 error At least one unigram is required but all tokens were ngrams 【代码】Elasticsearch 报错 error At least one unigram is required but all tokens were ngrams。 阅读详情

 欢迎关注我的公众号:

 目前刚开始写一个月,一共写了18篇原创文章,文章目录如下:

istio多集群探秘,部署了50次多集群后我得出的结论

istio多集群链路追踪,附实操视频

istio防故障利器,你知道几个,istio新手不要读,太难!

istio业务权限控制,原来可以这么玩

istio实现非侵入压缩,微服务之间如何实现压缩

不懂envoyfilter也敢说精通istio系列-http-rbac-不要只会用AuthorizationPolicy配置权限

不懂envoyfilter也敢说精通istio系列-02-http-corsFilter-不要只会vs

不懂envoyfilter也敢说精通istio系列-03-http-csrf filter-再也不用再代码里写csrf逻辑了

不懂envoyfilter也敢说精通istio系列http-jwt_authn-不要只会RequestAuthorization

不懂envoyfilter也敢说精通istio系列-05-fault-filter-故障注入不止是vs

不懂envoyfilter也敢说精通istio系列-06-http-match-配置路由不只是vs

不懂envoyfilter也敢说精通istio系列-07-负载均衡配置不止是dr

不懂envoyfilter也敢说精通istio系列-08-连接池和断路器

不懂envoyfilter也敢说精通istio系列-09-http-route filter

不懂envoyfilter也敢说精通istio系列-network filter-redis proxy

不懂envoyfilter也敢说精通istio系列-network filter-HttpConnectionManager

不懂envoyfilter也敢说精通istio系列-ratelimit-istio ratelimit完全手册

 

————————————————

加微信群请联系:

type DrainCmdOptions struct {//drain结构体
	PrintFlags *genericclioptions.PrintFlags
	ToPrinter  func(string) (printers.ResourcePrinterFunc, error)

	Namespace string

	drainer   *drain.Helper
	nodeInfos []*resource.Info

	genericclioptions.IOStreams
}
func NewDrainCmdOptions(f cmdutil.Factory, ioStreams genericclioptions.IOStreams) *DrainCmdOptions {
	o := &DrainCmdOptions{//初始化drain结构体
		PrintFlags: genericclioptions.NewPrintFlags("drained").WithTypeSetter(scheme.Scheme),
		IOStreams:  ioStreams,
		drainer: &drain.Helper{
			GracePeriodSeconds: -1,
			Out:                ioStreams.Out,
			ErrOut:             ioStreams.ErrOut,
		},
	}
	o.drainer.OnPodDeletedOrEvicted = o.onPodDeletedOrEvicted
	return o
}
//创建drain命令
func NewCmdDrain(f cmdutil.Factory, ioStreams genericclioptions.IOStreams) *cobra.Command {
	o := NewDrainCmdOptions(f, ioStreams)//初始化结构体

	cmd := &cobra.Command{//创建cobra命令
		Use:                   "drain NODE",
		DisableFlagsInUseLine: true,
		Short:                 i18n.T("Drain node in preparation for maintenance"),
		Long:                  drainLong,
		Example:               drainExample,
		Run: func(cmd *cobra.Command, args []string) {
			cmdutil.CheckErr(o.Complete(f, cmd, args))//准备
			cmdutil.CheckErr(o.RunDrain())//运行
		},
	}
	cmd.Flags().BoolVar(&o.drainer.Force, "force", o.drainer.Force, "Continue even if there are pods not managed by a ReplicationController, ReplicaSet, Job, DaemonSet or StatefulSet.")//force选项
	cmd.Flags().BoolVar(&o.drainer.IgnoreAllDaemonSets, "ignore-daemonsets", o.drainer.IgnoreAllDaemonSets, "Ignore DaemonSet-managed pods.")//ignore-daemonsets选项
	cmd.Flags().BoolVar(&o.drainer.DeleteLocalData, "delete-local-data", o.drainer.DeleteLocalData, "Continue even if there are pods using emptyDir (local data that will be deleted when the node is drained).")//delete-local-data选项
	cmd.Flags().IntVar(&o.drainer.GracePeriodSeconds, "grace-period", o.drainer.GracePeriodSeconds, "Period of time in seconds given to each pod to terminate gracefully. If negative, the default value specified in the pod will be used.")//grace-period选项
	cmd.Flags().DurationVar(&o.drainer.Timeout, "timeout", o.drainer.Timeout, "The length of time to wait before giving up, zero means infinite") //timeout选项
	cmd.Flags().StringVarP(&o.drainer.Selector, "selector", "l", o.drainer.Selector, "Selector (label query) to filter on")//selector选项
	cmd.Flags().StringVarP(&o.drainer.PodSelector, "pod-selector", "", o.drainer.PodSelector, "Label selector to filter pods on the node")//pod-selector选项

	cmdutil.AddDryRunFlag(cmd)//干跑选项
	return cmd
}
//准备方法
func (o *DrainCmdOptions) Complete(f cmdutil.Factory, cmd *cobra.Command, args []string) error {
	var err error

	if len(args) == 0 && !cmd.Flags().Changed("selector") {//args和selector不能同时不指定
		return cmdutil.UsageErrorf(cmd, fmt.Sprintf("USAGE: %s [flags]", cmd.Use))
	}
	if len(args) > 0 && len(o.drainer.Selector) > 0 {//args和selector不能同时指定
		return cmdutil.UsageErrorf(cmd, "error: cannot specify both a node name and a --selector option")
	}

	o.drainer.DryRun = cmdutil.GetDryRunFlag(cmd)//设置干跑

	if o.drainer.Client, err = f.KubernetesClientSet(); err != nil {//设置clientset
		return err
	}

	if len(o.drainer.PodSelector) > 0 {//如果指定了pod-selector,解析
		if _, err := labels.Parse(o.drainer.PodSelector); err != nil {
			return errors.New("--pod-selector=<pod_selector> must be a valid label selector")
		}
	}

	o.nodeInfos = []*resource.Info{}//构造Node info对象

	o.Namespace, _, err = f.ToRawKubeConfigLoader().Namespace()//设置namespace
	if err != nil {
		return err
	}

	o.ToPrinter = func(operation string) (printers.ResourcePrinterFunc, error) {//printflag转printer函数
		o.PrintFlags.NamePrintFlags.Operation = operation
		if o.drainer.DryRun {
			o.PrintFlags.Complete("%s (dry run)")
		}

		printer, err := o.PrintFlags.ToPrinter()
		if err != nil {
			return nil, err
		}

		return printer.PrintObj, nil
	}

	builder := f.NewBuilder().
		WithScheme(scheme.Scheme, scheme.Scheme.PrioritizedVersionsAllGroups()...).
		NamespaceParam(o.Namespace).DefaultNamespace().
		ResourceNames("nodes", args...).
		SingleResourceType().
		Flatten()//用builder构造result对象

	if len(o.drainer.Selector) > 0 {
		builder = builder.LabelSelectorParam(o.drainer.Selector).
			ResourceTypes("nodes")
	}

	r := builder.Do()//构造result对象

	if err = r.Err(); err != nil {
		return err
	}

	return r.Visit(func(info *resource.Info, err error) error {//visit result对象
		if err != nil {
			return err
		}
		if info.Mapping.Resource.GroupResource() != (schema.GroupResource{Group: "", Resource: "nodes"}) {//判断info为node
			return fmt.Errorf("error: expected resource of type node, got %q", info.Mapping.Resource)
		}

		o.nodeInfos = append(o.nodeInfos, info)//append info
		return nil
	})
}
//运行drain
func (o *DrainCmdOptions) RunDrain() error {
	if err := o.RunCordonOrUncordon(true); err != nil {//先执行cordon
		return err
	}

	printObj, err := o.ToPrinter("drained")//printflag转printer
	if err != nil {
		return err
	}

	drainedNodes := sets.NewString()//定义drainedNodes
	var fatal error

	for _, info := range o.nodeInfos {//遍历nodeinfo
		var err error
		if !o.drainer.DryRun {//如果非干跑
			err = o.deleteOrEvictPodsSimple(info)//删除或驱逐pod
		}
		if err == nil || o.drainer.DryRun {//如果是干跑或者错误为空,drainedNode添加
			drainedNodes.Insert(info.Name)
			printObj(info.Object, o.Out)//打印结果
		} else {// 如果非干跑
			fmt.Fprintf(o.ErrOut, "error: unable to drain node %q, aborting command...\n\n", info.Name)//打印错误
			remainingNodes := []string{}
			fatal = err
			for _, remainingInfo := range o.nodeInfos {//遍历Node info
				if drainedNodes.Has(remainingInfo.Name) {//如果drainedNodes包含info则跳过
					continue
				}
				remainingNodes = append(remainingNodes, remainingInfo.Name)//append没有drained的node
			}

			if len(remainingNodes) > 0 {//如果剩余的node大于0
				fmt.Fprintf(o.ErrOut, "There are pending nodes to be drained:\n")
				for _, nodeName := range remainingNodes {//打印提示
					fmt.Fprintf(o.ErrOut, " %s\n", nodeName)
				}
			}
			break
		}
	}

	return fatal
}
//删除或驱逐pod
func (o *DrainCmdOptions) deleteOrEvictPodsSimple(nodeInfo *resource.Info) error {
	list, errs := o.drainer.GetPodsForDeletion(nodeInfo.Name)//获取node下的需要删除的pod
	if errs != nil {
		return utilerrors.NewAggregate(errs)
	}
	if warnings := list.Warnings(); warnings != "" {//打印告警
		fmt.Fprintf(o.ErrOut, "WARNING: %s\n", warnings)
	}

	if err := o.drainer.DeleteOrEvictPods(list.Pods()); err != nil {//执行删除或驱逐pod
		pendingList, newErrs := o.drainer.GetPodsForDeletion(nodeInfo.Name)//获取没有被删除或驱逐的pod

		fmt.Fprintf(o.ErrOut, "There are pending pods in node %q when an error occurred: %v\n", nodeInfo.Name, err)//打印告警
		for _, pendingPod := range pendingList.Pods() {//打印pod pending
			fmt.Fprintf(o.ErrOut, "%s/%s\n", "pod", pendingPod.Name)
		}
		if newErrs != nil {
			fmt.Fprintf(o.ErrOut, "following errors also occurred:\n%s", utilerrors.NewAggregate(newErrs))
		}
		return err
	}
	return nil
}
//执行删除或驱逐pod
func (d *Helper) DeleteOrEvictPods(pods []corev1.Pod) error {
	if len(pods) == 0 {//pod为空返回
		return nil
	}

	policyGroupVersion, err := CheckEvictionSupport(d.Client)//判断是否支持evict
	if err != nil {
		return err
	}

	// TODO(justinsb): unnecessary?
	getPodFn := func(namespace, name string) (*corev1.Pod, error) {//获取pod的函数
		return d.Client.CoreV1().Pods(namespace).Get(name, metav1.GetOptions{})
	}

	if len(policyGroupVersion) > 0 {//如果支持驱逐
		return d.evictPods(pods, policyGroupVersion, getPodFn)//驱逐pod
	}

	return d.deletePods(pods, getPodFn)//删除pod
}
//驱逐pod
func (d *Helper) evictPods(pods []corev1.Pod, policyGroupVersion string, getPodFn func(namespace, name string) (*corev1.Pod, error)) error {
	returnCh := make(chan error, 1)//创建return channel

	for _, pod := range pods {//遍历pod
		go func(pod corev1.Pod, returnCh chan error) {//运行go routine
			for {
				fmt.Fprintf(d.Out, "evicting pod %q\n", pod.Name)//打印驱逐pod
				err := d.EvictPod(pod, policyGroupVersion)//执行驱逐pod
				if err == nil {//如果error为nil,跳出循环
					break
				} else if apierrors.IsNotFound(err) {
					returnCh <- nil//如果报没找到错误,往channel里放nil
					return
				} else if apierrors.IsTooManyRequests(err) {//如果错误是太多请求
					fmt.Fprintf(d.ErrOut, "error when evicting pod %q (will retry after 5s): %v\n", pod.Name, err)
					time.Sleep(5 * time.Second)//休息5秒
				} else {
					returnCh <- fmt.Errorf("error when evicting pod %q: %v", pod.Name, err)//往channel放一个错误
					return
				}
			}
			_, err := waitForDelete([]corev1.Pod{pod}, 1*time.Second, time.Duration(math.MaxInt64), true, getPodFn, d.OnPodDeletedOrEvicted)//等待pod删除完成
			if err == nil {//error为空,往channel放nil
				returnCh <- nil
			} else {//否则往channel放错误
				returnCh <- fmt.Errorf("error when waiting for pod %q terminating: %v", pod.Name, err)
			}
		}(pod, returnCh)//调用go routine
	}

	doneCount := 0//完成数量
	var errors []error

	// 0 timeout means infinite, we use MaxInt64 to represent it.
	var globalTimeout time.Duration//全局超时时间
	if d.Timeout == 0 {//如果没有指定超时,则为最大整数
		globalTimeout = time.Duration(math.MaxInt64)
	} else {//如果指定了超时,则指定超时时间
		globalTimeout = d.Timeout
	}
	globalTimeoutCh := time.After(globalTimeout)//超时channel
	numPods := len(pods)//需要evit的pod数量
	for doneCount < numPods {//如果完成数量不等于需要完成的数量,则一直循环
		select {
		case err := <-returnCh://从channel里获取值
			doneCount++//完成数量加1
			if err != nil {//如果有错误append错误
				errors = append(errors, err)
			}
		case <-globalTimeoutCh://如果超时,返回错误
			return fmt.Errorf("drain did not complete within %v", globalTimeout)
		}
	}
	return utilerrors.NewAggregate(errors)
}
//执行删除pod
func (d *Helper) deletePods(pods []corev1.Pod, getPodFn func(namespace, name string) (*corev1.Pod, error)) error {
	// 0 timeout means infinite, we use MaxInt64 to represent it.
	var globalTimeout time.Duration//设置超时时间
	if d.Timeout == 0 {
		globalTimeout = time.Duration(math.MaxInt64)
	} else {
		globalTimeout = d.Timeout
	}
	for _, pod := range pods {//遍历pod执行删除
		err := d.DeletePod(pod)
		if err != nil && !apierrors.IsNotFound(err) {
			return err
		}
	}
	_, err := waitForDelete(pods, 1*time.Second, globalTimeout, false, getPodFn, d.OnPodDeletedOrEvicted)//等待删除完成
	return err
}

k8s use-context是什么 kubectl的命令用于在 Kubernetes 集群中切换上下文(context),从而方便地在多个集群或命名空间之间进行操作。一个上下文定义了kubectl使用的和的组合。 阅读详情

相关推荐

Kubernetes Kubectl top 命令

kubectl top命令可显⽰节点和Pod对象的资源使⽤信息,它依赖于集群中的资源指标API来收集各项指标数据。它包含有node和pod两个⼦命令,可分别⽤于显⽰Node对象和Pod对象的相关资源占⽤率。,例如下⾯显⽰所有节点的资源占⽤状况的结果中显⽰了各节点累计CPU资源占⽤时长及百分⽐,以及内容空间占⽤量及占⽤⽐例。⽽名称空间级别的Pod对象资源占⽤率的使⽤⽅式会略有不同,使⽤时,⼀般应该限定名称空间及使⽤标签选择器过滤出⽬标Pod对象。列出Node资源占⽤率命令的语法格式为。

专注基础架构领域 2551

k8s实战之kubectl

本课程将详细介绍k8s所有命令,以及命令的go源码分析,学习知其然,知其所以然

SolidWorks参数化建模实战:从规则定义到智能装配

本文深入探讨SolidWorks参数化建模的实战技巧,从规则定义到智能装配的全流程。通过实际案例展示如何提升设计效率300%,确保一致性,并加速系列化开发。重点解析草图阶段植入设计意图、装配体级参数化及高级技巧,帮助工程师掌握三维建模的核心竞争力。

weixin_29306317的博客 419

helm源码分析之pull

发布一个k8s部署视频:https://edu.youkuaiyun.com/course/detail/26967 课程内容:各种k8s部署方式。包括minikube部署,kubeadm部署,kubeasz部署,rancher部署,k3s部署。包括开发测试环境部署k8s,和生产环境部署k8s。 腾讯课堂连接地址https://ke.qq.com/course/478827?taid=4373109931462251&tuin=ba64518 第二个视频发布https://edu.youkuaiyun.com/c..

mark's technic world 1370

2023-12-26~2025-07-04备份

一、海康视觉与汇川机器人 服务器-客户端通信设置IP在同一网段名称IP端口类型海康相机工控机7930服务器机器人3000客户端海康VM服务器设置1通信管理 增添TCP服务端,设置本机IP:192.168.0.20,端口号79302 协议解析 通信双方约定通信格式(设置收发数据格式,分隔符)机器人客户端设置(不同类型机器人设置有差别)1 通讯服务设置 设置连接服务器IP、服务端端口号、机器人端口号,确保连接正常2 协议解析 使用指令代码构建通讯解析。

青铜小码农 3132

英飞凌 AURIX Development Studio工程移植到Hightec的方法

1. 软件简介 AURIX™ Development Studio是英飞凌针对AURIX TC2XX/TC3XX系列单片机推出了一款免费的软件,集成了iLLD库,内置Tasking compiler和Tasking Debugger,但这两个模块只能用于非商业用途,可供学习和试用。iLLD库是英飞凌为TC2XX和TC3XX Tricore系列单片机提供的底层驱动库,有完善的使用手册,和较好的移植性。 Hightec是一款可以用来开发Aurix系列单片机的编译器,有免费版,可商用,集成GCC编译器,可用UDE

weixin_42967006的博客 7139

3.本地单机架构minikube

搭建minikube

weixin_47252600的博客 1148

天祥TX-1C单片机开发板-秒表程序

郭天祥TX-1C开发板实现秒表程序 附开发板图片和原理图 代码 #include <reg52.h> sbit key1=P3^4; //按键S2 sbit key2=P3^5; //按键S3 sbit U1=P2^6; //LED位选 sbit U2=P2^7; //LED片选 unsigned char code ledchar[]={ /...

Run_long_road 3515

通过 kubectl 查看 K8s 内节点、Pod 资源使用情况

kubectl describe node -n ${namespace} 例如:我要查看生产环境下所有节点的资源分配情况(生产环境的 namespace 为 product) kubectl describe node -n product

cab5的博客 8万+

利用setEcoMode优化innovus中的ecoAddRepeater批量操作效率

本文详细介绍了在Cadence Innovus工具中,如何利用setEcoMode命令的batchMode参数,显著提升ecoAddRepeater命令在批量插入buffer或inverter时的操作效率。通过合并重复的初始化和数据库更新开销,该模式可将大规模时序修复操作的执行速度提升数倍,并提供了完整的脚本示例与最佳实践,帮助后端设计工程师优化ECO流程。

mango的博客 515

Windows 环境下 OpenClaw 的安装与千问大模型配置

为了不占用 C 盘空间,重装系统也不丢失配置,本文详细记录了如何将 OpenClaw 安装在非系统盘,比如D 盘,并对接阿里云 通义千问大模型的全过程。主要是利用 NVM 和 npm 进行安装,方便后续一键升级,配置具有免费额度的Qwen API,这个只需要在阿里云百炼注册一个账号就能获得免费额度。

博客 6543

【Kubernetes】kubectl top pod 异常?

kubectl top pod 异常?本文手把手解决,跟着小涛一块试试吧~

http://DBAtao.cn/ 1万+

Altium Designer(AD24/25)导出DXF或DWG结构文件的方法

DXF(Drawing Exchange Format)和DWG(Drawing)是两种常见的CAD(计算机辅助设计)文件格式,常用于结构和硬件之间的沟通。本文介绍Altium Designer(AD24/25)导出DXF或DWG结构文件的方法。

fydar的博客 2345

centos 安装swoole问题

centos安装swoole

weixin_43946021的博客 722

【推荐100个unity插件】制作美丽 Unity 景观,增强Terrain材质表现的插件——GTS

GTS地形着色器是一款专为Unity设计的强大工具,可解决地形纹理绘制和光照处理的难题。它提供一键式配置,支持实时调整地形效果,包含细节注入、高度混合、雪注入等核心功能,并兼容网格地形和低多边形模型。插件完美集成Gaia天气系统,支持HDRP细分效果。安装后通过GTS管理器创建配置文件并应用到地形,即可快速生成高质量地形渲染。其模块化设计包含全局设置、网格转换和细节调整等面板,使开发者能灵活控制地形表现,显著提升视觉效果与性能表现。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 1568

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

分享kubectl的奇技淫巧

Kubectl 是 Kubernetes 最重要的命令行工具。在 Flant,我们会在 Wiki 和 Slack 上相互分享 Kubectl 的妙用(其实我们还有个搜索引擎,不过那就是另外一回事了)。多年以来,我们在 kubectl 方面积累了很多技巧,现在想要将其中的部分分享给社区。我相信很多读者对这些命令都非常熟悉;然而我还是希望读者能够从本文中有所获益,进而提高生产力。本文没什么结论,但是可以提供一个小列表,其中包含本文相关的有用链接。原文来自微信公众号《CNCF》

Vic的博客 1336

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

配置kubeconfig_kubectl use-context配置多集群访问

kubectl use-context配置多集群访问 今天在rancher平台上进行日常维护。在多个集群切换时,鼠标一顿点点点还是有点不够顺畅。于是在"瑞斯拜"的chrome里面找到了k8s有关多集群访问配置的桥段,下面根据实践过程做简单描述使用 kubeconfig 文件组织集群访问 通过 kubectl 连接k8s集群时,默认情况下,kubectl 会在 $HOME/.kube 目录下查找名为...

weixin_34883093的博客 3522

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

kubernetes对象

定义kubernetes对象 创建 Kubernetes 对象时,必须提供对象的规约,用来描述该对象的期望状态, 以及关于对象的一些基本信息(例如名称)。 当使用 Kubernetes API 创建对象时(或者直接创建,或者基于kubectl), API 请求必须在请求体中包含 JSON 格式的信息。 大多数情况下,需要在 .yaml 文件中为 kubectl 提供这些信息。 kubectl 在发起 API 请求时,将这些信息转换成 JSON 格式。 这里有一个 .yaml 示例文件,展...

whz-emm的博客 1182

k8s学习: kubeconfig文件详解

kubeconfig的一个示例如下:该示例为2个集群 apiVersion 和 kind 标识客户端解析器的版本和模式,不应手动编辑。preferences 指定当前可选(和当前未使用)的 kubectl 首选项cluster中包含k8s集群的端点数据,包括集群的证书颁发机构以及完整的URL。可以使用Kubectl config set-cluster添加或修改cluster条目。 可以使用 kubectl config set-cluster 添加或修改 cluster 条目,多个集群的话直接在后

Jerry00713的博客 1万+

k8s的api-resources资源类型介绍

1.在k8s集群环境中查看资源集群状态 输入命令 =》#kubectl api-resources显示k8s集群中的所有api资源信息,参数说明: NAME :api资源名称; SHORTNAMES :api资源名称简写; APIGROUP :api分组管理; NAMESPACED :是否可使用命名空间隔离,true是,false否; KIND :api 资源类型; 查看k8s组件集群状态 =》# kubectl get cs =》出现【kubeadm安装k8s 组件cont...

ChaITSimpleLove的博客 4961

揭秘高效运维:如何用kubectl top命令实时监控K8s资源使用情况?

是Kubernetes内置自动缩放管道的可扩展、高效的容器资源指标来源。从Kubelets收集资源指标,并通过在中公开它们,以供和使用。也可以通过访问,从而更容易调试自动缩放管道。

didiplus 3418

config kubectl_kubectl config 命令使用说明

kubectl config 命令用来管理kubeconfig文件。一、查找要操作的kubeconfig 文件顺序1、如果使用--kubeconfig选项,则指定的文件为要操作的文件。此选项只能被设置一次,并且不会合并其他文件。2、如果设置了$KUBECONFIG环境变量,将同时使用此环境变量指定的所有文件列表(使用操作系统默认的顺序),所有文件将被合并。当修改一个值时,将修改设置了该值的文件。当...

weixin_33328213的博客 4594

k8s系列之:kubectl子命令详解二

K8s命令行详解二1)Top2)cordon3)uncordon4)drain5)taint 1)Top 显示资源(CPU、内存、存储)的使用情况。top命令用于查看节点或Pod的资源消耗。此命令需要Heapster正确配置并在服务器上正常工作。 Node #显示所有节点 kubectl top node #显示指定节点 kubectl top node <NODE_NAME> pod 显示指定pod的信息 #显示默认命名空间中所有pod的资源使用状态 kubectl top pod #显示

zhengzaifeidelushang的博客 2701

Kubectl常用命令详解

Kubectl常用命令详解

mojolang 3579

云服务器部署k8s集群

在两台不同厂商的云服务器上部署k8s集群,遇到一些问题。在此进行下总结。首先要网络能够互通,我是通过添加虚拟网卡的方式lsmod | grep ip_vs #检查是否有开启#临时开启ip_vsdo echo $i;done#永久开启确认内核是否有tun模块如果找不到[nux-misc]enabled=0gpgcheck=1tap0 是虚拟网卡名字172.168.1.1 是ip地址查看然后建立虚拟IP,如果有节点不是公网内网分离则不需要。

zhangfh1990的博客 558

Mac中使用vscode编辑k8s资源文件出现意外 edit cancelled 的解决办法

Mac中使用vscode编辑k8s资源文件出现意外 edit cancelled 的解决办法Mac中使用vscode编辑k8s资源文件出现意外 edit cancelled 的解决办法临时解决:永久解决: Mac中使用vscode编辑k8s资源文件出现意外 edit cancelled 的解决办法 临时解决: 在terminal中输入export KUBE_EDITOR="code --wait" 永久解决: 在~目录下,找到.zshrc文件,没有就创建一个,在文档中写入 export KUBE_EDITO

u010970248的博客 1633
上一篇: kubectl源码分析之cordon and uncordon
下一篇: kubectl源码分析之taint
hxpjava1
博客等级 码龄19年 1365粉丝 511原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hxpjava1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值