helm-wrapper icon indicating copy to clipboard operation
helm-wrapper copied to clipboard

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

Open dnsisme opened this issue 2 years ago • 55 comments

dnsisme avatar Sep 15 '22 07:09 dnsisme

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

opskumu avatar Sep 15 '22 08:09 opskumu

@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…

你有遇到这个问题吗?

dnsisme avatar Oct 19 '22 10:10 dnsisme

@dnsisme 图都挂了

opskumu avatar Oct 20 '22 02:10 opskumu

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

opskumu avatar Oct 20 '22 03:10 opskumu

@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: [email protected]
current-context: [email protected]
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

dnsisme avatar Oct 21 '22 03:10 dnsisme

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

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

opskumu avatar Oct 21 '22 07:10 opskumu

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

dnsisme avatar Oct 25 '22 11:10 dnsisme

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

opskumu avatar Oct 25 '22 12:10 opskumu

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 avatar Oct 25 '22 12:10 opskumu

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

dnsisme avatar Oct 25 '22 12:10 dnsisme

@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: [email protected]  // 这个就是 context
current-context: [email protected]
kind: Config
preferences: {}
users:
- name: kubernetes-admin
  user:
    client-certificate-data:xxx
    client-key-data:xxx=

opskumu avatar Oct 25 '22 12:10 opskumu

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

dnsisme avatar Oct 25 '22 12:10 dnsisme

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

opskumu avatar Oct 25 '22 13:10 opskumu

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

dnsisme avatar Oct 25 '22 13:10 dnsisme

卡住了,也不报错吗

opskumu avatar Oct 25 '22 13:10 opskumu

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

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

我发现我们三个k8s集群的值都是一样的,这个怎么区分呀?我是否可以将其自己修改成一个自定义的值,用来区分三个集群呢? [email protected]

dnsisme avatar Oct 26 '22 03:10 dnsisme

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

opskumu avatar Oct 26 '22 08:10 opskumu

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

dnsisme avatar Oct 27 '22 12:10 dnsisme

@opskumu

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

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

opskumu avatar Oct 27 '22 14:10 opskumu

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

image

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

dnsisme avatar Nov 01 '22 07:11 dnsisme

@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 avatar Nov 03 '22 02:11 opskumu

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

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

dnsisme avatar Nov 03 '22 07:11 dnsisme

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

opskumu avatar Nov 03 '22 09:11 opskumu

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

image

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

dnsisme avatar Nov 08 '22 06:11 dnsisme

image

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

opskumu avatar Nov 08 '22 06:11 opskumu

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

opskumu avatar Nov 08 '22 06:11 opskumu

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

opskumu avatar Nov 08 '22 06:11 opskumu

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

dnsisme avatar Nov 08 '22 09:11 dnsisme

image

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

opskumu avatar Nov 09 '22 03:11 opskumu

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

opskumu avatar Nov 09 '22 03:11 opskumu