opskumu / helm-wrapper

A Helm3 HTTP Server Wrapper by helm Go SDK, help you manage helm charts with HTTP RESTFul API

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

how to modify params of delivery mode from url to request.body ?

dnsisme opened this issue · comments

commented

@dnsisme 你的意思是通过 url 修改 request.body 的数据吗?这个应该做不了吧

@opskumu
您好 上次你提到的修改参数传递方式开发完成了,实现思路,就是将之前的url传递参数方式更新为通过body方式传递参数。

我遇到一个新的问题,无论是以二进制程序的启动方式启动程序还是直接go run main.go启动程序,从办公网甚至是本地请求查看releases接口信息的时候,出现连接集群报错如下:
Uploading 51275d7e8726bf87e661818a40b60929.png…

这里我首先把apiserver 6443代理映射成内网可以访问的端口范围:8000-9000:kubectl proxy --address='0.0.0.0' --accept-hosts='^*$' --port=8009

然后在根据源码的方式赋值集群变量,去测试还是连不上。
Uploading 3ea1c77ae13609781205a294d988fc4a.png…
Uploading 4206ee89a5f0f38a2fd8631276b3e1fd.png…

你有遇到这个问题吗?

commented

@dnsisme 图都挂了

commented

另外需要确认下你 kubeconfig 配置应该是配置好的吧

@opskumu
kubeconfig就是k8s集群的~/.kube/config

apiVersion: v1
clusters:
- cluster:
    certificate-authority-data:xxx==
    server: https://10.153.70.18:6443
  name: cluster.local
- cluster:
    server: ""
  name: default
contexts:
- context:
    cluster: cluster.local
    user: kubernetes-admin
  name: kubernetes-admin@cluster.local
current-context: kubernetes-admin@cluster.local
kind: Config
preferences: {}
users:
- name: kubernetes-admin
  user:
    client-certificate-data:xxx
    client-key-data:xxx=

办公网请求报错
image

根据源码修改测试连接结果如下

func listReleases(c *gin.Context) {
	params := &_struct.ListReleasesParams{}
	err := c.BindJSON(params)
	if err != nil {
		err := errors.New("bind params error")
		respErr(c, err)
		return
	}
	namespace := params.Namespace

	//内网下请求 KubeAPIServer 的地址,默认端口:6443
	settings.KubeAPIServer = "http://10.153.70.18:8009"
	//适用于多集群的场景,用于区分不同的集群,类似于天牛的环境ID
	kubeContext := params.KubeContext
	dir, err := os.Getwd()
	if err != nil {
		panic(err)
	}
	file := dir + "/conf/kube/config"
	kubeConfig, err := os.ReadFile(file)
	if err != nil {
		panic(err)
	}

	//rr.GET("/first", func(c *gin.Context) {
	//        fmt.Println("first .........")
	//    })

	var options releaseListOptions
	err = c.ShouldBindJSON(&options)
	if err != nil && err != io.EOF {
		respErr(c, err)
		return
	}
	actionConfig, err := actionConfigInit(InitKubeInformation(namespace, kubeContext, string(kubeConfig)))
	if err != nil {
		respErr(c, err)
		return
	}

image

源码如下
image

commented

@dnsisme kubeConfig 直接指定文件名就好了,不要读取啊,这里是它的文件路径,不是内容

	file := dir + "/conf/kube/config"
	kubeConfig, err := os.ReadFile(file)
	if err != nil {
		panic(err)
	}

@opskumu
不好意思,我没太懂,kubeConfig存在工程目录/conf/kube下,名称就是config,直接文件名它会和其他路径下的相同文件名重合。

commented

@dnsisme 你代码里面不需要 ReadFile,kubeConfig 是 kubeConfig 的文件路径

commented
func listReleases(c *gin.Context) {
        ......
        // 这就是你下面要传的 kubeConfig,kubeConfig 路径不是读取文件的内容
	kubeConfig := dir + "/conf/kube/config"   

	// kubeConfig, err := os.ReadFile(file)   
	// if err != nil {
	// 	panic(err)
	// }

	//rr.GET("/first", func(c *gin.Context) {
	//        fmt.Println("first .........")
	//    })
        ......
	actionConfig, err := actionConfigInit(InitKubeInformation(namespace, kubeContext, kubeConfig))
	if err != nil {
		respErr(c, err)
		return
	}

@opskumu 嗯嗯 我改了运行了一下 发现一个新问题 这里的kubecontext我需要给传入什么呢?本地调试发现这里失败了
image
image

commented

@dnsisme 如果 kubeconfig 是单一集群的,直接指定 "" 就好了

apiVersion: v1
clusters:
- cluster:
    certificate-authority-data:xxx==
    server: https://10.153.70.18:6443
  name: cluster.local
- cluster:
    server: ""
  name: default
contexts:
- context:
    cluster: cluster.local
    user: kubernetes-admin
  name: kubernetes-admin@cluster.local  // 这个就是 context
current-context: kubernetes-admin@cluster.local
kind: Config
preferences: {}
users:
- name: kubernetes-admin
  user:
    client-certificate-data:xxx
    client-key-data:xxx=

@opskumu
我改成""以后本地调试还是卡在下面了
image

commented

@dnsisme client.Run() 你这是做啥啊,如果要部署或者升级得传 name 啊

@opskumu
我是测试下面接口可用性
接口:/api/namespaces/releases
功能:查看指定namespace下的应用信息
image

commented

卡住了,也不报错吗

@opskumu
昨天一直卡住,今天重试可以请求到了,如下
image

这里我如果需要区分多集群的话就将~/.kube/config中下面的值赋给kubeContext吗?
image

我发现我们三个k8s集群的值都是一样的,这个怎么区分呀?我是否可以将其自己修改成一个自定义的值,用来区分三个集群呢?
kubernetes-admin@cluster.local

commented

@dnsisme kubeconfig context 名需要你们自己定义的哈

@opskumu
好的,请教个其他问题,该开源代码可以实现远程云端或者是网络隔离的院端k8s集群吗?

commented

@opskumu

好的,请教个其他问题,该开源代码可以实现远程云端或者是网络隔离的院端k8s集群吗?

主要依赖 kubeconfig,可以访问就行

@opskumu
大佬 请教下我这边镜像仓库的认证信息是通过账号密码来访问的,我这边传入这俩参数以后,发现还是回请求镜像仓库提示401

image

我如何成功访问到镜像仓库呢?

commented

@dnsisme 支持这些选项

// Entry represents a collection of parameters for chart repository
type Entry struct {
    Name                  string `json:"name"`
    URL                   string `json:"url"`
    Username              string `json:"username"`
    Password              string `json:"password"`
    CertFile              string `json:"certFile"`
    KeyFile               string `json:"keyFile"`
    CAFile                string `json:"caFile"`
    InsecureSkipTLSverify bool   `json:"insecure_skip_tls_verify"`
}

修改配置如:

helmRepos:
  - name: bitnami
    url: https://charts.bitnami.com/bitnami
    insecure_skip_tls_verify: true
    username: <>
    password: <>

@opskumu
好的 感谢大佬
请教下 我如何实现一个chart管理应用程序的更新呢?我们有chart.tar.gz的部署包,有统一管理的镜像仓库地址,镜像仓库我按照你提供的参数去传递相关值即可。

这里具体需要关注的是uploadchart接口呢还是说仅仅需要关注upgraderelease接口即可呢?

commented

@dnsisme 通过 upgrade release 接口就好了,那个 upload chart 只是方便上传 chart 的

好的 请教下我在测试更新接口的时候出现如下问题

image

这里我可以通过让用户传入namespace、chart、release信息,实现程序内部判断当namespace下release存在的时候,则调用更新方法,否则调用安装release方法。这里大概怎么实现呢,是否支持?

commented

image

upgrade 里面有一个 install 选项,如果不存在则安装,如果存在则更新

commented

你出现的问题是不是本身目标的 chart 有问题呢

commented

@dnsisme 你截图里面有密码信息,屏蔽下吧

@opskumu

确实是我长传的chart不对,没找到,所以报如上问题。现在是我直接调用upgraderelease接口,第一次安装一个新的服务,这里我想请问下如何动态实现存在则更新不存在则安装呢,我按照如下方式传递参数以后,正常应该是直接安装ihcloud-console这个应用,但还是提示如下问题。其中debug这个namespace已经存在啦,所以设置create_namespace为false,另一个参数不懂具体啥意思,也设置了false.
image

image

1、我多次测试发现一个新的应用无法直接通过upgraderelease接口实现安装,会提示"xxx" has no deployed releases问题,这里确实没有发布过,但是按照传递参数情况需要直接安装在传递进来的namespace下,结果没安装成功。
image

2、直接调用install接口测试在一个新空间下安装一个新应用,报错如下。
image

3、我直接对已存在的应用不做任何的更改调用upgraderelease接口,可以完成更新。
image
image
image

这里我希望对外只暴露一个upgraderelease的接口,直接实现安装更新。

commented

image

create_namespace 和 dependency 那两个是 install 的选项,不过 upgrade 里面如果你指定了 install 为 true 则可以指定 create_namespace 选项

commented

@dnsisme 另外,你是基于 master 分支的吧,之前 upgrade 有一个 bug,前一段时间才修复的

@opskumu

1、我是8.16号之前基于master分支下载的代码库.bug会影响新应用通过upgraderelease安装吗?

2、create_namespace和dependency两个参数明白了,那如果是我第一次安装需要创建namespace的话,这里create_namespace设置为true,另一个不太懂具体的影响,当我需要安装的时候也设置为true。现在是一个新的应用通过upgrade直接安装不上去。报错如下:
image

commented

@dnsisme 你分支代码不支持,最新的 commit 那个就是我修复的,你可以 merge 下

@opskumu
已经merge

chart下载的问题我已经解决啦
1、第一次在新空间下调用upgraderelease接口部署应用,还是提示如下报错
image

2、直接调用install接口,无法创建namespace,报错如下:
image

commented
  1. 你第一个问题报错应该是远程包的问题导致的,而且你这个貌似指定的是本地的啊
  2. 确认了下当前版本是支持的,已经验证是可以的

@opskumu
大佬,感谢支持,第一个问题我已经解决,现在请教以下几点问题~

1、现在唯一的问题就是调用upgraderelease接口,设置create_namespace: true,结果装不上去,提示如下:
image

2、我尝试调用installrelease接口在新空间下安装应用,设置create_namespace:true,结果也是装不上去,提示如下:
image

这里我确定使用的chart部署包是通过参数传递下载到agent上的最新部署包
image

你验证的时候是直接通过upgraderelease接口在一个新空间下去安装一个新应用吗?这里除了设置create_namespace:true,dependency_update:true,以外还需要注意啥呢?

commented

@dnsisme 只需要 create_namespace 就可以了

commented

你可以测试当前 master 分支的代码

@opskumu

感谢大佬 啊 太难了 呜呜呜 我的代码库加上了master下2022.8月份以来的最新提交,但还是存在同样的问题。

当前master的测试需要调整一堆信息,我优先查看创建namespace失败和第一次部署应用调用upgraderelease失败的问题吧

commented

@dnsisme 不应该啊,我测试确实没有问题

@opskumu

就真的很奇怪,我对比master检查了很多遍install接口的代码没看到异常,唯一的区别是我自己下载chart将本地的chart赋值给cp,然后注释掉了这里的方法
image

在上面基础上我加了一些打印日志发现调用这个源码有报错,后来我把LocateChart取消注释后还是有下面同样的问题
image

// Run executes the installation
//
// If DryRun is set to true, this will prepare the release, but not install it

func (i *Install) Run(chrt *chart.Chart, vals map[string]interface{}) (*release.Release, error) {
	ctx := context.Background()
	return i.RunWithContext(ctx, chrt, vals)
}

@opskumu
image

这里不加*吗
image

commented

你要看 runInstall func 是不是是指针,这里就是个 struct,不需要加 * 啊

@opskumu

好的 感谢大佬 这里传递的是一个struct 已修改

我现在调用uograderelease接口去安装应用,提示如下
image

image

image

这里的chart名称为什么重新指定一个名称提示没有文件呢?
这里我传入的chart是一个chart压缩包cp
cp context is: /Users/yangning11/workspace/baidu/ihcloud/helm-wrapper/helm-wrapper-1.0.0-340169228.tgz

是需要对这个进行处理,解压然后传递解压后的chart名称以及完整目录吗~

commented

不太明白你具体的场景,如果要安装一个 chart tar 包的话,需要在具体的路径里面,如默认的 uploadPath/tmp/charts

image

@opskumu
感谢大佬 我这边参数传递问题 部署安装功能都调通了
不过有个问题就是支持多集群的部署,是同样需要维护多套kubeconfig以及通过kube_context来区分吗?

commented

@dnsisme 你可以使用一个 kubeconfig 维护多个集群,通过 context 来指定多个不同的集群哈

@opskumu
大佬 还是想请教下你 你这边有试过一套配置管理多个k8s集群吗

默认我们三个集群的kubeconfig中context内容是一样的 我如何自定义生效这里的context name,然后实现我通过一个配置中kube_context不同的值,操作不同的k8s集群呢?

commented

@dnsisme 你自己修改成不一样的,这个直接看官方文档就好了

@opskumu
大佬 请教下 我们没有做任何更改 突然出现下面问题
Kubernetes cluster unreachable: the server has asked for the client to provide credentials
image

有遇到过吗,如何修复呢~

commented

是不是你的 kubeconfig 证书有问题啊

@opskumu
对的 感谢大佬 更新以后再次测试没问题啦

@opskumu
大佬 遇到这个问题没?
问题一:支持的pod重启策略类型:Always,其他的类型:OnFailure、Never不支持。
9db8efb016dcebfb0b7f76dc939e5a4c

这里能否都支持呢

问题二:helm部署的时候,如果已存在的release是failed状态,那么调用upgrade接口更新还是失败,无法成功,除非手动helm delete掉failed的release,再触发部署才可以成功。

commented

@dnsisme

  1. Deployment 本身就不支持哈

  2. 可以确认下 helm 本身是不是也是这样操作的,如果是的话应该是 helm 本身这么设计的吧

@opskumu
大佬 请教下 什么情况下访问apiserver 6443会提示输入账号密码认证信息?集群没有更新过,一段时间没有启动服务,再次启动测试功能提示如下:
image

server下访问以上地址报错如下:
9541b19d9c726a3ae66e5f81ce04bf35

我在网页端测试访问雀实需要输入账号密码,如下:
image

commented

@dnsisme 这个应该开启认证了吧,另外访问是走的 kubeconfig,你确认 kubeconfig 是否有问题,这个报错看着你对应地址本身设置导致的...