kubectl 源码分析之exec

kubectl滚动更新资源 rollout Manage the rollout of a resource. Valid resource types include: * deployments * daemonsets * statefulsets Examples: # Rollback to the previous deployment kubectl rollout undo deployment/abc # Check the rollout status of a da 阅读详情

 欢迎关注我的公众号:

 目前刚开始写一个月,一共写了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 ExecOptions struct {//exec结构体
	StreamOptions

	ResourceName string
	Command      []string

	ParentCommandName       string
	EnableSuggestedCmdUsage bool

	Builder          func() *resource.Builder
	ExecutablePodFn  polymorphichelpers.AttachablePodForObjectFunc
	restClientGetter genericclioptions.RESTClientGetter

	Pod           *corev1.Pod
	Executor      RemoteExecutor
	PodClient     coreclient.PodsGetter
	GetPodTimeout time.Duration
	Config        *restclient.Config
}
type StreamOptions struct {//stream结构体
	Namespace     string
	PodName       string
	ContainerName string
	Stdin         bool
	TTY           bool
	// minimize unnecessary output
	Quiet bool
	// InterruptParent, if set, is used to handle interrupts while attached
	InterruptParent *interrupt.Handler

	genericclioptions.IOStreams

	// for testing
	overrideStreams func() (io.ReadCloser, io.Writer, io.Writer)
	isTerminalIn    func(t term.TTY) bool
}
//创建exec命令
func NewCmdExec(f cmdutil.Factory, streams genericclioptions.IOStreams) *cobra.Command {
	options := &ExecOptions{//初始化结构体
		StreamOptions: StreamOptions{
			IOStreams: streams,
		},

		Executor: &DefaultRemoteExecutor{},
	}
	cmd := &cobra.Command{//创建cobra命令
		Use:                   "exec (POD | TYPE/NAME) [-c CONTAINER] [flags] -- COMMAND [args...]",
		DisableFlagsInUseLine: true,
		Short:                 i18n.T("Execute a command in a container"),
		Long:                  "Execute a command in a container.",
		Example:               execExample,
		Run: func(cmd *cobra.Command, args []string) {
			argsLenAtDash := cmd.ArgsLenAtDash()
			cmdutil.CheckErr(options.Complete(f, cmd, args, argsLenAtDash))//准备
			cmdutil.CheckErr(options.Validate())//校验
			cmdutil.CheckErr(options.Run())//运行
		},
	}
	cmdutil.AddPodRunningTimeoutFlag(cmd, defaultPodExecTimeout)//pod-running-timeout信息
	// TODO support UID
	cmd.Flags().StringVarP(&options.ContainerName, "container", "c", options.ContainerName, "Container name. If omitted, the first container in the pod will be chosen")// container选项
	cmd.Flags().BoolVarP(&options.Stdin, "stdin", "i", options.Stdin, "Pass stdin to the container")//-i选项
	cmd.Flags().BoolVarP(&options.TTY, "tty", "t", options.TTY, "Stdin is a TTY")//-t选项
	return cmd
}
//准备函数
func (p *ExecOptions) Complete(f cmdutil.Factory, cmd *cobra.Command, argsIn []string, argsLenAtDash int) error {
	// Let kubectl exec follow rules for `--`, see #13004 issue
	if len(argsIn) == 0 || argsLenAtDash == 0 {//没有参数报错
		return cmdutil.UsageErrorf(cmd, execUsageStr)
	}

	p.ResourceName = argsIn[0]//设置资源名称
	p.Command = argsIn[1:]//设置运行命令

	var err error

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

	p.ExecutablePodFn = polymorphichelpers.AttachablePodForObjectFn//设置查找pod函数

	p.GetPodTimeout, err = cmdutil.GetPodRunningTimeoutFlag(cmd)//设置pod-running-timeout选项
	if err != nil {
		return cmdutil.UsageErrorf(cmd, err.Error())
	}

	p.Builder = f.NewBuilder//设置builder
	p.restClientGetter = f//设置restClientGetter

	cmdParent := cmd.Parent()//获取父命令
	if cmdParent != nil {
		p.ParentCommandName = cmdParent.CommandPath()//设置父命令名称
	}
	if len(p.ParentCommandName) > 0 && cmdutil.IsSiblingCommandExists(cmd, "describe") {
		p.EnableSuggestedCmdUsage = true//设置是否提示用法
	}

	p.Config, err = f.ToRESTConfig()//设置restConfig
	if err != nil {
		return err
	}

	clientset, err := f.KubernetesClientSet()//设置clientset
	if err != nil {
		return err
	}
	p.PodClient = clientset.CoreV1()//设置PodClient

	return nil
}
//校验
func (p *ExecOptions) Validate() error {
	if len(p.PodName) == 0 && len(p.ResourceName) == 0 {//resourcename和podName不能同时为空
		return fmt.Errorf("pod or type/name must be specified")
	}
	if len(p.Command) == 0 {//命令不能为空
		return fmt.Errorf("you must specify at least one command for the container")
	}
	if p.Out == nil || p.ErrOut == nil {//Out和ErrOut必须都不为空
		return fmt.Errorf("both output and error output must be provided")
	}
	return nil
}
//运行
func (p *ExecOptions) Run() error {
	var err error
	// we still need legacy pod getter when PodName in ExecOptions struct is provided,
	// since there are any other command run this function by providing Podname with PodsGetter
	// and without resource builder, eg: `kubectl cp`.
	if len(p.PodName) != 0 {//pod名称不为空
		p.Pod, err = p.PodClient.Pods(p.Namespace).Get(p.PodName, metav1.GetOptions{})//通过podClient获取pod
		if err != nil {
			return err
		}
	} else {
		builder := p.Builder().
			WithScheme(scheme.Scheme, scheme.Scheme.PrioritizedVersionsAllGroups()...).
			NamespaceParam(p.Namespace).DefaultNamespace().ResourceNames("pods", p.ResourceName)//用构造器获取result对象

		obj, err := builder.Do().Object()//从result获取Object
		if err != nil {
			return err
		}

		p.Pod, err = p.ExecutablePodFn(p.restClientGetter, obj, p.GetPodTimeout)//从obj获取可执行的pod
		if err != nil {
			return err
		}
	}

	pod := p.Pod

	if pod.Status.Phase == corev1.PodSucceeded || pod.Status.Phase == corev1.PodFailed {//如果pod为complete状态返回错误
		return fmt.Errorf("cannot exec into a container in a completed pod; current phase is %s", pod.Status.Phase)
	}

	containerName := p.ContainerName
	if len(containerName) == 0 {//指定了container
		if len(pod.Spec.Containers) > 1 {// 如果pod container大于1个,提示信息
			fmt.Fprintf(p.ErrOut, "Defaulting container name to %s.\n", pod.Spec.Containers[0].Name)
			if p.EnableSuggestedCmdUsage {
				fmt.Fprintf(p.ErrOut, "Use '%s describe pod/%s -n %s' to see all of the containers in this pod.\n", p.ParentCommandName, pod.Name, p.Namespace)
			}
		}
		containerName = pod.Spec.Containers[0].Name//容器名称为第0个容器名称
	}

	// ensure we can recover the terminal while attached
	t := p.SetupTTY()//设置tty

	var sizeQueue remotecommand.TerminalSizeQueue
	if t.Raw {
		// this call spawns a goroutine to monitor/update the terminal size
		sizeQueue = t.MonitorSize(t.GetSize())

		// unset p.Err if it was previously set because both stdout and stderr go over p.Out when tty is
		// true
		p.ErrOut = nil
	}

	fn := func() error {//exec函数
		restClient, err := restclient.RESTClientFor(p.Config)//获取client
		if err != nil {
			return err
		}

		// TODO: consider abstracting into a client invocation or client helper
		req := restClient.Post().
			Resource("pods").
			Name(pod.Name).
			Namespace(pod.Namespace).
			SubResource("exec")// 构造request对象
		req.VersionedParams(&corev1.PodExecOptions{
			Container: containerName,
			Command:   p.Command,
			Stdin:     p.Stdin,
			Stdout:    p.Out != nil,
			Stderr:    p.ErrOut != nil,
			TTY:       t.Raw,
		}, scheme.ParameterCodec)

		return p.Executor.Execute("POST", req.URL(), p.Config, p.In, p.Out, p.ErrOut, t.Raw, sizeQueue)//执行exec
	}

	if err := t.Safe(fn); err != nil {//执行t safe
		return err
	}

	return nil
}
//执行exec
func (*DefaultRemoteExecutor) Execute(method string, url *url.URL, config *restclient.Config, stdin io.Reader, stdout, stderr io.Writer, tty bool, terminalSizeQueue remotecommand.TerminalSizeQueue) error {
	exec, err := remotecommand.NewSPDYExecutor(config, method, url)//创建executer
	if err != nil {
		return err
	}
	return exec.Stream(remotecommand.StreamOptions{//执行stream
		Stdin:             stdin,
		Stdout:            stdout,
		Stderr:            stderr,
		Tty:               tty,
		TerminalSizeQueue: terminalSizeQueue,
	})
}

yolov8训练模型的一些心得-总结篇 先放在这,等过几天我都弄完了详细给大家说说(哈哈其实是给我自己说说,记录一下怕忘记) 阅读详情

相关推荐

Codex CLI Skills实战指南:从本地命令行到智能开发代理

Skills 是大模型本地化开发工具中实现‘可执行智能’的核心抽象,它将文件读写、Git 操作、Shell 执行等工程动作封装为带输入/输出契约的可编程接口,弥补了纯语言模型在确定性、安全性与环境感知上的根本缺陷。相比泛化的AI编码助手,Codex CLI 的 Skills 机制通过分层设计(基础交互层、工程环境层、领域增强层)和可组合调用,支撑起PR生成、错误诊断等端到端工作流。本文聚焦中高级开发者真实场景,详解 Skills 的选型逻辑、跨平台安装配置、高频报错排查及 Superpower 编排方法,助

ithome 474

k8s实战之kubectl

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

Qwen3-Coder:MoE架构与256K上下文驱动的编程智能体

编程大模型正从代码补全迈向系统级任务执行,其核心在于对长上下文的理解能力与工具调用的工程化支持。MoE(Mixture of Experts)架构通过稀疏激活显著降低推理显存占用和延迟,使4800亿参数模型可在单张A100上稳定运行;256K上下文并非堆砌文本容量,而是支撑跨文件、跨配置、跨工具的项目级建模,为智能体编程、浏览器自动化和Tool Calling提供基础语义空间。Qwen3-Coder以Instruct范式强化指令遵循能力,将自然语言需求精准映射为可执行代码或结构化工具调用请求,适用于DevO

weixin_34060741的博客 369

kubectl源码分析之apply

发布一个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 1809

程序员职业成长的底层操作系统:从做人到写好代码

在软件工程中,‘写好代码’不仅是语法正确或性能达标,更涉及人机交互设计、约束条件下的确定性交付,以及最小认知负荷的精密实现。本文围绕程序员职业身份的三层进阶——先做人(系统可用性与用户认知路径)、再做技术人员(时间/成本/风险三维工程决策)、最后做程序员(可追溯、可调试、可复用的编码实践),深入剖析技术价值判断的构建逻辑。结合.NET生态真实场景,探讨如何将抽象理念转化为可测量、可验证、可落地的行为刻度,并支撑起高可信度的技术博客体系。核心聚焦于技术人的职业校准机制与工程化表达能力。

dejz8829的专栏 463

未授权访问漏洞实战:从原理到防御的完整攻防指南

访问控制是信息安全的核心基础,其核心原理在于确保系统资源仅被合法授权的主体访问。当访问控制机制缺失或失效时,便会产生未授权访问漏洞,攻击者无需凭证即可直接获取敏感数据或执行危险操作,技术危害性极高。这类漏洞常见于各类Web应用、中间件、API接口及云服务中,是渗透测试与安全评估中的高频发现项。本文以近期热门的Nacos未授权访问漏洞(CVE-2021-29441)为具体案例,深入剖析其利用链,并系统阐述通过Docker Compose搭建靶场环境、进行批量复现的通用方法论。同时,从防御视角出发,提供了覆盖安

weixin_30887919的博客 504

kubernetes exec源码简析

1 概述: 1.1 环境 版本信息如下: a、操作系统:centos 7.6 c、kubernetes版本:v1.15.0 1.2 exec原理概述 为进入目标pod的目标容器中执行命令(挂载标准输入和输出、标准错误的情景),kubectl exec访问kube-apiserver的connect接口(中间过程是通过http协议来握手,之后升级为spdy协议),kube-apiserver把请求转发至对应节点的kubelet进程,而kubelet进程此时是一个反向代理,再把请求转发至cri shim程序(

nangonghen的博客 1593

K8S系列:Pod的扩缩容方法

手动扩缩容机制 scale 自动扩缩容机制 scaleTargetRef 也可以自定义一些指标 当到达指标设置阈值时,进行扩容

NIO4444 647

Docker ENTRYPOINT 底层原理与生产级实践指南

ENTRYPOINT 是 Docker 容器进程模型的核心机制,本质是为容器指定 PID 1 进程,直接决定信号传递、生命周期管理和 OCI 兼容性。其 shell 形式与 exec 形式触发不同内核调用路径:前者经 /bin/sh 中转,易导致信号丢失和 PID 层级错位;后者直调 execve 系统调用,保障服务即 PID 1,契合 Kubernetes 健康检查与自动恢复要求。技术价值在于统一镜像行为契约、解耦运行时参数、支撑 CLI 工具化封装。典型应用场景包括初始化脚本编排、多环境模式切换、K8s

weixin_33858485的博客 399

Ubuntu 24.04 + RTX 5090 部署 OpenVLA-OFT:从环境配置到机器人任务评估实战

本文详细记录了在Ubuntu 24.04 LTS系统上,为全新RTX 5090显卡配置CUDA 12.8+与PyTorch 2.7.1+开发环境,并成功部署OpenVLA-OFT视觉语言模型进行机器人任务评估的完整实战流程。文章重点解决了驱动安装、依赖版本冲突、路径设置等核心难题,为在最新硬件上运行先进AI机器人模型提供了可靠的避坑指南和性能观察。

n8m7b6v5c4的博客 596

如何修复Windows卡在“正在准备Windows”的问题?这里有详细步骤

如何修复Windows卡在“正在准备Windows”的问题?这里有详细步骤。

wyxtx的博客 5666

突破AWX Operator部署困境:从日志分析到数据库修复的全栈排障指南

作为Kubernetes环境中Ansible自动化的核心组件,AWX Operator的部署故障常常让管理员陷入困境: - operator日志中充斥着模糊的错误信息 - PostgreSQL数据库初始化失败却找不到具体原因 - Pod状态显示Running但AWX界面始终无法访问 - 调试配置修改后问题依旧反复出现 本文将系统梳理AWX Operator故障排查方法论,通过12个实战场

gitblog_00817的博客 436

深度强化学习-D3QN算法原理与代码

Dueling Double Deep Q Network(D3QN)算法结合了Double DQN和Dueling DQN算法的思想,进一步提升了算法的性能。如果对Doubel DQN和Dueling DQN算法还不太了解的话,可以参考我的这两篇博文:深度强化学习-Doubel DQN算法原理与代码和深度强化学习-Dueling DQN算法原理与代码,分别详细讲述了这两个算法的原理以及代码实现。本文就带领大家了解一下D3QN算法,代码链接见下方。 代码:https://github.com/indigo

weixin_46133643的博客 2万+

Linux 下 SIGSEGV 无 core 文件定位:3 种替代方案与 dmesg/objdump 实战

本文详细介绍了在Linux环境下无法生成core文件时,如何通过dmesg内核日志分析、objdump反汇编定位和catchsegv工具链三种方法有效诊断SIGSEGV(segmentation fault)错误。文章包含实战步骤和代码示例,帮助开发者在生产环境中快速定位内存访问问题,提升调试效率。

weixin_33785108的博客 493

如何实现MCGS与S7-200SMART PLC以太网多台通信控制?

第九步:(设备工具箱—设备管理—鼠标依次点击通用TCP/IP父设备—西门子_ Smart200到设备窗口里面去)数据类型:第0位(指PLC地址变量小数点后面的位数,例如我地址是M0.0,那么在数据类型应填写通道的第00位)第十步:(鼠标双击打开通用TCPIP父设备0--[通用TCP/IP父设备]进入通信配置)通道地址:0(指小数点前面起始字节的地址,例如我地址是M0.0,那么应在通道地填写0)。第七步:(选择通用TCP/IP父设备,点击新增,右侧选定设备就会自动添加进去。

u010670857的博客 6720

人工智能_大模型095_Web版003_deepseek R1本地安装_私有化部署_支持RAG_调用HTTPAPI做自己的AI应用_安装RagFlow以及使用_---人工智能工作笔记0240

这里的一定要注意,是资源不够用了,可以点击ragflow-server左边的小绿点,查看 结果。注意去把内存改成10G把至少,我这里改成了10G,因为电脑一共就16G,再试试吧.可以看日志,就显示的是没有连接上mysql,结果我一看,mysql,根本没启动.然后下面选择general就可以了,然后点击确定,然后再去点击。手动去启动,然后再去试试,注意,内存这里给8G太小了还是.调成8G了,然后硬盘大了大了一些换成50G了,然后。点击系统模型设置可以看到,选择聊天模型就可以了,

添柴程序猿的专栏 449

【kubernetes v1.21】(kube-apiserver 3)kube-apiserver Admission Control 与 CRD 超深度分析

Part 3: kube-apiserver Admission Control 与 CRD 超深度分析

zhonglinzhang 73

众包更新高精地图:如何保证数据一致性?

众包更新高精地图:如何保证数据一致性?​ ,人工智能,计算机视觉,大模型,AI,该文章围绕众包更新高精地图的数据一致性保障展开,介绍了测试方法,包括单元、集成、性能和一致性测试;阐述了部署与运维,涉及部署架构、监控告警及系统升级维护;还提及行业标准与规范,涵盖数据采集、处理及安全隐私保护标准,全方位为众包更新高精地图的数据一致性提供技术与规范支持。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 16万+

juju reactive charm (by quqi99)

sudo snap install charm --classic mkdir -p /bak/work/charms/layers export JUJU_REPOSITORY=/bak/work/charms export LAYER_PATH=$JUJU_REPOSITORY/layers cd $LAYER_PATH charm create simple cd simple sudo ...

技术并艺术着 8742

C#量化交易的市场数据采集与分析:从0到1构建你的‘数据雷达’——对比5大神器,代码实战全解析!

数据是量化交易的‘氧气’,而好的数据采集与分析是你的‘呼吸机’!本文5大神器+代码实战,总有一款适合你!(本文代码均经过测试,但请根据实际需求调整!

java专栏 734

Allegro23.1新功能之软件自带阻抗计算工具操作指导

Allegro升级到了23.1后,软件新增了一个自带阻抗计算的功能,如下图。Propagation velocity:传输速度,单位是光速的多少倍。Dielectric constant输入介电常数,这里使用常规4。新功能之软件自带阻抗计算工具。如何使用,具体操作如下。

weixin_54787054的博客 785

Mythos模型:AI驱动的可操作化攻防能力跃迁

在人工智能安全领域,'可操作化攻防能力'正成为新一代大模型的核心技术指标——它超越传统代码生成与漏洞扫描,指向模型能否在真实终端环境自主规划攻击链、动态响应反馈、生成可执行exploit并适配复杂防护机制。其底层依赖于攻防语义建模、长程推理优化与跨协议因果推理等关键技术,显著提升红队演练、企业级渗透测试与自动化漏洞挖掘的工程落地效率。当前以Claude Mythos为代表的系统级模型,已在SWE-bench Pro与CyberGym等高保真基准中验证了端到端漏洞发现-利用-验证的闭环能力,标志着AI从‘能写

weixin_34062469的博客 391

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

JVM CDS警告解析:类加载路径越界诊断与修复

Class Data Sharing(CDS)是JVM通过共享归档加速启动的核心机制,其原理基于类加载器分层契约——仅Bootstrap ClassLoader加载的系统类(如java.lang.*、java.util.*)可安全共享。该机制的技术价值在于显著降低多实例JVM的内存占用与启动延迟,广泛应用于Spring Boot微服务、容器化部署及高密度Java进程场景。当出现‘sharing is only supported for boot loader classes’警告,本质是应用类(如Spri

weixin_34405354的博客 429

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

kubernetes基础命令

一、名称空间 资源隔离、但是网络不隔离 # 创建 kubectl create ns test #删除 kubectl delete ns test # yaml文件创建 [root@k8s-master ~]# vi test.yaml [root@k8s-master ~]# cat test.yaml apiVersion: v1 kind: Namespace metadata: name: test [root@k8s-master ~]# kubectl ap...

cbzhunian 8031

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

k8s存储卷(empyDir;hostPath;nfs)

xxxxx

qq_44135433的博客 2133

五、Kubernetes(K8S):Kubectl常用命令详解

Kubectl是Kubernetes命令行工具,用于管理Kubernetes集群资源和应用程序的部署、升级和扩展等。其作用包括但不限于: 1.创建、更新和删除应用程序、服务和负载均衡器等资源 2.管理集群节点的状态和部署 3.管理Kubernetes集群的配置和存储 4.监控集群和应用程序的状态 5.诊断和调试应用程序和集群故障 6.扩展和调整集群规模和资源使用 7.与Kubernetes API服务器通信 Kubectl是使用Kubernetes进行部署和管理的核心工具之一。

SteveRocket's-Blog 7273
上一篇: kubectl 源码分析之attach
下一篇: kubectl源码分析之port-forward
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、付费专栏及课程。

余额充值