使用Jenkins将Helm Charts部署到Kubernetes服务器

8
我希望能够使用由Jenkins执行的Helm charts自动化部署到我的Kubernetes集群,作为构建周期的一部分。Jenkins机器与Kubernetes集群不在同一网络上(而不是像许多博客中所记录的那样是其一部分)。
我在私有GitHub账户内托管了一个chart仓库。我按照这里的步骤进行操作:https://hackernoon.com/using-a-private-github-repo-as-helm-chart-repo-https-access-95629b2af27c 并成功将其添加为Helm的仓库,并在Azure服务器上使用以下命令格式:
helm repo add sample 'https://MY_PRIVATE_TOKEN@raw.githubusercontent.com/kmzfs/helm-repo-in-github/master/'

我一直在尝试将ElasticBox Kubernetes CI/CD(v1.3)插件安装到Jenkins中,并连接到此图表库,但每当我按下“测试连接”时,都会出现400 Bad Request错误。 我已经尝试以多种方式输入详细信息:
  1. 使用与上面相同的格式(和令牌),并且没有凭据
  2. 在凭据中使用私有令牌(与上述查询相同)以及https://raw.githubusercontent.com/kmzfs/helm-repo-in-github/master/的url。
  3. 在凭据中使用我的用户名和密码,以及https://raw.githubusercontent.com/kmzfs/helm-repo-in-github/master/的url。
我用这个插件连接到Kubernetes Cloud,它可以连接到https://github.com/helm/charts上的仓库并部署RabbitMQ容器。
是否可以使该插件连接到作为图表仓库的私有Github仓库?如果可以,我该如何操作?
如果不行,是否有其他从Jenkins部署Helm图表(在私有仓库中)的替代方法? 我找不到使用Helm的其他插件。
谢谢,Duncan

那个400很可能来自github。尝试使用curl -v https://MY_PRIVATE_TOKEN@raw.githubusercontent.com/kmzfs/helm-repo-in-github/master/命令,看看它是否也返回400。 - Jonah Benton
如果我执行'curl -v 'https://<myToken>@raw.githubusercontent.com/kmzfs/repo/',会收到400错误,但是如果我使用完整路径并在路径中包含'index.yaml',那么我就可以获取yaml文件的内容。我认为这就是我能够从命令行添加Helm repo的原因。 - Duncan Martin
如果您在将仓库添加到Helm时使用了带有index.yaml的完整路径,那么是否可以正常工作? - Jonah Benton
我可以直接使用正确的URL将repo添加到helm中。问题是,我无法使用任何变体的URL(包括index.yaml)将repo添加到ElasticBox Kubernetes CI/CD(v1.3)插件中。我已经成功地将一个开放的Helm repo添加到了这个插件中(在这种情况下不需要index.yaml)。 - Duncan Martin
2个回答

8
我们在CI中使用的是纯原生工具而完全避开任何复杂的Jenkins插件。我们将 kubectl/helm 集成到 jenkins/worker镜像中,并提供凭据以便它们可以与集群通信,然后从私有 git 仓库直接获取私有 Helm chart 而非公开的 charts。最后,我们只需使用常规脚本步骤对本地克隆图表运行 helm 命令即可。
以下是定义 ca cert 的 kube config 部分示例(与下面的评论相关):
apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: <base64 ca cert>
    server: https://cluster_api_url
  name: mycluster

我开始尝试连接到 Kubernetes 集群,但是遇到了证书问题(要么是“无法连接到服务器:x509:由未知机构签名的证书”,要么是如果我使用 --insecure-skip-tls-verify=true,则为“无法连接到服务器:EOF”)。这是使用与插件可以连接的相同 Jenkins 用户。我需要进一步研究证书问题。 - Duncan Martin
你应该在 .kube/config 中拥有连接的 CA 数据来解决这个问题 - 它应该是用于创建 apiserver 证书的 CA 证书。示例已添加在上面的答案中。 - Radek 'Goblin' Pieczonka
我尝试使用kubeadm创建的集群的kubeconfig文件,但由于服务器使用的是内部IP而不是URL,因此无法从集群外部工作。然后,我创建了一个新的服务帐户,并按照此指南创建了一组新的证书:https://kubernetes.io/docs/concepts/cluster-administration/certificates/#openssl。我保留了apiserver参数,并使用此令牌从Jenkins插件进行身份验证,但它无法通过kubectl从集群外部工作。更改apiserver args只会破坏kubectl! - Duncan Martin
我应该应用这里描述的过程吗?https://kubernetes.io/docs/tasks/tls/managing-tls-in-a-cluster/ 所有这些不同的证书就是我一开始选择插件路线的原因! - Duncan Martin
这听起来像是我想做的事情,我基本上想让helm命令工作。你有一些设置示例吗?那会很有帮助。 - Vincent Gerris

1
我们正在开发一个名为Jenkins X的开源项目,它是Jenkins基金会提出的一个子项目,旨在使用Jenkins和GitOps自动化Kubernetes上的CI/CD。
我们通过在Kubernetes集群内运行Jenkins流水线来解决您遇到的一些问题;因此无需对Kubernetes集群进行身份验证-它只重用现有的RBAC。
当您将更改合并到主分支时,Jenkins X将创建一个新的语义版本化分发您的应用程序(pom.xml、jar、docker镜像、helm图表)。然后,流水线通过GitOps自动化生成拉取请求,以通过所有环境促进您的应用程序。
这里是如何使用GitOps在Kubernetes上自动化多个环境的CI/CD演示,以及在拉取请求上的预览环境-使用Spring Boot和Node.js应用程序(但我们支持许多语言+框架)。

该链接出现了 404 错误。 - Vincent Gerris

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接