kubectl源码分析之config set-credentials

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 createAuthInfoOptions struct {//set-credentials结构体
	configAccess      clientcmd.ConfigAccess
	name              string
	authPath          cliflag.StringFlag
	clientCertificate cliflag.StringFlag
	clientKey         cliflag.StringFlag
	token             cliflag.StringFlag
	username          cliflag.StringFlag
	password          cliflag.StringFlag
	embedCertData     cliflag.Tristate
	authProvider      cliflag.StringFlag

	authProviderArgs         map[string]string
	authProviderArgsToRemove []string

	execCommand     cliflag.StringFlag
	execAPIVersion  cliflag.StringFlag
	execArgs        []string
	execEnv         map[string]string
	execEnvToRemove []string
}
//创建set-credentials命令
func NewCmdConfigSetAuthInfo(out io.Writer, configAccess clientcmd.ConfigAccess) *cobra.Command {
	options := &createAuthInfoOptions{configAccess: configAccess}//初始化结构体
	return newCmdConfigSetAuthInfo(out, options)//创建命令
}

func newCmdConfigSetAuthInfo(out io.Writer, options *createAuthInfoOptions) *cobra.Command {
	cmd := &cobra.Command{//创建cobra命令
		Use: fmt.Sprintf(
			"set-credentials NAME [--%v=path/to/certfile] "+
				"[--%v=path/to/keyfile] "+
				"[--%v=bearer_token] "+
				"[--%v=basic_user] "+
				"[--%v=basic_password] "+
				"[--%v=provider_name] "+
				"[--%v=key=value] "+
				"[--%v=exec_command] "+
				"[--%v=exec_api_version] "+
				"[--%v=arg] "+
				"[--%v=key=value]",
			clientcmd.FlagCertFile,
			clientcmd.FlagKeyFile,
			clientcmd.FlagBearerToken,
			clientcmd.FlagUsername,
			clientcmd.FlagPassword,
			flagAuthProvider,
			flagAuthProviderArg,
			flagExecCommand,
			flagExecAPIVersion,
			flagExecArg,
			flagExecEnv,
		),
		DisableFlagsInUseLine: true,
		Short:                 i18n.T("Sets a user entry in kubeconfig"),
		Long:                  createAuthInfoLong,
		Example:               createAuthInfoExample,
		Run: func(cmd *cobra.Command, args []string) {
			err := options.complete(cmd, out)//准备
			if err != nil {
				cmd.Help()
				cmdutil.CheckErr(err)
			}
			cmdutil.CheckErr(options.run())//运行
			fmt.Fprintf(out, "User %q set.\n", options.name)//打印结果
		},
	}

	cmd.Flags().Var(&options.clientCertificate, clientcmd.FlagCertFile, "Path to "+clientcmd.FlagCertFile+" file for the user entry in kubeconfig")//clientCertificate选项
	cmd.MarkFlagFilename(clientcmd.FlagCertFile)
	cmd.Flags().Var(&options.clientKey, clientcmd.FlagKeyFile, "Path to "+clientcmd.FlagKeyFile+" file for the user entry in kubeconfig")//clientKey选项
	cmd.MarkFlagFilename(clientcmd.FlagKeyFile)
	cmd.Flags().Var(&options.token, clientcmd.FlagBearerToken, clientcmd.FlagBearerToken+" for the user entry in kubeconfig")//token选项
	cmd.Flags().Var(&options.username, clientcmd.FlagUsername, clientcmd.FlagUsername+" for the user entry in kubeconfig")//username选项
	cmd.Flags().Var(&options.password, clientcmd.FlagPassword, clientcmd.FlagPassword+" for the user entry in kubeconfig")//password选项
	cmd.Flags().Var(&options.authProvider, flagAuthProvider, "Auth provider for the user entry in kubeconfig")//authProvider选项
	cmd.Flags().StringSlice(flagAuthProviderArg, nil, "'key=value' arguments for the auth provider")//AuthProviderArg选项
	cmd.Flags().Var(&options.execCommand, flagExecCommand, "Command for the exec credential plugin for the user entry in kubeconfig")//execCommand选项
	cmd.Flags().Var(&options.execAPIVersion, flagExecAPIVersion, "API version of the exec credential plugin for the user entry in kubeconfig")//execAPIVersion选项
	cmd.Flags().StringSlice(flagExecArg, nil, "New arguments for the exec credential plugin command for the user entry in kubeconfig")//ExecArg选项
	cmd.Flags().StringArray(flagExecEnv, nil, "'key=value' environment values for the exec credential plugin")//ExecEnv选项
	f := cmd.Flags().VarPF(&options.embedCertData, clientcmd.FlagEmbedCerts, "", "Embed client cert/key for the user entry in kubeconfig")//embed-certs选项
	f.NoOptDefVal = "true"

	return cmd
}
//准备
func (o *createAuthInfoOptions) complete(cmd *cobra.Command, out io.Writer) error {
	args := cmd.Flags().Args()//获取参数
	if len(args) != 1 {//参数必须是1个
		return fmt.Errorf("Unexpected args: %v", args)
	}

	authProviderArgs, err := cmd.Flags().GetStringSlice(flagAuthProviderArg)//获取authProviderArgs
	if err != nil {
		return fmt.Errorf("Error: %s", err)
	}

	if len(authProviderArgs) > 0 {
		newPairs, removePairs, err := cmdutil.ParsePairs(authProviderArgs, flagAuthProviderArg, true)//解析authProviderArgs
		if err != nil {
			return fmt.Errorf("Error: %s", err)
		}
		o.authProviderArgs = newPairs//设置要添加的authProviderArgs
		o.authProviderArgsToRemove = removePairs//设置要删除的authProviderArgs
	}

	execArgs, err := cmd.Flags().GetStringSlice(flagExecArg)//获取execArgs
	if err != nil {
		return fmt.Errorf("Error: %s", err)
	}
	if len(execArgs) > 0 {//设置execArgs
		o.execArgs = execArgs
	}

	execEnv, err := cmd.Flags().GetStringArray(flagExecEnv)//获取execEnv
	if err != nil {
		return fmt.Errorf("Error: %s", err)
	}
	if len(execEnv) > 0 {
		newPairs, removePairs, err := cmdutil.ParsePairs(execEnv, flagExecEnv, true)//解析execEnv
		if err != nil {
			return fmt.Errorf("Error: %s", err)
		}
		o.execEnv = newPairs//设置要添加的execEnv
		o.execEnvToRemove = removePairs//设置要删除的execEnv
	}

	o.name = args[0]//设置name
	return nil
}
func (o createAuthInfoOptions) run() error {//运行
	err := o.validate()//校验
	if err != nil {
		return err
	}

	config, err := o.configAccess.GetStartingConfig()//加载config
	if err != nil {
		return err
	}

	startingStanza, exists := config.AuthInfos[o.name]//获取已经存在的authinfo
	if !exists {//不存在则创建
		startingStanza = clientcmdapi.NewAuthInfo()
	}
	authInfo := o.modifyAuthInfo(*startingStanza)//修改authinfo
	config.AuthInfos[o.name] = &authInfo//设置authinfo

	if err := clientcmd.ModifyConfig(o.configAccess, *config, true); err != nil {//把配置写回文件
		return err
	}

	return nil
}
/校验
func (o createAuthInfoOptions) validate() error {
	if len(o.name) == 0 {//name不能为空
		return errors.New("you must specify a non-empty user name")
	}
	methods := []string{}//定义methods
	if len(o.token.Value()) > 0 {//如果token有值,append methods
		methods = append(methods, fmt.Sprintf("--%v", clientcmd.FlagBearerToken))
	}
	if len(o.username.Value()) > 0 || len(o.password.Value()) > 0 {//如果用户名或密码有值
		methods = append(methods, fmt.Sprintf("--%v/--%v", clientcmd.FlagUsername, clientcmd.FlagPassword))// append methods
	}
	if len(methods) > 1 {//如果methods值大于1个,则报错
		return fmt.Errorf("you cannot specify more than one authentication method at the same time: %v", strings.Join(methods, ", "))
	}
	if o.embedCertData.Value() {//如果embed-certs为true
		certPath := o.clientCertificate.Value()//获取client-certificte的值
		keyPath := o.clientKey.Value()//获取client-key的值
		if certPath == "" && keyPath == "" {//如果certPath和keyPath都为空,则报错
			return fmt.Errorf("you must specify a --%s or --%s to embed", clientcmd.FlagCertFile, clientcmd.FlagKeyFile)
		}
		if certPath != "" {// 如果certPath不为空,判断是否可读取
			if _, err := ioutil.ReadFile(certPath); err != nil {
				return fmt.Errorf("error reading %s data from %s: %v", clientcmd.FlagCertFile, certPath, err)
			}
		}
		if keyPath != "" {//如果keypath不为空,判断是否可读取
			if _, err := ioutil.ReadFile(keyPath); err != nil {
				return fmt.Errorf("error reading %s data from %s: %v", clientcmd.FlagKeyFile, keyPath, err)
			}
		}
	}

	return nil
}
//修改authinfo
func (o *createAuthInfoOptions) modifyAuthInfo(existingAuthInfo clientcmdapi.AuthInfo) clientcmdapi.AuthInfo {
	modifiedAuthInfo := existingAuthInfo

	var setToken, setBasic bool//定义变量

	if o.clientCertificate.Provided() {//如果client-certificate有值
		certPath := o.clientCertificate.Value()//获取certPath
		if o.embedCertData.Value() {//如果embed-cert为true
			modifiedAuthInfo.ClientCertificateData, _ = ioutil.ReadFile(certPath)//设置ClientCertificateData为certPath的内容
			modifiedAuthInfo.ClientCertificate = ""//设置ClientCertificate 为空
		} else {
			certPath, _ = filepath.Abs(certPath)//获取certPath绝对路径
			modifiedAuthInfo.ClientCertificate = certPath//设置ClientCertificate 
			if len(modifiedAuthInfo.ClientCertificate) > 0 {//如果ClientCertificate 有值
				modifiedAuthInfo.ClientCertificateData = nil//设置ClientCertificateData 为nil
			}
		}
	}
	if o.clientKey.Provided() {//如果client-key有值
		keyPath := o.clientKey.Value()//获取keypath
		if o.embedCertData.Value() {//如果embed-certs为true
			modifiedAuthInfo.ClientKeyData, _ = ioutil.ReadFile(keyPath)//设置ClientKeyData为keyPath的内容
			modifiedAuthInfo.ClientKey = ""//设置ClientKey 为空
		} else {
			keyPath, _ = filepath.Abs(keyPath)//获取keyPath的绝对路径
			modifiedAuthInfo.ClientKey = keyPath//设置ClientKey 
			if len(modifiedAuthInfo.ClientKey) > 0 {//如果ClientKey 有值
				modifiedAuthInfo.ClientKeyData = nil//设置ClientKeyData 为nil
			}
		}
	}

	if o.token.Provided() {//如果token有值
		modifiedAuthInfo.Token = o.token.Value()//设置token
		setToken = len(modifiedAuthInfo.Token) > 0//设置setToken 
	}

	if o.username.Provided() {//如果username有值
		modifiedAuthInfo.Username = o.username.Value()//设置Username 
		setBasic = setBasic || len(modifiedAuthInfo.Username) > 0//设置setBasic 
	}
	if o.password.Provided() {//如果password有值
		modifiedAuthInfo.Password = o.password.Value()//设置Password 
		setBasic = setBasic || len(modifiedAuthInfo.Password) > 0//设置setBasic 
	}
	if o.authProvider.Provided() {//乳沟auth-provider有值
		newName := o.authProvider.Value()//获取auth-provider

		// Only overwrite if the existing auth-provider is nil, or different than the newly specified one.
		if modifiedAuthInfo.AuthProvider == nil || modifiedAuthInfo.AuthProvider.Name != newName {//如果authProvider为空获取name不同
			modifiedAuthInfo.AuthProvider = &clientcmdapi.AuthProviderConfig{//设置authProvider
				Name: newName,
			}
		}
	}

	if modifiedAuthInfo.AuthProvider != nil {//如果authProvider不为nil
		if modifiedAuthInfo.AuthProvider.Config == nil {//如果authprovider的config为空
			modifiedAuthInfo.AuthProvider.Config = make(map[string]string)//创建config
		}
		for _, toRemove := range o.authProviderArgsToRemove {// 遍历要删除的providerargs
			delete(modifiedAuthInfo.AuthProvider.Config, toRemove)//删除provider-args
		}
		for key, value := range o.authProviderArgs {//遍历要添加的provider-args
			modifiedAuthInfo.AuthProvider.Config[key] = value//添加provider args
		}
	}

	if o.execCommand.Provided() {//如果exec-command有值
		newExecCommand := o.execCommand.Value()//获取exec-command的值

		// create new Exec if doesn't exist, otherwise just modify the command
		if modifiedAuthInfo.Exec == nil {//如果exec为空,则创建
			modifiedAuthInfo.Exec = &clientcmdapi.ExecConfig{
				Command: newExecCommand,
			}
		} else {
			modifiedAuthInfo.Exec.Command = newExecCommand// 设置command
			// explicitly reset exec arguments
			modifiedAuthInfo.Exec.Args = nil//设置args为空
		}
	}

	// modify next values only if Exec exists, ignore these changes otherwise
	if modifiedAuthInfo.Exec != nil {//如果exec不为空
		if o.execAPIVersion.Provided() {//有过exec-apiversion有值
			modifiedAuthInfo.Exec.APIVersion = o.execAPIVersion.Value()//设置apiVersion
		}

		// rewrite exec arguments list with new values
		if o.execArgs != nil {// 如果args不为空
			modifiedAuthInfo.Exec.Args = o.execArgs//设置args
		}

		// iterate over the existing exec env values and remove the specified
		if o.execEnvToRemove != nil {//如果要删除的env不为空
			newExecEnv := []clientcmdapi.ExecEnvVar{}
			for _, value := range modifiedAuthInfo.Exec.Env {//遍历authinfo的env
				needToRemove := false
				for _, elemToRemove := range o.execEnvToRemove {
					if value.Name == elemToRemove {//如果名称和要删除的相同
						needToRemove = true//设置needtoremove为true
						break
					}
				}
				if !needToRemove {//如果needtoremove为false
					newExecEnv = append(newExecEnv, value)//添加env
				}
			}
			modifiedAuthInfo.Exec.Env = newExecEnv//设置env
		}

		// update or create specified environment variables for the exec plugin
		if o.execEnv != nil {//如果要添加的env不为空
			newEnv := []clientcmdapi.ExecEnvVar{}
			for newEnvName, newEnvValue := range o.execEnv {//遍历要添加env
				needToCreate := true
				for i := 0; i < len(modifiedAuthInfo.Exec.Env); i++ {// 遍历authinfo的env
					if modifiedAuthInfo.Exec.Env[i].Name == newEnvName {// 如果名称相同
						// update the existing value
						needToCreate = false
						modifiedAuthInfo.Exec.Env[i].Value = newEnvValue//设置value
						break
					}
				}
				if needToCreate {//如果needtocreate为true
					// create a new env value
					newEnv = append(newEnv, clientcmdapi.ExecEnvVar{Name: newEnvName, Value: newEnvValue})//追加env
				}
			}
			modifiedAuthInfo.Exec.Env = append(modifiedAuthInfo.Exec.Env, newEnv...)// 追加authinfo的env
		}
	}

	// If any auth info was set, make sure any other existing auth types are cleared
	if setToken || setBasic {//如果setToken或setBasic为true
		if !setToken {// 如果settoken为false
			modifiedAuthInfo.Token = ""//设置Token 
		}
		if !setBasic {//如果setBasic 为false,设置用户名和密码
			modifiedAuthInfo.Username = ""
			modifiedAuthInfo.Password = ""
		}
	}

	return modifiedAuthInfo
}

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源码分析,学习知其然,知其所以然

Moveit Servo学习

MoveIt Servo功能与配置指南 摘要:本文介绍了MoveIt Servo的功能特性,包括支持关节速度、末端执行器速度和位置控制,以及安全功能如奇点检查、碰撞检测等。通过示例展示了如何运行伺服控制demo,详细解析了关键节点和话题。最后以睿尔曼rml_63机器人为例,讲解了如何自定义伺服配置文件,包括环境设置、输入输出参数配置、平滑滤波器和规划场景监控等关键配置项。文章提供了从基础使用到自定义机器人配置的完整指导,帮助开发者实现高效的实时运动控制。

Fisher的博客 1179

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

保姆级教程:用dnSpy调试Unity游戏,从找DLL到打断点全流程(附调试版mono.dll下载)

本文详细介绍了使用dnSpy调试Unity游戏的全流程,包括环境准备、关键程序集定位、mono.dll版本匹配与替换、调试环境配置及实战技巧。通过本教程,开发者可以高效进行Unity游戏逆向分析,适用于学习设计模式或安全审计等场景。

weixin_30236595的博客 578

运算放大器 VS 仪表放大器

运算放大器(Operational Amplifier, 简称 Op Amp)和仪表放大器(Instrumentation Amplifier, 简称INA)在电子电路设计中都有非常广泛的应用,但两者在结构、特性以及应用场景上都有明显的区别。以下是它们之间主要的差异:运算放大器(Op Amp)仪表放大器(INA)运算放大器仪表放大器运算放大器仪表放大器运算放大器仪表放大器运算放大器仪表放大器总之,运算放大器是通用型放大元件,需要设计者自己做额外的电路配置;而仪表放大器则是针对高精度测量差分信号而生,内部匹配

chinahongjiang的博客 1349

config kubectl_Kubernetes - kubectl config set-credentials - 中文文档

kubectl config set-credentials在kubeconfig配置文件中设置一个用户项。摘要在kubeconfig配置文件中设置一个用户项。如果指定了一个已存在的名字,将合并新字段并覆盖旧字段。客户端证书设置::–client-certificate=certfile –client-key=keyfile不记名令牌设置:–token=bearer_tokenBasic认证设置...

weixin_29476545的博客 828

Win11下WSL2安装Ubuntu22.04避坑指南:从镜像源到C++环境配置

本文提供了一份详细的Win11下WSL2安装Ubuntu22.04的实战避坑指南。内容涵盖从WSL2核心安装、自定义安装路径,到更换国内镜像源以解决更新缓慢问题,并一站式配置完整的C++开发环境(包括GCC、CMake、vcpkg等),最后分享提升开发体验的进阶技巧,助你在Windows上打造高效的Linux开发工作站。

weixin_29260291的博客 563

Kubectl Config Set-Context 实战指南:Kubernetes 多集群上下文管理与最佳实践

本教程系统讲解 kubectl 中与配置管理密切相关的 `kubectl config set-context` 命令,涵盖 kubeconfig 的三种加载方式(默认路径、`--kubeconfig` 标志、`KUBECONFIG` 环境变量)、上下文的创建与切换、命名规范与清理策略、namespace 与用户绑定等高级用法,以及常见错误的排查思路和 CI/CD 集成方案。读完本文,你将能够在一

gitblog_00527的博客 771

从DC到DCG:手把手教你搭建物理感知综合流程(含DEF文件处理避坑指南)

本文详细介绍了从Design Compiler(DC)过渡到DC Topographical(DCT)和DC Graphical(DCG)的完整操作框架,特别针对DEF文件处理提供避坑方案。通过环境准备、工具升级、DEF文件处理、DCG综合配置等步骤,帮助开发者高效应对28nm以下工艺节点的物理感知综合挑战,显著提升时序收敛效率。

weixin_27966471的博客 382

【Go语言实战】(2) Gin+Vue 电子商城

618来!!不用纠结去哪里剁手了!直接自己安排一个商场不香吗??

面向生活编程 4827

Kubectl命令大全参数详解及示例【超全】

本文介绍了Kubernetes命令行工具kubectl的基本使用方法和常见命令。kubectl是管理K8s集群的核心工具,支持查看、创建、删除各类资源。文章详细说明了命令格式,包括资源类型简写(如po/pods、svc/services等),并提供了查看节点、Pod、服务等资源的常用命令示例。此外还介绍了如何配置命令自动补全功能,帮助提高工作效率。内容涵盖kubectl的基本操作、资源类型查询和常用参数,适合K8s初学者快速掌握基础运维命令。

liu_chen_yang的博客 3453

103:vue+cesium 设置球体水部分颜色为黄色

本示例在 Vue + cesium 项目中设置球体水部分颜色为黄色。这里的操作是将球体内部设置为空的,在地球内部添加一个黄色的圆球,这样水的部分就被突出出来了。直接复制下面的 vue+cesium源代码,操作2分钟即可运行实现效果.

大剑师兰特的GIS世界 626

config kubectl_kubernetes实践之五十五:kubectl之配置kubeconfig

一: 简介使用kubectl命令行的时候首先需要配置Kubeconfig文件,用于配置如何访问Kubernetes API,包括Kubernetes API Server的URL和认证信息等,并且可以设置不同的上下文环境,快速切换访问环境。二:Kubeconfig文件示例点击(此处)折叠或打开apiVersion:v1kind:Configclusters:- cluster:certificat...

weixin_28020031的博客 987

倍福--TwinSAFE功能块的使用

在安全模块的程序设计中,输入变量取反,或者把PLC的变量连接到安全的功能块程序中, 操作流程 1.1. 功能块输出取反 例如修改IN,右击属性,然后可在Single-Channel选项中选择是NO还是NC的输入信号。 1.2. PLC标准变量作为安全程序的输入 1.2.1. 建立两个PLC变量 1.2.2. 安全程序区创建变量 1.2.3. 功能块变量链接 首先,PLC变量不能直接连到Estop功能块的输入变量中,否则会报错,但PLC可以连接到SafeAnd这些功能块,然后再转出来,如下所示

weixin_41883890的博客 5315

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

kubectl-dba:KubeDB数据库管理的终极kubectl插件完全指南

想要在Kubernetes中轻松管理数据库集群吗?😊 kubectl-dba是KubeDB数据库管理平台的官方kubectl插件,为数据库管理员提供了一站式的解决方案。这个强大的工具让你能够像操作原生Kubernetes资源一样管理各种数据库引擎,包括MySQL、PostgreSQL、MongoDB、Redis、Elasticsearch等20多种主流数据库。 ## 为什么需要kubectl-

gitblog_00356的博客 662

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

kubectl-dba命令大全:15个必学操作让KubeDB管理效率提升300%

`kubectl-dba`是一款专为KubeDB设计的命令行插件,它能够帮助开发者和运维人员轻松管理Kubernetes环境中的数据库资源。通过本文介绍的15个核心命令,你将能够快速掌握KubeDB的日常管理技巧,显著提升工作效率。 ## 一、基础操作命令 ### 1. 连接数据库:kubectl dba connect 快速连接到Kubernetes集群中的数据库实例,支持多种数据库类型。

gitblog_00171的博客 481

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Kubernetes The Hard Way:配置 kubectl 远程访问 —— 用 admin 凭据生成 Kubeconfig 并验证集群

本篇对应 Kubernetes The Hard Way 教程的第 10 个实验(Configuring kubectl for Remote Access)。在集群的 etcd、控制面组件和 worker 节点全部引导完成之后,这是第一个"从外部"操作集群的实验:在 `jumpbox` 管理机上基于 `admin` 用户的 TLS 客户端证书生成 kubeconfig 文件,使 `kubectl

gitblog_01187的博客 433

Windows系统下kubectl终极安装指南:5种方法快速上手Kubernetes命令行工具

想要高效管理Kubernetes集群?kubectl是你的必备武器!这个强大的命令行工具让你能够轻松部署应用、管理资源、调试服务。在Windows系统上安装kubectl有多种方法,从简单的一键安装到灵活的手动配置,本指南将为你详细介绍每种方法的步骤和适用场景,助你快速搭建Kubernetes管理环境。 ## 📋 版本兼容性检查:避免踩坑的第一步 在开始安装之前,了解版本兼容性至关重要。ku

gitblog_00183的博客 390

CKAD考试实战技巧:CKAD-prep-notes中的kubectl命令快速指南

想要快速通过CKAD认证考试吗?这份基于CKAD-prep-notes项目的kubectl命令快速指南将为你提供终极实战技巧!Certified Kubernetes Application Developer (CKAD) 考试是Kubernetes应用开发者认证,需要熟练掌握kubectl命令和Kubernetes核心概念。本文将分享如何利用CKAD-prep-notes资源库中的精华内容,快

gitblog_00196的博客 729

老 Mac 装 macOS 15 Sequoia 上手指南:OpenCore Legacy Patcher 实战

Apple 早已停止给你的 Intel Mac 推送新系统,机器停在最后一个原生版本,想升 macOS 15 Sequoia 只能看着它吃灰。OpenCore Legacy Patcher(OCLP)就是干这个的:给官方已放弃的机型打上补丁,装上新版 macOS,之后还能正常收到官方 OTA 更新。走完这篇教程,你的老款 Mac 会获得图形加速、可用的 Wi-Fi,以及长期更新的资格——前提是它确

gitblog_00998的博客 1014

Windows上kubectl终极指南:从零到精通的全栈安装与配置教程

作为Kubernetes集群管理的核心命令行工具,kubectl是每位开发者和运维人员必须掌握的关键技能。本文将带你从零开始,在Windows系统上完成kubectl的完整安装、配置与优化,解决实际工作中遇到的各种挑战。 [![Kubernetes官方Logo](https://raw.gitcode.com/GitHub_Trending/webs/website/raw/180027ed93

gitblog_01181的博客 977

远程访问K8s集群:kubernetes-the-hard-way-aws kubectl配置与使用技巧

在AWS环境中部署Kubernetes集群后,远程访问与管理是日常运维的核心需求。**kubernetes-the-hard-way-aws**项目提供了在AWS上手动搭建K8s集群的完整指南,而`kubectl`作为与集群交互的命令行工具,其正确配置直接影响管理效率。本文将带你掌握远程访问K8s集群的关键步骤,从配置文件生成到实用操作技巧,让集群管理变得简单高效! ## 为什么需要专属kube

gitblog_00327的博客 860

AI做的界面为什么一眼假?genjutsu tells目录识破18种AI味破绽的完整清单

用过 AI 生成落地页的人都熟悉那种感觉:页面"看起来没问题",但总像套了模板——左上角一行 `LIS 14:23 · 18°C` 的城市时钟、三张尺寸一样的功能卡片、按钮四周泛着霓虹光晕。这就是所谓的 **AI味**(AI slop)。而 [genjutsu](https://link.gitcode.com/i/5cb861b63a713e41bcc845f94991b565) 是一个为 Cl

gitblog_00417的博客 382

three.js 十分钟跑通第一个 WebGL 3D 场景

three.js 是个 JavaScript 3D 渲染库,底层走 WebGL / WebGPU,替你把 GLSL 着色器那套活全干了。你只碰场景、相机、材质,十几行转起一个立方体,三行加载一个 glTF,十万粒子丢给 GPU 算。 ## 给 three.js 找个位置 🧭 three.js 卡在裸 WebGL 和重型引擎中间。三者摆一起,坐标一下就看清: | | 裸 WebGL | 游

gitblog_00016的博客 439

OpenCore Legacy Patcher 老 Mac 装新系统完整指南:从 U 盘制作到内置盘四阶段实操与常见坑点

Apple 已停止支持的 Intel 老 Mac,走完本文后你得到的是:运行所选版本的 macOS(Big Sur 到 Sequoia 任选),图形加速开启,Wi-Fi、蓝牙正常,而且还能继续收到官方 OTA(空中下载)更新。OpenCore Legacy Patcher(下称 OCLP)就是让这一切成立的开源工具,它把不受支持的机型打补丁后装进更新版的系统。 原理一句话:OpenCore 是插

gitblog_00510的博客 259
上一篇: kubectl 源码分析之config set-cluster
下一篇: kubectl源码分析之config set-context
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、付费专栏及课程。

余额充值