一、需求

实现高兼容性的基于k8s的cicd流程

二、实验环境

需求应用地址k8s_master192.168.200.115k8s_slave1192.168.200.116k8s_slave2192.168.200.117jenknis192.168.200.216:8080sonar192.168.200.216:9000gitlab192.168.200.215harbor192.168.200.218

三、相关环境安装(不重点介绍,不熟悉的介绍自查)

1.k8s集群安装

本次采用开源的可视化KuboardSpray安装 相关参考地址:https://kuboard-spray.cn/ (生产环境还是建议用kubeadm等成熟方案安装集群)

2.jenkins安装

查看官方本都安装yum安装(centos/redhat版本): https://pkg.jenkins.io/redhat/

3.Gitlab安装

使用国内镜像库:https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/ 找到最新版本rpm安装即可

4.sonar安装

本地安装参考(需要安装pgsql数据库): https://blog.csdn.net/leonnew/article/details/118754604

5.sonar集成jenkins

首先,在Jenkins系统管理 -> 插件管理里找到SonarQube Scanner for Jenkins插件直接安装。 插件安装好之后,到Jenkins系统管理 -> 全局工具配置 配置SonarQube Scanner,如下

配置SonarQube Server用到的 Server authentication token,直接在右边点添加,弹出来框直接添加凭据,其中的Secret是从SonarQube我的账号 -> 安全 中生成: 配置SonarQube Server用到的 Server authentication token,直接在右边点添加,弹出来框直接添加凭据,其中的Secret是从SonarQube我的账号 -> 安全 中生成:

6.harbor安装

使用docker-compose安装(建议开启https,要么会有上传报错,可以再腾讯云等申请免费一年证书): 参考:https://blog.csdn.net/qq_39876923/article/details/117303719

四、Jenkins master位于k8s集群外,实现jenkins slave的动态构建

1.安装kubernetes插件

登录jenkins,点击 Manage Jenkins --> Manage Plugins --> 可选插件

在搜索框中,输入关键字 kubernetes

勾选Kubernetes,点击直接安装 等待几分钟,提示安装完成。重新登录jenkins,返回首页。点击 Manage Jenkins --> Configure System 将网页拉动到最底下,点击新增一个云,就会出现Kubernetes k8s集群信息

[root@master ~]# kubectl cluster-info

Kubernetes control plane is running at https://127.0.0.1:6443

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.

2.创建admin证书

安装cfssl 此工具生成证书非常方便, pem证书与crt证书,编码一致可直接使用 登录k8s master节点执行

wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64

chmod +x cfssl_linux-amd64

mv cfssl_linux-amd64 /usr/local/bin/cfssl

wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64

chmod +x cfssljson_linux-amd64

mv cfssljson_linux-amd64 /usr/local/bin/cfssljson

wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64

chmod +x cfssl-certinfo_linux-amd64

mv cfssl-certinfo_linux-amd64 /usr/local/bin/cfssl-certinfo

准备证书签名请求

vim admin-csr.json

{

"CN": "admin",

"hosts": [],

"key": {

"algo": "rsa",

"size": 2048

},

"names": [

{

"C": "CN",

"ST": "HangZhou",

"L": "XS",

"O": "system:masters",

"OU": "System"

}

]

}

证书请求中的O 指定该证书的 Group 为 system:masters

而 RBAC 预定义的 ClusterRoleBinding 将 Group system:masters 与 ClusterRole cluster-admin 绑定,这就赋予了该证书具有所有集群权限 。

创建证书和私钥

cfssl gencert -ca=/etc/kubernetes/pki/ca.crt -ca-key=/etc/kubernetes/pki/ca.key --profile=kubernetes admin-csr.json | cfssljson -bare admin

最终生成以下3个文件:

admin.csr

admin-key.pem

admin.pem

配置证书 生成pkc格式证书 我们可以通过openssl来转换成pkc格式:

openssl pkcs12 -export -out ./jenkins-admin.pfx -inkey ./admin-key.pem -in ./admin.pem -passout pass:secret

将jenkins-admin.pfx 下载至桌面

3.配置jenkins认证

Kubernetes 服务证书 key 使用以下命令查看

root@k8s-master:~# cat /etc/kubernetes/pki/ca.crt

新建namespace kube-ops 得到jenkins-admin.pfk文件后,点击Jenkins配置Credentials后面的Add,配置如下

上传证书 选择文件 jenkins-admin.pfk 输入密码 secret,后面的内容可以不填写,点击添加。 选择 凭据,点击连接测试。 出现 Connection test successful 表示连接成功。

4.添加Jenkins地址

1,开启代理,并且关闭跨站保护 高版本jenkins不能界面禁用跨站请求伪造保护。 禁用跨站请求伪造保护操作如下: 修改jenkins的配置文件。

vim /etc/sysconfig/jenkins ###修改下面的

JENKINS_JAVA_OPTIONS="-Djava.awt.headless=true -Dhudson.security.csrf.GlobalCrumbIssuerConfiguration.DISABLE_CSRF_PROTECTION=true"

配置后重启jenkins。 service jenkins restart (一定要重启) 2.Kubernetes下面配置jenkins地址

5.配置 Pod Template

其实就是配置 Jenkins Slave 运行的 Pod 模板,命名空间我们同样是用 kube-ops,Labels 这里也非常重要,对于后面执行 Job 的时候需要用到该值,然后我们这里使用的是 cnych/jenkins:jnlp 这个镜像,这个镜像是在官方的 jnlp 镜像基础上定制的,加入了 kubectl 等一些实用的工具。 另外我们这里还需要使用到一个拥有相关权限的 serviceAccount:jenkins2,我们这里只是给 jenkins 赋予了一些必要的权限,当然如果你对 serviceAccount 的权限不是很熟悉的话,我们给这个 sa 绑定一个 cluster-admin 的集群角色权限也是可以的,当然这样具有一定的安全风险:(rbac.yaml) $ kubectl create -f rbac.yaml

apiVersion: v1

kind: ServiceAccount

metadata:

name: jenkins2

namespace: kube-ops

---

kind: ClusterRole

apiVersion: rbac.authorization.k8s.io/v1beta1

metadata:

name: jenkins2

rules:

- apiGroups: ["extensions", "apps"]

resources: ["deployments"]

verbs: ["create", "delete", "get", "list", "watch", "patch", "update"]

- apiGroups: [""]

resources: ["services"]

verbs: ["create", "delete", "get", "list", "watch", "patch", "update"]

- apiGroups: [""]

resources: ["pods"]

verbs: ["create","delete","get","list","patch","update","watch"]

- apiGroups: [""]

resources: ["pods/exec"]

verbs: ["create","delete","get","list","patch","update","watch"]

- apiGroups: [""]

resources: ["pods/log"]

verbs: ["get","list","watch"]

- apiGroups: [""]

resources: ["secrets"]

verbs: ["get"]

---

apiVersion: rbac.authorization.k8s.io/v1beta1

kind: ClusterRoleBinding

metadata:

name: jenkins2

namespace: kube-ops

roleRef:

apiGroup: rbac.authorization.k8s.io

kind: ClusterRole

name: jenkins2

subjects:

- kind: ServiceAccount

name: jenkins2

namespace: kube-ops

这完成后k8s和jenkins动态结合的方式

五、优点

Jenkins 安装完成了,接下来我们不用急着就去使用,我们要了解下在 Kubernetes 环境下面使用 Jenkins 有什么好处。

我们知道持续构建与发布是我们日常工作中必不可少的一个步骤,目前大多公司都采用 Jenkins 集群来搭建符合需求的 CI/CD 流程,然而传统的 Jenkins Slave 一主多从方式会存在一些痛点,比如:

每个 Slave 的配置环境不一样,来完成不同语言的编译打包等操作,但是这些差异化的配置导致管理起来非常不方便,维护起来也是比较费劲 资源分配不均衡,有的 Slave 要运行的 job 出现排队等待,而有的 Slave 处于空闲状态 资源有浪费,每台 Slave 可能是物理机或者虚拟机,当 Slave 处于空闲状态时,也不会完全释放掉资源。

正因为上面的这些种种痛点,我们渴望一种更高效更可靠的方式来完成这个 CI/CD 流程,而 Docker 虚拟化容器技术能很好的解决这个痛点,又特别是在 Kubernetes 集群环境下面能够更好来解决上面的问题,下图是基于 Kubernetes 搭建 Jenkins 集群的简单示意图:

精彩文章

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。