opskumu / helm-wrapper

A Helm3 HTTP Server Wrapper by helm Go SDK, help you manage helm charts with HTTP RESTFul API
MIT License
202 stars 84 forks source link

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

Open dnsisme opened 2 years ago

opskumu commented 2 years ago

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

dnsisme commented 2 years ago

@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…]()

你有遇到这个问题吗?

opskumu commented 2 years ago

@dnsisme 图都挂了

opskumu commented 2 years ago

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

dnsisme commented 2 years ago

@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

opskumu commented 2 years ago

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

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

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

opskumu commented 2 years ago

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

opskumu commented 2 years ago
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
    }
dnsisme commented 2 years ago

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

opskumu commented 2 years ago

@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=
dnsisme commented 2 years ago

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

opskumu commented 2 years ago

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

dnsisme commented 2 years ago

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

image
opskumu commented 2 years ago

卡住了,也不报错吗

dnsisme commented 2 years ago

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

image

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

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

opskumu commented 2 years ago

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

dnsisme commented 2 years ago

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

opskumu commented 2 years ago

@opskumu

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

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

dnsisme commented 2 years ago

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

image

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

opskumu commented 1 year ago

@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: <>
dnsisme commented 1 year ago

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

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

opskumu commented 1 year ago

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

dnsisme commented 1 year ago

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

image

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

opskumu commented 1 year ago
image

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

opskumu commented 1 year ago

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

opskumu commented 1 year ago

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

dnsisme commented 1 year ago

@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的接口,直接实现安装更新。

opskumu commented 1 year ago
image

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

opskumu commented 1 year ago

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

dnsisme commented 1 year ago

@opskumu

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

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

image
opskumu commented 1 year ago

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

dnsisme commented 1 year ago

@opskumu 已经merge

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

image

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

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

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

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

image

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

image

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

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

opskumu commented 1 year ago

@dnsisme 只需要 create_namespace 就可以了

opskumu commented 1 year ago

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

dnsisme commented 1 year ago

@opskumu

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

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

opskumu commented 1 year ago

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

dnsisme commented 1 year ago

@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)
}
dnsisme commented 1 year ago

@opskumu image

这里不加*吗 image

opskumu commented 1 year ago

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

dnsisme commented 1 year ago

@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名称以及完整目录吗~

opskumu commented 1 year ago

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

image
dnsisme commented 1 year ago

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

opskumu commented 1 year ago

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

dnsisme commented 1 year ago

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

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

opskumu commented 1 year ago

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

dnsisme commented 1 year ago

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

image

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

opskumu commented 1 year ago

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