how to modify params of delivery mode from url to request.body ?
dnsisme opened this issue · comments
@opskumu
您好 上次你提到的修改参数传递方式开发完成了,实现思路,就是将之前的url传递参数方式更新为通过body方式传递参数。
我遇到一个新的问题,无论是以二进制程序的启动方式启动程序还是直接go run main.go启动程序,从办公网甚至是本地请求查看releases接口信息的时候,出现连接集群报错如下:
这里我首先把apiserver 6443代理映射成内网可以访问的端口范围:8000-9000:kubectl proxy --address='0.0.0.0' --accept-hosts='^*$' --port=8009
你有遇到这个问题吗?
另外需要确认下你 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=
根据源码修改测试连接结果如下
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
}
@dnsisme kubeConfig
直接指定文件名就好了,不要读取啊,这里是它的文件路径,不是内容
file := dir + "/conf/kube/config"
kubeConfig, err := os.ReadFile(file)
if err != nil {
panic(err)
}
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 如果 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
昨天一直卡住,今天重试可以请求到了,如下
这里我如果需要区分多集群的话就将~/.kube/config中下面的值赋给kubeContext吗?
我发现我们三个k8s集群的值都是一样的,这个怎么区分呀?我是否可以将其自己修改成一个自定义的值,用来区分三个集群呢?
kubernetes-admin@cluster.local
@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接口即可呢?
你出现的问题是不是本身目标的 chart 有问题呢
确实是我长传的chart不对,没找到,所以报如上问题。现在是我直接调用upgraderelease接口,第一次安装一个新的服务,这里我想请问下如何动态实现存在则更新不存在则安装呢,我按照如下方式传递参数以后,正常应该是直接安装ihcloud-console这个应用,但还是提示如下问题。其中debug这个namespace已经存在啦,所以设置create_namespace为false,另一个参数不懂具体啥意思,也设置了false.
1、我多次测试发现一个新的应用无法直接通过upgraderelease接口实现安装,会提示"xxx" has no deployed releases问题,这里确实没有发布过,但是按照传递参数情况需要直接安装在传递进来的namespace下,结果没安装成功。
2、直接调用install接口测试在一个新空间下安装一个新应用,报错如下。
3、我直接对已存在的应用不做任何的更改调用upgraderelease接口,可以完成更新。
这里我希望对外只暴露一个upgraderelease的接口,直接实现安装更新。
- 你第一个问题报错应该是远程包的问题导致的,而且你这个貌似指定的是本地的啊
- 确认了下当前版本是支持的,已经验证是可以的
@opskumu
大佬,感谢支持,第一个问题我已经解决,现在请教以下几点问题~
1、现在唯一的问题就是调用upgraderelease接口,设置create_namespace: true,结果装不上去,提示如下:
2、我尝试调用installrelease接口在新空间下安装应用,设置create_namespace:true,结果也是装不上去,提示如下:
这里我确定使用的chart部署包是通过参数传递下载到agent上的最新部署包
你验证的时候是直接通过upgraderelease接口在一个新空间下去安装一个新应用吗?这里除了设置create_namespace:true,dependency_update:true,以外还需要注意啥呢?
你可以测试当前 master 分支的代码
感谢大佬 啊 太难了 呜呜呜 我的代码库加上了master下2022.8月份以来的最新提交,但还是存在同样的问题。
当前master的测试需要调整一堆信息,我优先查看创建namespace失败和第一次部署应用调用upgraderelease失败的问题吧
就真的很奇怪,我对比master检查了很多遍install接口的代码没看到异常,唯一的区别是我自己下载chart将本地的chart赋值给cp,然后注释掉了这里的方法
在上面基础上我加了一些打印日志发现调用这个源码有报错,后来我把LocateChart取消注释后还是有下面同样的问题
// 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)
}
你要看 runInstall func 是不是是指针,这里就是个 struct,不需要加 * 啊
@opskumu
感谢大佬 我这边参数传递问题 部署安装功能都调通了
不过有个问题就是支持多集群的部署,是同样需要维护多套kubeconfig以及通过kube_context来区分吗?
@opskumu
大佬 还是想请教下你 你这边有试过一套配置管理多个k8s集群吗
默认我们三个集群的kubeconfig中context内容是一样的 我如何自定义生效这里的context name,然后实现我通过一个配置中kube_context不同的值,操作不同的k8s集群呢?
@opskumu
大佬 请教下 我们没有做任何更改 突然出现下面问题
Kubernetes cluster unreachable: the server has asked for the client to provide credentials
有遇到过吗,如何修复呢~
是不是你的 kubeconfig 证书有问题啊
@opskumu
大佬 遇到这个问题没?
问题一:支持的pod重启策略类型:Always,其他的类型:OnFailure、Never不支持。
这里能否都支持呢
问题二:helm部署的时候,如果已存在的release是failed状态,那么调用upgrade接口更新还是失败,无法成功,除非手动helm delete掉failed的release,再触发部署才可以成功。