实现高兼容性的基于k8s的cicd流程
需求应用 | 地址 |
---|---|
k8s_master | 192.168.200.115 |
k8s_slave1 | 192.168.200.116 |
k8s_slave2 | 192.168.200.117 |
jenknis | 192.168.200.216:8080 |
sonar | 192.168.200.216:9000 |
gitlab | 192.168.200.215 |
harbor | 192.168.200.218 |
本次采用开源的可视化KuboardSpray安装
相关参考地址:https://kuboard-spray.cn/
(生产环境还是建议用kubeadm等成熟方案安装集群)
查看官方本都安装yum安装(centos/redhat版本):
https://pkg.jenkins.io/redhat/
使用国内镜像库:https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/
找到最新版本rpm安装即可
本地安装参考(需要安装pgsql数据库):
https://blog.csdn.net/leonnew/article/details/118754604
首先,在Jenkins系统管理 -> 插件管理里找到SonarQube Scanner for Jenkins插件直接安装。
插件安装好之后,到Jenkins系统管理 -> 全局工具配置 配置SonarQube Scanner,如下
配置SonarQube Server用到的 Server authentication token,直接在右边点添加,弹出来框直接添加凭据,其中的Secret是从SonarQube我的账号 -> 安全 中生成:
配置SonarQube Server用到的 Server authentication token,直接在右边点添加,弹出来框直接添加凭据,其中的Secret是从SonarQube我的账号 -> 安全 中生成:
使用docker-compose安装(建议开启https,要么会有上传报错,可以再腾讯云等申请免费一年证书):
参考:https://blog.csdn.net/qq_39876923/article/details/117303719
登录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'.
安装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 下载至桌面
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 表示连接成功。
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地址
其实就是配置 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 一主多从方式会存在一些痛点,比如:
正因为上面的这些种种痛点,我们渴望一种更高效更可靠的方式来完成这个 CI/CD 流程,而 Docker 虚拟化容器技术能很好的解决这个痛点,又特别是在 Kubernetes 集群环境下面能够更好来解决上面的问题,下图是基于 Kubernetes 搭建 Jenkins 集群的简单示意图: