Open dnsisme opened 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…]()
你有遇到这个问题吗?
@dnsisme 图都挂了
另外需要确认下你 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)
}
@opskumu 不好意思,我没太懂,kubeConfig存在工程目录/conf/kube下,名称就是config,直接文件名它会和其他路径下的相同文件名重合。
@dnsisme 你代码里面不需要 ReadFile,kubeConfig 是 kubeConfig 的文件路径
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我需要给传入什么呢?本地调试发现这里失败了
@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 我改成""以后本地调试还是卡在下面了
@dnsisme client.Run() 你这是做啥啊,如果要部署或者升级得传 name 啊
@opskumu 我是测试下面接口可用性 接口:/api/namespaces/releases 功能:查看指定namespace下的应用信息
卡住了,也不报错吗
@opskumu 昨天一直卡住,今天重试可以请求到了,如下
这里我如果需要区分多集群的话就将~/.kube/config中下面的值赋给kubeContext吗?
我发现我们三个k8s集群的值都是一样的,这个怎么区分呀?我是否可以将其自己修改成一个自定义的值,用来区分三个集群呢? kubernetes-admin@cluster.local
@dnsisme kubeconfig context 名需要你们自己定义的哈
@opskumu 好的,请教个其他问题,该开源代码可以实现远程云端或者是网络隔离的院端k8s集群吗?
@opskumu
好的,请教个其他问题,该开源代码可以实现远程云端或者是网络隔离的院端k8s集群吗?
主要依赖 kubeconfig,可以访问就行
@opskumu 大佬 请教下我这边镜像仓库的认证信息是通过账号密码来访问的,我这边传入这俩参数以后,发现还是回请求镜像仓库提示401
我如何成功访问到镜像仓库呢?
@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接口即可呢?
@dnsisme 通过 upgrade release 接口就好了,那个 upload chart 只是方便上传 chart 的
好的 请教下我在测试更新接口的时候出现如下问题
这里我可以通过让用户传入namespace、chart、release信息,实现程序内部判断当namespace下release存在的时候,则调用更新方法,否则调用安装release方法。这里大概怎么实现呢,是否支持?
upgrade 里面有一个 install 选项,如果不存在则安装,如果存在则更新
你出现的问题是不是本身目标的 chart 有问题呢
@dnsisme 你截图里面有密码信息,屏蔽下吧
@opskumu
确实是我长传的chart不对,没找到,所以报如上问题。现在是我直接调用upgraderelease接口,第一次安装一个新的服务,这里我想请问下如何动态实现存在则更新不存在则安装呢,我按照如下方式传递参数以后,正常应该是直接安装ihcloud-console这个应用,但还是提示如下问题。其中debug这个namespace已经存在啦,所以设置create_namespace为false,另一个参数不懂具体啥意思,也设置了false.
1、我多次测试发现一个新的应用无法直接通过upgraderelease接口实现安装,会提示"xxx" has no deployed releases问题,这里确实没有发布过,但是按照传递参数情况需要直接安装在传递进来的namespace下,结果没安装成功。
2、直接调用install接口测试在一个新空间下安装一个新应用,报错如下。
3、我直接对已存在的应用不做任何的更改调用upgraderelease接口,可以完成更新。
这里我希望对外只暴露一个upgraderelease的接口,直接实现安装更新。
create_namespace 和 dependency 那两个是 install 的选项,不过 upgrade 里面如果你指定了 install 为 true 则可以指定 create_namespace 选项
@dnsisme 另外,你是基于 master 分支的吧,之前 upgrade 有一个 bug,前一段时间才修复的
@opskumu
1、我是8.16号之前基于master分支下载的代码库.bug会影响新应用通过upgraderelease安装吗?
2、create_namespace和dependency两个参数明白了,那如果是我第一次安装需要创建namespace的话,这里create_namespace设置为true,另一个不太懂具体的影响,当我需要安装的时候也设置为true。现在是一个新的应用通过upgrade直接安装不上去。报错如下:
@dnsisme 你分支代码不支持,最新的 commit 那个就是我修复的,你可以 merge 下
@opskumu 已经merge
chart下载的问题我已经解决啦 1、第一次在新空间下调用upgraderelease接口部署应用,还是提示如下报错
2、直接调用install接口,无法创建namespace,报错如下:
@opskumu 大佬,感谢支持,第一个问题我已经解决,现在请教以下几点问题~
1、现在唯一的问题就是调用upgraderelease接口,设置create_namespace: true,结果装不上去,提示如下:
2、我尝试调用installrelease接口在新空间下安装应用,设置create_namespace:true,结果也是装不上去,提示如下:
这里我确定使用的chart部署包是通过参数传递下载到agent上的最新部署包
你验证的时候是直接通过upgraderelease接口在一个新空间下去安装一个新应用吗?这里除了设置create_namespace:true,dependency_update:true,以外还需要注意啥呢?
@dnsisme 只需要 create_namespace 就可以了
你可以测试当前 master 分支的代码
@opskumu
感谢大佬 啊 太难了 呜呜呜 我的代码库加上了master下2022.8月份以来的最新提交,但还是存在同样的问题。
当前master的测试需要调整一堆信息,我优先查看创建namespace失败和第一次部署应用调用upgraderelease失败的问题吧
@dnsisme 不应该啊,我测试确实没有问题
@opskumu
就真的很奇怪,我对比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)
}
@opskumu
这里不加*吗
你要看 runInstall func 是不是是指针,这里就是个 struct,不需要加 * 啊
@opskumu
好的 感谢大佬 这里传递的是一个struct 已修改
我现在调用uograderelease接口去安装应用,提示如下
这里的chart名称为什么重新指定一个名称提示没有文件呢? 这里我传入的chart是一个chart压缩包cp cp context is: /Users/yangning11/workspace/baidu/ihcloud/helm-wrapper/helm-wrapper-1.0.0-340169228.tgz
是需要对这个进行处理,解压然后传递解压后的chart名称以及完整目录吗~
不太明白你具体的场景,如果要安装一个 chart tar 包的话,需要在具体的路径里面,如默认的 uploadPath
是 /tmp/charts
@opskumu 感谢大佬 我这边参数传递问题 部署安装功能都调通了 不过有个问题就是支持多集群的部署,是同样需要维护多套kubeconfig以及通过kube_context来区分吗?
@dnsisme 你可以使用一个 kubeconfig 维护多个集群,通过 context 来指定多个不同的集群哈
@opskumu 大佬 还是想请教下你 你这边有试过一套配置管理多个k8s集群吗
默认我们三个集群的kubeconfig中context内容是一样的 我如何自定义生效这里的context name,然后实现我通过一个配置中kube_context不同的值,操作不同的k8s集群呢?
@dnsisme 你自己修改成不一样的,这个直接看官方文档就好了
@opskumu 大佬 请教下 我们没有做任何更改 突然出现下面问题 Kubernetes cluster unreachable: the server has asked for the client to provide credentials
有遇到过吗,如何修复呢~
是不是你的 kubeconfig 证书有问题啊
@dnsisme 你的意思是通过 url 修改 request.body 的数据吗?这个应该做不了吧