庆祝公司网站上线一个网站的作用是什么
- 作者: 五速梦信息网
- 时间: 2026年03月21日 09:53
当前位置: 首页 > news >正文
庆祝公司网站上线,一个网站的作用是什么,建设网站的文案范文,网站开发完要怎么部署目录 概述实践样例yaml 中的必须字段 kubectl 代码原理kubectl 命令行设置pprof 抓取火焰图kubectl 中的 cobra 七大分组命令kubectl createcreateCmd中的builder模式createCmd中的visitor访问者模式外层VisitorFunc分析 结束 概述
k8s 版本 v1.24.16
kubectl的职责
1.主要的… 目录 概述实践样例yaml 中的必须字段 kubectl 代码原理kubectl 命令行设置pprof 抓取火焰图kubectl 中的 cobra 七大分组命令kubectl createcreateCmd中的builder模式createCmd中的visitor访问者模式外层VisitorFunc分析 结束 概述
k8s 版本 v1.24.16
kubectl的职责
1.主要的工作是处理用户提交的东西(包括命令行参数yaml文件等)2.将用户提交的这些东西组织成一个数据结构体3.再将其发送给 api server
实践
文章名链接linux k8s 源码编译及单集群测试地址k8s源码debug地址
样例 cat test/fixtures/doc-yaml/user-guide/pod.yaml apiVersion: v1
kind: Pod
metadata:name: nginxlabels:app: nginx
spec:containers:- name: nginximage: nginxports:- containerPort: 80字段名含义kindPodmetadata.namespec.containers.namespec.containers.imageimage名称:版本
对象规约(Spec) 与状态 (Status)
几乎每个 Kubernetes 对象包含两个嵌套的对象字段它们负责管理对象的配置对象 spec (规约) 和对象 status (状态)对于具有 spec 的对象必须在创建对象时设置具体内容描述你希望对象所具有的特征期望状态 (Desired State)
yaml 中的必须字段
在想要创建的 Kubernetes 对象对应的 yaml 文件中需要配置如下的字段 apiVersion - 创建该对象所使用的 Kubernetes API 的版本kind - 想要创建的对象的类别metadata - 帮助唯一标识对象的一些数据包括一个 name 字符串、UID和可选的 namespace
[roottest kubernetes]# ./cluster/kubectl.sh get pods
NAME READY STATUS RESTARTS AGE
nginx 1⁄1 Running 0 89s字段名含义NAMEnginx就是对应yaml中metadata.nameREADY就绪个数STATUS当前的状态RUNNING表示运行中RESTARTS重启的次数代表没有重启过AGE运行的时长
kubectl 代码原理
1.从命令行和 yaml 文件中获取信息2.通过 Builder 模式并将其转成一系列的资源3.最后用 Visitor 模式来迭代处理这些 Resources 源码位置 kubectl 命令行设置pprof 抓取火焰图
kubectl 中的 cobra
底层函数 NewKubectlCommand 解析在 PersistentPreRunE 设置 prrof 采集相关指令在 PersistentPostRunE 设置了 pprof 统计结果落盘执行采集 pprof cpu 的 kubelet 命令
kubectl.go – command : cmd.NewDefaultKubectlCommand()cmd.go – return NewDefaultKubectlCommandWithArgs(KubectlOptions{ –cmd : NewKubectlCommand(o)# cpu.pprof 文件在当前命令执行目录下
kubectl get node –profilecpu –profile-outputcpu.pprof
ll
使用 go 工具将 pprof 转换成 svg 火焰图
go tool pprof -svg cpu.pprof kubectl_get_node_cpu.svg
下载下来在浏览器打开七大分组命令
kubectl.go – command : cmd.NewDefaultKubectlCommand()cmd.go – var defaultConfigFlags genericclioptions.NewConfigFlags(true).WithDeprecatedPasswordFlag().WithDiscoveryBurst(300).WithDiscoveryQPS(50.0) – f : cmdutil.NewFactory(matchVersionKubeConfigFlags) – proxyCmd : proxy.NewCmdProxy(f, o.IOStreams)proxyCmd.PreRun func(cmd *cobra.Command, args []string) {kubeConfigFlags.WrapConfigFn nil}groups : templates.CommandGroups{{Message: Basic Commands (Beginner):,Commands: []*cobra.Command{create.NewCmdCreate(f, o.IOStreams),expose.NewCmdExposeService(f, o.IOStreams),run.NewCmdRun(f, o.IOStreams),set.NewCmdSet(f, o.IOStreams),},},{Message: Basic Commands (Intermediate):,Commands: []*cobra.Command{explain.NewCmdExplain(kubectl, f, o.IOStreams),getCmd,edit.NewCmdEdit(f, o.IOStreams),delete.NewCmdDelete(f, o.IOStreams),},},{Message: Deploy Commands:,Commands: []*cobra.Command{rollout.NewCmdRollout(f, o.IOStreams),scale.NewCmdScale(f, o.IOStreams),autoscale.NewCmdAutoscale(f, o.IOStreams),},},{Message: Cluster Management Commands:,Commands: []*cobra.Command{certificates.NewCmdCertificate(f, o.IOStreams),clusterinfo.NewCmdClusterInfo(f, o.IOStreams),top.NewCmdTop(f, o.IOStreams),drain.NewCmdCordon(f, o.IOStreams),drain.NewCmdUncordon(f, o.IOStreams),drain.NewCmdDrain(f, o.IOStreams),taint.NewCmdTaint(f, o.IOStreams),},},{Message: Troubleshooting and Debugging Commands:,Commands: []*cobra.Command{describe.NewCmdDescribe(kubectl, f, o.IOStreams),logs.NewCmdLogs(f, o.IOStreams),attach.NewCmdAttach(f, o.IOStreams),cmdexec.NewCmdExec(f, o.IOStreams),portforward.NewCmdPortForward(f, o.IOStreams),proxyCmd,cp.NewCmdCp(f, o.IOStreams),auth.NewCmdAuth(f, o.IOStreams),debug.NewCmdDebug(f, o.IOStreams),},},{Message: Advanced Commands:,Commands: []*cobra.Command{diff.NewCmdDiff(f, o.IOStreams),apply.NewCmdApply(kubectl, f, o.IOStreams),patch.NewCmdPatch(f, o.IOStreams),replace.NewCmdReplace(f, o.IOStreams),wait.NewCmdWait(f, o.IOStreams),kustomize.NewCmdKustomize(o.IOStreams),},},{Message: Settings Commands:,Commands: []*cobra.Command{label.NewCmdLabel(f, o.IOStreams),annotate.NewCmdAnnotate(kubectl, f, o.IOStreams),completion.NewCmdCompletion(o.IOStreams.Out, ),},},
}kubectl create
// 进入口
create.NewCmdCreate(f, o.IOStreams)// 核心的cmd.Run函数
// 校验文件参数
if cmdutil.IsFilenameSliceEmpty(o.FilenameOptions.Filenames, o.FilenameOptions.Kustomize) {ioStreams.ErrOut.Write([]byte(Error: must specify one of -f and -k\n\n))defaultRunFunc : cmdutil.DefaultSubCommandRun(ioStreams.ErrOut)defaultRunFunc(cmd, args)return
}// 完善并填充所需字段
cmdutil.CheckErr(o.Complete(f, cmd))
// 校验参数
cmdutil.CheckErr(o.ValidateArgs(cmd, args))
// 核心的RunCreate
// 发送请求与 api server 通信
cmdutil.CheckErr(o.RunCreate(f, cmd))createCmd中的builder模式 createCmd中的builder建造者设计模式 // 快速定位代码
cmdutil.CheckErr(o.RunCreate(f, cmd)) –
r : f.NewBuilder().Unstructured().Schema(schema).ContinueOnError().NamespaceParam(cmdNamespace).DefaultNamespace().FilenameParam(enforceNamespace, o.FilenameOptions).LabelSelectorParam(o.Selector).Flatten().Do()createCmd中的visitor访问者模式
访问都模式(Visitor Pattern) 是一种将数据结构与数据操作分离的设计模式指封装一些作用于某种数据结构中的各元素的操作可以在不改变数据结构的前提下定义作用于这些元素的新的操作属于行为型设计模式
使用场景
数据结构稳定作用于数据结构的操作经常变化的场景需要数据结构与数据操作分享的场景需要对不同数据类型(元素)进行操作而不使用分支判断具体类型的场景
// 快速定位代码
cmdutil.CheckErr(o.RunCreate(f, cmd)) – err r.Visit(func(info *resource.Info, err error) error {// 注意 Visit 是由 Builder 中 FilenameParam 构建的
r : f.NewBuilder()….// 构建 VisitFilenameParam(enforceNamespace, o.FilenameOptions)….// 创建 VisitDo()
// 定位
FilenameParam – b.Path(recursive, matches…) – visitors, err : ExpandPathsToFileVisitors(b.mapper, p, recursive, FileExtensions, b.schema) –visitor : FileVisitor{Path: path,StreamVisitor: NewStreamVisitor(nil, mapper, path, schema),}FilenameParam – b.Path(recursive, matches…) 位置 // NewStreamVisitor is a helper function that is useful when we want to change the fields of the struct but keep calls the same.
func NewStreamVisitor(r io.Reader, mapper *mapper, source string, schema ContentValidator) *StreamVisitor {return StreamVisitor{Reader: r,mapper: mapper,Source: source,Schema: schema,}
}// 解析 yaml 或者 json 配置
// Visit implements Visitor over a stream. StreamVisitor is able to distinct multiple resources in one stream.
func (v *StreamVisitor) Visit(fn VisitorFunc) error {d : yaml.NewYAMLOrJSONDecoder(v.Reader, 4096)for {ext : runtime.RawExtension{}if err : d.Decode(ext); err ! nil {if err io.EOF {return nil}return fmt.Errorf(error parsing %s: %v, v.Source, err)}// TODO: This needs to be able to handle object in other encodings and schemas.ext.Raw bytes.TrimSpace(ext.Raw)if len(ext.Raw) 0 || bytes.Equal(ext.Raw, []byte(null)) {continue}if err : ValidateSchema(ext.Raw, v.Schema); err ! nil {return fmt.Errorf(error validating %q: %v, v.Source, err)}info, err : v.infoForData(ext.Raw, v.Source)if err ! nil {if fnErr : fn(info, err); fnErr ! nil {return fnErr}continue}if err : fn(info, nil); err ! nil {return err}}
}// 上面方法中重点如下代码
info, err : v.infoForData(ext.Raw, v.Source)// obj 代表 k8s的对象
// gvk 代表 Group/Version/Kind 的缩写
obj, gvk, err : m.decoder.Decode(data, nil, nil)外层VisitorFunc分析
如查出错即返回错误DryRunStrategy 代表试运行策略 默认为 None 代表不试运行client 代表客户端试运行不发送请求至 serverserver 点服务端试运行发送请求但是如果会改变状态的话就不做
err r.Visit(func(info *resource.Info, err error) error { – if o.DryRunStrategy ! cmdutil.DryRunClient { – Create(info.Namespace, true, info.Object)(最终创建资源)结束
kubectl使用及进阶 至此结束。
- 上一篇: 庆阳网站建设报价做电商运营要什么条件
- 下一篇: 穹拓网站建设香水网络营销策划方案
相关文章
-
庆阳网站建设报价做电商运营要什么条件
庆阳网站建设报价做电商运营要什么条件
- 技术栈
- 2026年03月21日
-
庆阳建设局网站小企业管理系统
庆阳建设局网站小企业管理系统
- 技术栈
- 2026年03月21日
-
请选择一个网站制作软件wordpress判断用户是否登录
请选择一个网站制作软件wordpress判断用户是否登录
- 技术栈
- 2026年03月21日
-
穹拓网站建设香水网络营销策划方案
穹拓网站建设香水网络营销策划方案
- 技术栈
- 2026年03月21日
-
邱县做网站建设银行信用卡境外网站盗刷
邱县做网站建设银行信用卡境外网站盗刷
- 技术栈
- 2026年03月21日
-
求网站懂的说下开车安仁网站制作
求网站懂的说下开车安仁网站制作
- 技术栈
- 2026年03月21日






