写点什么

Helm 部署和体验 jenkins

作者:程序员欣宸
  • 2022-11-13
    广东
  • 本文字数:3180 字

    阅读完需:约 10 分钟

Helm部署和体验jenkins

欢迎访问我的 GitHub

这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos

运行在 Kubernetes 上的 Jenkins

  • 下图来自 rancher 官方博客,在 kubernetes 环境下,jenkins 任务被交给各个 pod 执行,这些 pod 在需要时被创建,任务结束后被销毁,这样既能合理利用资源,又能给每个任务提供一致的干净的初始化环境(也可以保留 pod,如查问题的时候)

如何在 kubernetes 快速部署 jenkins

环境信息

  • 本次实战的环境信息如下:


  1. kubernetes 集群:三台 CentOS7.7 服务器

  2. kubernetes 版本:1.15.3

  3. helm 版本:2.16.1

  4. jenkins 版本:2.190.3

准备工作

本次实战的 namespace

  • 本次实战使用名为 helm-jenkins 的 namespace,执行以下命令创建:


kubectl create namespace helm-jenkins
复制代码

创建 PV

  • 为了后面的 jenkins 服务顺利启动,需要预先部署好 pv:

  • 新建名为 pv-helm-jenkins.yaml 的文件,内容如下,其中 192.168.133.142 是 NFS 服务器地址, /usr/local/work/test/002 是分配给本次实战使用的 NFS 文件夹:


apiVersion: v1kind: PersistentVolumemetadata: name: helm-jenkins namespace: helm-jenkinsspec: capacity: storage: 10Gi accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Recycle nfs: path: /usr/local/work/test/002 server: 192.168.133.142
复制代码


  • 执行命令 kubectl create -f pv-helm-jenkins.yaml ,创建 PV;

  • 查看 PV 是否已经就绪:


[root@node1 helm-jenkins]# kubectl get pvNAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGEhelm-jenkins 10Gi RWO Recycle Available 5s 14h
复制代码

helm 安装 jenkins

  • 确保 helm2.16.1 版本安装完毕,并且可以正常工作:


[root@node1 helm-jenkins]# helm versionClient: &version.Version{SemVer:"v2.16.1", GitCommit:"bbdfe5e7803a12bbdf97e94cd847859890cf4050", GitTreeState:"clean"}Server: &version.Version{SemVer:"v2.16.1", GitCommit:"bbdfe5e7803a12bbdf97e94cd847859890cf4050", GitTreeState:"clean"}
复制代码


  • 确保以下 helm repo 准备好(如果没有可以通过 helm repo add 添加):


[root@node1 helm-jenkins]# helm repo listNAME URL stable https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
复制代码


  • 执行以下命令,即可创建 jenkins 的 deployment、service 等资源:


helm install --namespace helm-jenkins --name my-jenkins stable/jenkins
复制代码


  • 执行完毕后,控制台输出以下内容:


NOTES:5. Get your 'admin' user password by running: printf $(kubectl get secret --namespace helm-jenkins my-jenkins -o jsonpath="{.data.jenkins-admin-password}" | base64 --decode);echo6. Get the Jenkins URL to visit by running these commands in the same shell: NOTE: It may take a few minutes for the LoadBalancer IP to be available. You can watch the status of by running 'kubectl get svc --namespace helm-jenkins -w my-jenkins' export SERVICE_IP=$(kubectl get svc --namespace helm-jenkins my-jenkins --template "{{ range (index .status.loadBalancer.ingress 0) }}{{ . }}{{ end }}") echo http://$SERVICE_IP:8080/login
7. Login with the password from step 1 and the username: admin
复制代码


  • 上述内容的第一条给出重要提示:获取 admin 账号密码的方法,执行以下命令即可:


printf $(kubectl get secret --namespace helm-jenkins my-jenkins -o jsonpath="{.data.jenkins-admin-password}" | base64 --decode);echo
复制代码


  • 如下图红框所示,我这里得到了 admin 密码为 Eq6WxHvJ2V

  • 检查服务,发现 helm-jenkins 这个 namespace 下有两个服务: my-jenkinsmy-jenkins-agent ,前者就是 jenkins 网站,后者用来接收执行任务的 jenkins 实例的注册:


[root@node1 helm-jenkins]# kubectl get svc -n helm-jenkinsNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEmy-jenkins LoadBalancer 10.233.10.35 <pending> 8080:31763/TCP 31mmy-jenkins-agent ClusterIP 10.233.35.20 <none> 50000/TCP 31m
复制代码


  • my-jenkins 这个服务的类型是 LoadBalancer,8080 端口被映射到宿主机的 31763 端口,因此,使用 kubernetes 集群中一台宿主机的 IP,再加上 31763 端口即可通过浏览器访问;

  • 至此,jenkins 安装已完成,接下来要做必要的设置

设置 kubernetes 插件

  • 为了让 jenkins 在以下模式工作,还需要设置 kubernetes 插件

  • 点击下图红框中的"Manage Jenkins",进入设置页面:

  • 由于很多插件版本较旧,页面上会有升级提示,这里暂时用不到,因此直接点击下图红框中的"Configure System":

  • 点击下图红框 1 中的"Test Connection”按钮,您会见到红框 2 中的错误信息:

  • 产生上述错误的原因,是由于 jenkins 容器没有权限访问 kubernetes 的 api server,为了解决此问题,要先搞清楚容器的身份,我们知道容器在 kubernetes 环境中都有自己的 serviceaccount,执行命令 kubectl get serviceaccount -n helm-jenkins 查看当前 namespace 下的 serviceaccount:


[root@node1 helm-jenkins]# kubectl get serviceaccount -n helm-jenkinsNAME SECRETS AGEdefault 1 3h55m
复制代码


  • 可见 jenkins 容器的 serviceaccount 是 default

  • 知道了容器的 serviceaccount,上述问题就好解决了,我们用 RBAC 将访问 api server 所需权限绑定给 default 即可,这里为了省事儿就不将权限一一列出了,接下来直接给 default 最高权限( 生产环境千万别这么做 ,必须按需分配);

  • 新建名为 rbac-helm-jenkins-default.yaml 的文件,内容如下:


apiVersion: rbac.authorization.k8s.io/v1kind: ClusterRoleBindingmetadata: name: rbac-helm-jenkins-default namespace: helm-jenkinsroleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: cluster-adminsubjects:- kind: ServiceAccount name: default namespace: helm-jenkins
复制代码


  • 执行命令 kubectl create -f rbac-helm-jenkins-default.yaml 使得 RBAC 生效

  • 再次回到之前的页面点击"Test Connection"按钮,如下图,提示"Connection successful":

  • 接下来设置 Pod 模板参数,如下图,namepsace 要设置为 helm-jenkins ,另外要记下来 Labels 的值 my-jenkins-jenkins-slave ,后面会用到:

  • 点击底部的"Save"按钮,使设置生效;

  • 设置完毕,接下来创建任务体验一下 kubernetes 上的 jenkins 功能

体验 Freestyle project

  • 创建一个 Freestyle project,如下图:

  • 如下图红框,表单中 Label Expression 的值是前面记下来的 my-jenkins-jenkins-slave

  • 本次任务的具体内容很简单,执行一段 shell,输出"Hello World!",如下图所示:

  • 点击底部的"Save"按钮保存

  • 点击下图红框中的"Build Now",即可开始构建:

  • 如果是第一次执行,会触发 jenkins 任务 pod 的 docker 镜像的下载,您需要耐心等候一会儿;

  • 此时去控制台执行命令 kubectl get pods -n helm-jenkins 查看 pod,会发现有新的 pod 出现,如下所示,这是执行 jenkins 任务的 pod:


[root@node1 helm-jenkins]# kubectl get pods -n helm-jenkinsNAME READY STATUS RESTARTS AGEdefault-66vcq 0/1 ContainerCreating 0 1smy-jenkins-74bcdfc566-jbw28 1/1 Running 0 5h5m
复制代码


  • 返回 jenkins 页面,可见任务已经执行完毕:

  • 再去控制台查看 pod,发现刚刚创建的 pod 已经消失了

  • 至此,kubernetes 环境部署和体验 jenkins 的实战就完成了,希望本文带给您一些参考信息。

欢迎关注 InfoQ:程序员欣宸

学习路上,你不孤单,欣宸原创一路相伴...


发布于: 2022-11-13阅读数: 83
用户头像

搜索"程序员欣宸",一起畅游Java宇宙 2018-04-19 加入

前腾讯、前阿里员工,从事Java后台工作,对Docker和Kubernetes充满热爱,所有文章均为作者原创,个人Github:https://github.com/zq2599/blog_demos

评论

发布
暂无评论
Helm部署和体验jenkins_Kubernetes_程序员欣宸_InfoQ写作社区