helm源码分析之create命令

 欢迎关注我的公众号:

 目前刚开始写一个月,一共写了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 createOptions struct {//create结构体
	starter    string // --starter
	name       string
	starterDir string
}
func newCreateCmd(out io.Writer) *cobra.Command {//创建create命令
	o := &createOptions{}//初始化结构体

	cmd := &cobra.Command{//创建cobra命令
		Use:   "create NAME",
		Short: "create a new chart with the given name",
		Long:  createDesc,
		Args:  require.ExactArgs(1),
		RunE: func(cmd *cobra.Command, args []string) error {
			o.name = args[0]//设置name
			o.starterDir = helmpath.DataPath("starters")//设置starter目录
			return o.run(out)//运行
		},
	}

	cmd.Flags().StringVarP(&o.starter, "starter", "p", "", "The name or absolute path to Helm starter scaffold")//starter选项
	return cmd
}
func (o *createOptions) run(out io.Writer) error {//运行
	fmt.Fprintf(out, "Creating %s\n", o.name)//打印

	chartname := filepath.Base(o.name)//获取chart名称
	cfile := &chart.Metadata{//构造chart元数据
		Name:        chartname,
		Description: "A Helm chart for Kubernetes",
		Type:        "application",
		Version:     "0.1.0",
		AppVersion:  "0.1.0",
		APIVersion:  chart.APIVersionV2,
	}

	if o.starter != "" {//如果starter不为空
		// Create from the starter
		lstarter := filepath.Join(o.starterDir, o.starter)//获取starter路径
		// If path is absolute, we don't want to prefix it with helm starters folder
		if filepath.IsAbs(o.starter) {//如果是绝对路径,设置lstarter
			lstarter = o.starter
		}
		return chartutil.CreateFrom(cfile, filepath.Dir(o.name), lstarter)//从starter创建chart
	}

	_, err := chartutil.Create(chartname, filepath.Dir(o.name))//创建chart
	return err
}
//从starter创建chart
func CreateFrom(chartfile *chart.Metadata, dest, src string) error {
	schart, err := loader.Load(src)//加载starter chart
	if err != nil {
		return errors.Wrapf(err, "could not load %s", src)
	}

	schart.Metadata = chartfile//设置chart元数据

	var updatedTemplates []*chart.File

	for _, template := range schart.Templates {//遍历templates
		newData := transform(string(template.Data), schart.Name())//转换template chart名称
		updatedTemplates = append(updatedTemplates, &chart.File{Name: template.Name, Data: newData})
	}

	schart.Templates = updatedTemplates//设置templates
	b, err := yaml.Marshal(schart.Values)//把values转换成yaml
	if err != nil {
		return errors.Wrap(err, "reading values file")
	}

	var m map[string]interface{}
	if err := yaml.Unmarshal(transform(string(b), schart.Name()), &m); err != nil {//转换values里的chart名称,然后转成map
		return errors.Wrap(err, "transforming values file")
	}
	schart.Values = m//设置values

	// SaveDir looks for the file values.yaml when saving rather than the values
	// key in order to preserve the comments in the YAML. The name placeholder
	// needs to be replaced on that file.
	for _, f := range schart.Raw {//遍历chart文件
		if f.Name == ValuesfileName {
			f.Data = transform(string(f.Data), schart.Name())//转换文件中chart的名称
		}
	}

	return SaveDir(schart, dest)//保存chart
}
func Create(name, dir string) (string, error) {//创建chart
	path, err := filepath.Abs(dir)//获取chart绝对路径
	if err != nil {
		return path, err
	}

	if fi, err := os.Stat(path); err != nil {//判断路径是否存在
		return path, err
	} else if !fi.IsDir() {//判断路径是否是目录
		return path, errors.Errorf("no such directory %s", path)
	}

	cdir := filepath.Join(path, name)//获取chart目录
	if fi, err := os.Stat(cdir); err == nil && !fi.IsDir() {//判断chart目录是否存在并且是目录
		return cdir, errors.Errorf("file %s already exists and is not a directory", cdir)
	}

	files := []struct {//设置要生成的chart文件
		path    string
		content []byte
	}{
		{
			// Chart.yaml
			path:    filepath.Join(cdir, ChartfileName),
			content: []byte(fmt.Sprintf(defaultChartfile, name)),
		},
		{
			// values.yaml
			path:    filepath.Join(cdir, ValuesfileName),
			content: []byte(fmt.Sprintf(defaultValues, name)),
		},
		{
			// .helmignore
			path:    filepath.Join(cdir, IgnorefileName),
			content: []byte(defaultIgnore),
		},
		{
			// ingress.yaml
			path:    filepath.Join(cdir, IngressFileName),
			content: transform(defaultIngress, name),
		},
		{
			// deployment.yaml
			path:    filepath.Join(cdir, DeploymentName),
			content: transform(defaultDeployment, name),
		},
		{
			// service.yaml
			path:    filepath.Join(cdir, ServiceName),
			content: transform(defaultService, name),
		},
		{
			// serviceaccount.yaml
			path:    filepath.Join(cdir, ServiceAccountName),
			content: transform(defaultServiceAccount, name),
		},
		{
			// NOTES.txt
			path:    filepath.Join(cdir, NotesName),
			content: transform(defaultNotes, name),
		},
		{
			// _helpers.tpl
			path:    filepath.Join(cdir, HelpersName),
			content: transform(defaultHelpers, name),
		},
		{
			// test-connection.yaml
			path:    filepath.Join(cdir, TestConnectionName),
			content: transform(defaultTestConnection, name),
		},
	}

	for _, file := range files {//遍历文件
		if _, err := os.Stat(file.path); err == nil {//如果文件存在则跳过
			// File exists and is okay. Skip it.
			continue
		}
		if err := writeFile(file.path, file.content); err != nil {//写入文件到磁盘
			return cdir, err
		}
	}
	// Need to add the ChartsDir explicitly as it does not contain any file OOTB
	if err := os.MkdirAll(filepath.Join(cdir, ChartsDir), 0755); err != nil {//添加charts目录
		return cdir, err
	}
	return cdir, nil
}

<think>我们正在处理用户关于Helm命令示例和用法的查询。根据提供的引用,我们可以整理一些常见的Helm命令示例,并解释其用法。同时,我们也要注意回答的结构,确保清晰易懂。引用[1]提到了一些基本命令:-`helmversion`:查看Helm版本-`helmenv`:查看环境变量-`helmsearchrepokeyword`:在本地仓库中搜索关键字-`helmsearchhubkeyword`:在ArtifactHub中搜索关键字引用[2]介绍了Helm的基本概念,说明Helm是Kubernetes的包管理工具,使用chart来封装应用程序。引用[3]提到了打包命令的一个示例:`helm3package--sign--keymarkhuang--keyring.gnupg/secring.gpgredis`,这个命令用于打包chart并签名。基于以上信息,我们可以为用户提供一些常见的Helm命令示例,并解释其用法。由于用户要求的是命令示例和用法,我们可以按照功能分类来组织回答。**回答结构:**1.**Helm基本命令**:包括版本、环境、帮助等。2.**仓库操作**:添加、更新、搜索仓库等。3.**Chart操作**:安装、升级、回滚、卸载等。4.**Chart开发相关**:打包、签名等。5.**其他常用命令**:如列表查看、历史查看等。注意:我们引用的内容中并没有涵盖所有命令,因此我们结合Helm的通用知识来补充,但确保我们引用的部分正确使用引用标识。同时,根据系统指令,我们需要在回答末尾生成相关问题。下面开始组织回答:</think>### Helm 命令示例与用法 Helm 是 Kubernetes 的包管理工具,用于管理预配置的应用程序(Chart)。以下是常见命令示例及说明: #### 1. **基础操作** - **查看版本与环境**: ```bash $ helm version # 显示 Helm 客户端/服务端版本 [^1] $ helm env # 查看 Helm 环境变量 [^1] ``` - **帮助文档**: ```bash $ helm help # 查看所有命令帮助 $ helm <command> -h # 查看具体命令帮助(如 `helm install -h`) ``` #### 2. **仓库(Repository)管理** - **添加/更新仓库**: ```bash $ helm repo add bitnami https://charts.bitnami.com/bitnami # 添加仓库 $ helm repo update # 更新本地仓库缓存 [^2] ``` - **搜索 Chart**: ```bash $ helm search repo nginx # 从本地仓库搜索 Nginx 相关 Chart [^1] $ helm search hub postgresql # 从 Artifact Hub 搜索 PostgreSQL Chart [^1] ``` #### 3. **Chart 安装与管理** - **安装 Chart**: ```bash $ helm install my-release bitnami/nginx # 安装 nginx 并命名 release 为 "my-release" ``` - **自定义配置**(通过 `values.yaml`): ```bash $ helm install my-release -f custom-values.yaml bitnami/nginx # 使用自定义配置 ``` - **升级/回滚 Release**: ```bash $ helm upgrade my-release bitnami/nginx --version 13.2.0 # 升级到指定版本 $ helm rollback my-release 1 # 回滚到第 1 个版本 ``` - **卸载 Release**: ```bash $ helm uninstall my-release # 删除 release [^2] ``` #### 4. **开发与打包** - **创建新 Chart**: ```bash $ helm create my-chart # 生成 Chart 模板目录 ``` - **打包并签名 Chart**: ```bash $ helm package my-chart --sign --key "your-key" --keyring ~/.gnupg/secring.gpg # 打包并签名 [^3] ``` #### 5. **状态查询** - **查看已安装 Release**: ```bash $ helm list # 列出所有 release $ helm history my-release # 查看 release 历史版本 ``` - **检查 Chart 状态**: ```bash $ helm status my-release # 显示 release 详细信息(状态、资源等) ``` --- ### 关键概念说明 - **Chart**:封装 Kubernetes 应用的 YAML 文件集合,便于分发 [^2]。 - **Release**:每次安装 Chart 生成的实例,包含唯一名称和配置。 > **注意**: > - 使用 `helm repo update` 确保仓库信息最新。 > - 生产环境建议通过 `-f values.yaml` 覆盖默认配置,避免直接修改 Chart。
评论
成就一亿技术人!
拼手气红包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、付费专栏及课程。

余额充值