devops基于jenkins和k8s的cicd相关环境准备(一 )

一、需求

实现高兼容性的基于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

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

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,如下

devops基于jenkins和k8s的cicd相关环境准备(一 )_第1张图片
配置SonarQube Server用到的 Server authentication token,直接在右边点添加,弹出来框直接添加凭据,其中的Secret是从SonarQube我的账号 -> 安全 中生成:
devops基于jenkins和k8s的cicd相关环境准备(一 )_第2张图片
配置SonarQube Server用到的 Server authentication token,直接在右边点添加,弹出来框直接添加凭据,其中的Secret是从SonarQube我的账号 -> 安全 中生成:

devops基于jenkins和k8s的cicd相关环境准备(一 )_第3张图片

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,点击直接安装
devops基于jenkins和k8s的cicd相关环境准备(一 )_第4张图片
等待几分钟,提示安装完成。重新登录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
devops基于jenkins和k8s的cicd相关环境准备(一 )_第5张图片
得到jenkins-admin.pfk文件后,点击Jenkins配置Credentials后面的Add,配置如下

上传证书
devops基于jenkins和k8s的cicd相关环境准备(一 )_第6张图片
选择文件 jenkins-admin.pfk
devops基于jenkins和k8s的cicd相关环境准备(一 )_第7张图片
输入密码 secret,后面的内容可以不填写,点击添加。
devops基于jenkins和k8s的cicd相关环境准备(一 )_第8张图片
选择 凭据,点击连接测试。
出现 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 (一定要重启)
devops基于jenkins和k8s的cicd相关环境准备(一 )_第9张图片
2.Kubernetes下面配置jenkins地址
devops基于jenkins和k8s的cicd相关环境准备(一 )_第10张图片

5.配置 Pod Template

其实就是配置 Jenkins Slave 运行的 Pod 模板,命名空间我们同样是用 kube-ops,Labels 这里也非常重要,对于后面执行 Job 的时候需要用到该值,然后我们这里使用的是 cnych/jenkins:jnlp 这个镜像,这个镜像是在官方的 jnlp 镜像基础上定制的,加入了 kubectl 等一些实用的工具。
devops基于jenkins和k8s的cicd相关环境准备(一 )_第11张图片
devops基于jenkins和k8s的cicd相关环境准备(一 )_第12张图片
devops基于jenkins和k8s的cicd相关环境准备(一 )_第13张图片
devops基于jenkins和k8s的cicd相关环境准备(一 )_第14张图片
另外我们这里还需要使用到一个拥有相关权限的 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 集群的简单示意图:
devops基于jenkins和k8s的cicd相关环境准备(一 )_第15张图片

你可能感兴趣的:(devosp,k8s,jenkins,jenkins,devops,运维)