Kubernetes - Jenkins integration



我已经用kubeadm kubernetes 1.9 rbac群集自行启动,并且我已经在基于jenkins/jenkins的Pod Jenkins内部开始。我想尝试https://github.com/jenkinsci/kubernetes-plugin。我已经根据https://gist.github.com/lachie83/17c1fff4eb58cf75cf75fb11a4957a64d2

中的提案创建了一个ServiceAccount
> kubectl -n dev-infra create sa jenkins
> kubectl create clusterrolebinding jenkins --clusterrole cluster-admin --serviceaccount=dev-infra:jenkins
> kubectl -n dev-infra get sa jenkins -o yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  creationTimestamp: 2018-02-16T12:06:26Z
  name: jenkins
  namespace: dev-infra
  resourceVersion: "1295580"
  selfLink: /api/v1/namespaces/dev-infra/serviceaccounts/jenkins
  uid: d040041c-1311-11e8-a4f8-005056039a14
secrets:
- name: jenkins-token-vmt79
> kubectl -n dev-infra get secret jenkins-token-vmt79 -o yaml
apiVersion: v1
data:
  ca.crt: LS0tL...0tLQo=
  namespace: ZGV2LWluZnJh
  token: ZXlK...tdVE=
kind: Secret
metadata:
  annotations:
    kubernetes.io/service-account.name: jenkins
    kubernetes.io/service-account.uid: d040041c-1311-11e8-a4f8-005056039a14
  creationTimestamp: 2018-02-16T12:06:26Z
  name: jenkins-token-vmt79
  namespace: dev-infra
  resourceVersion: "1295579"
  selfLink: /api/v1/namespaces/dev-infra/secrets/jenkins-token-vmt79
  uid: d041fa6c-1311-11e8-a4f8-005056039a14
type: kubernetes.io/service-account-token

之后,我去管理jenkins->配置系统 -> cloud-> kubernetes,然后将kubernetes URL设置为我在kubectl kubectl kubeconfig服务器中也使用的群集API:url:url:port。

击打测试连接时,我将获得"错误测试连接https://url:port:port执行:get at:https://url:port/api/api/v1/v1/namespaces/dev-infra/pods。消息:消息:消息:禁止!配置的服务帐户没有访问权限。服务帐户可能已被撤销。禁止使用POD:用户"系统:ServiceAccount:serviceaccount:dev-infra:default:default"无法在名称空间" dev-infra"中列出pods。

我不想给dev-infra:默认用户一个群集 - admin角色,我想使用我创建的jenkins sa。我不明白如何在Jenkins中配置凭据。当我在https://github.com/jenkinsci/kubernetes-plugin/blob/blob/master/master/configuration.png上添加凭据时

<select class="setting-input dropdownList">
<option value="0">Username with password</option>
<option value="1">Docker Host Certificate Authentication</option>
<option value="2">Kubernetes Service Account</option>
<option value="3">OpenShift OAuth token</option>
<option value="4">OpenShift Username and Password</option>
<option value="5">SSH Username with private key</option>
<option value="6">Secret file</option>
<option value="7">Secret text</option>
<option value="8">Certificate</option></select>

我找不到一个明确的示例,如何配置Jenkins Kubernetes Cloud Connector来使用我的Jenkins使用服务帐户Jenkins进行身份验证。您能帮我找到分步指南吗?我需要哪种证书?

问候,Pavel

最好的做法是使用您创建的serviceaccount启动Jenkins Master Pod,而不是在Jenkins中创建凭据

参见示例yaml

Jenkins的Kubernetes插件读取此文件/var/run/secrets/kubernetes.io/serviceaccount/token。请查看您的Jenkins Pod是否有此。该服务帐户应具有适当命名空间中的POD的权限。

实际上,我们正在使用jenkins在Kubernetes 1.9之外运行的Jenkins。我们只是选择了默认服务帐户令牌(默认名称空间(,然后将其放在Jenkins Master上。重新启动...可见kubernetes代币凭据类型。

我们确实有角色和角色扮演:

kubectl create role jenkins --verb=get,list,watch,create,patch,delete --resource=pods
kubectl create rolebinding jenkins --role=jenkins --serviceaccount=default:default

在我们的情况下,詹金斯被配置为在默认名称空间中旋转从属吊舱。因此,这种组合有效。

更多问题(类似(:当Jenkins Server不在Kubernetes群集外时,我可以使用Jenkins Kubernetes插件吗?

挖掘后,似乎最简单的方法(在不给默认服务帐户的额外权限的情况下提供名称空间(是

kubectl -n <your-namespace> create sa jenkins
kubectl create clusterrolebinding jenkins --clusterrole cluster-admin --serviceaccount=<your-namespace>:jenkins
kubectl get -n <your-namespace> sa/jenkins --template='{{range .secrets}}{{ .name }} {{end}}' | xargs -n 1 kubectl -n <your-namespace> get secret --template='{{ if .data.token }}{{ .data.token }}{{end}}' | head -n 1 | base64 -d -

似乎您可以将此令牌存储在詹金斯(Jenkins(中,并且插件可以拾取插件。与覆盖默认服务帐户相比,这种方法的另一个优点,如上所述,您可以每个群集都有秘密 - 这意味着您可以使用一个Jenkins连接到例如Dev-> Quality-> Quality-> prod -> prod namespaces或带有单独帐户的群集。

如果您有更好的路要走,请随时做出贡献。

问候,帕维尔

有关更多详细信息,您可以检查:-https://gist.github.com/lachie83/17c1fff4eb58cf75c5fb11a4957a64d2-https://github.com/openshift/origin/issues/6807

最新更新