大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。
Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺
create
func main() {
#随机数
rand.Seed(time.Now().UnixNano())
#创建一个新的命令行对象
command := cmd.NewDefaultKubectlCommand()
#日志
logs.InitLogs()
defer logs.FlushLogs()
#真正执行的命令行
if err := command.Execute(); err != nil {
os.Exit(1)
}
}
# NewDefaultKubectlCommand函数
# in io.Reader, out, errout io.Writer 标准输入 标准输出 标准错误输出
func NewDefaultKubectlCommandWithArgs(pluginHandler PluginHandler, args []string, in io.Reader, out, errout io.Writer) *cobra.Command {
#创建一个新的命令行
cmd := NewKubectlCommand(in, out, errout)
if len(args) > 1 {
#第一个参数 即create -f nginx_pod.yml部分
cmdPathPieces := args[1:]
#调用cmd的find函数去匹配参数
if _, _, err := cmd.Find(cmdPathPieces); err != nil {
if err := HandlePluginCommand(pluginHandler, cmdPathPieces); err != nil {
fmt.Fprintf(errout, "Error: %v\n", err)
os.Exit(1)
}
}
}
return cmd
}
func NewKubectlCommand(in io.Reader, out, err io.Writer) *cobra.Command {
#打印help出现的信息
cmds := &cobra.Command{
Use: "kubectl",
Short: i18n.T("kubectl controls the Kubernetes cluster manager"),
Long: templates.LongDesc(` kubectl controls the Kubernetes cluster manager. Find more information at: https://kubernetes.io/docs/reference/kubectl/overview/`),
Run: runHelp,
#运行函数之前的钩子
PersistentPreRunE: func(*cobra.Command, []string) error {
rest.SetDefaultWarningHandler(warningHandler)
#运行前初始化性能评估的工作
return initProfiling()
},
#运行函数之后的钩子
PersistentPostRunE: func(*cobra.Command, []string) error {
#运行后的保存性能检测的工作
if err := flushProfiling(); err != nil {
return err
}
#打印警报
if warningsAsErrors {
,,,
}
return nil
},
}
groups := templates.CommandGroups{
{
#命令的信息 初级命令
Message: "Basic Commands (Beginner):",
#里面有create expose run set 命令
Commands: []*cobra.Command{
create.NewCmdCreate(f, ioStreams),
expose.NewCmdExposeService(f, ioStreams),
run.NewCmdRun(f, ioStreams),
set.NewCmdSet(f, ioStreams),
},
},
{
#中级命令
Message: "Basic Commands (Intermediate):",
#包含explain get edit 等
Commands: []*cobra.Command{
explain.NewCmdExplain("kubectl", f, ioStreams),
get.NewCmdGet("kubectl", f, ioStreams),
edit.NewCmdEdit(f, ioStreams),
delete.NewCmdDelete(f, ioStreams),
},
},
{
#部署相关的内容
Message: "Deploy Commands:",
Commands: []*cobra.Command{
rollout.NewCmdRollout(f, ioStreams),
scale.NewCmdScale(f, ioStreams),
autoscale.NewCmdAutoscale(f, ioStreams),
},
},
...
# kubectl下面添加的其他的一些子命令
cmds.AddCommand(alpha)
cmds.AddCommand(cmdconfig.NewCmdConfig(clientcmd.NewDefaultPathOptions(), ioStreams))
cmds.AddCommand(plugin.NewCmdPlugin(ioStreams))
#create.NewCmdCreate(f, ioStreams),
func NewCmdCreate(f cmdutil.Factory, ioStreams genericclioptions.IOStreams) *cobra.Command {
o := NewCreateOptions(ioStreams)
cmd := &cobra.Command{
Use: "create -f FILENAME",#范例和我们的命令很相似
DisableFlagsInUseLine: true,
Short: i18n.T("Create a resource from a file or from stdin"),
Long: createLong,
Example: createExample, #提供的其他一些创建的实例
Run: func(cmd *cobra.Command, args []string) {
#文件名是否为空
if cmdutil.IsFilenameSliceEmpty(o.FilenameOptions.Filenames, o.FilenameOptions.Kustomize) {
...
}
#验证参数
cmdutil.CheckErr(o.ValidateArgs(cmd, args))
#真正的运行create函数
cmdutil.CheckErr(o.RunCreate(f, cmd))
},
}
...
#创建create 下面的子命令
// create subcommands
cmd.AddCommand(NewCmdCreateNamespace(f, ioStreams))
...
}
#RunCreate
#f为传入的Factory 主要是封装了与kube-apiserver交互的客户端
func (o *CreateOptions) RunCreate(f cmdutil.Factory, cmd *cobra.Command) error {
...
#验证命令是否合法
schema, err := f.Validator(cmdutil.GetFlagBool(cmd, "validate"))
if err != nil {
return err
}
...
#builder
r := f.NewBuilder().
...
NamespaceParam(cmdNamespace).DefaultNamespace().
#支持那种类型的filename 支持 管道的 也支持http 和 https的
FilenameParam(enforceNamespace, &o.FilenameOptions).
...
#真正执行代码
Do()
err = r.Err()
if err != nil {
return err
}
...
count++
#最后在命令行打印create XXX成功创建
return o.PrintObj(info.Object)
})
...
}
Create->CreateWithOptions->createResource
# createResource
#客户端采用RESTFUL风格的 runtime,object是对资源的抽象
func (m *Helper) createResource(c RESTClient, resource, namespace string, obj runtime.Object, options *metav1.CreateOptions) (runtime.Object, error) {
#Post对应RestFul里面 post方法
return c.Post().
NamespaceIfScoped(namespace, m.NamespaceScoped).
Resource(resource).
VersionedParams(options, metav1.ParameterCodec).
Body(obj).
#将request转换成result
Do(context.TODO()).
#将result转换成为资源对象
Get()
}
#Do函数
func (r *Request) Do(ctx context.Context) Result {
var result Result
#发送请求到server创建资源
err := r.request(ctx, func(req *http.Request, resp *http.Response) {
根据返回的resp和req转换对象
result = r.transformResponse(resp, req)
})
return result
}
Do –> r.request->resp, err := client.Do(req) –> resp, err := client.Do(req) –> esp, didTimeout, err = c.send(req, deadline) –> resp, didTimeout, err = send(req, c.transport(), deadline) –> RoundTrip(*Request) (*Response, error) 轮询算法 –> 发送请求给server 获得response
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/169046.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...