基于jenkins和K8S构建devops(开发运维一体化)
敏捷开发--》持续集成--》持续交付--》持续部署
代码:编译
java: maven
go: go build
python: app.py
敏捷开发:实现敏捷开发(微服务)
持续集成:多个代码分支进行集成,最后到主干
持续集成工具:jenkins
持续交付:将集成后的代码放到预生产环境(测试环境)中测试
持续部署:K8S
K8S在Devops中可实现的功能:
自动化
多集群管理
多环境一致性
devops容器云平台工作流程:
主jenkins:
安装kubernetes插件
添加关联的K8S集群
pipline:流水线
第一步:拉取代码
第二步:编译代码
maven --> jar
go --> 二进制文件
第三步:将编译后的文件基于dockerfile制作成镜像
第四步:将镜像传到镜像仓库(harbor仓库)
第五步:写yaml文件(开发、测试、生产)
主jenkins调用K8S api,在K8S中创建一个pod,在其中运行主jenkins的从服务,完成以后,此pod将会被删除
实验:
搭建harbor
在K8S中安装jenkins:
安装NFS(master做服务的,node做客户端)
设置服务器路径的权限: chown -R 1000:1000 $目录
创建jenkins-k8s名称空间
基于pv.yaml文件创建PV
pvc.yaml创建PVC
创建jenkins-k8s-sa,并给名称空间授权
导入jenkins最新版、jenkins-slave镜像
jenkins-deployment.yaml安装jenkins(需要修改jenkins为最新版号)
jenkins-service.yaml创建svc
浏览器访问jenkins
登录
安装kubernetes插件(若充实几次后仍然有未安装的,采用本地安装)
创建账号密码
保存进入
本地安装jenkins中的kubernetes插件
访问清华源下载对应插件,导入Jenkins网页,导入并安装
第2章-Jenkins-K8S构建DevOps
本章所讲内容:
2.1 什么是 DevOps?
2.2 k8s 在 DevOps 中可实现的功能
2.3 DevOps 容器云平台工作流程
2.4 Jenkins+k8s+Git 构建企业级 DevOps 自动化容器云平台
2.1 什么是 DevOps?
DevOps 中的 Dev 是 Devlopment(开发),Ops 是 Operation(运维),用一句话来说 DevOps就是打通开发运维的壁垒,实现开发运维一体化。DevOps 整个流程包括敏捷开发->持续集成->持续交付->持续部署。
2.1.1 敏捷开发
提高开发效率,及时跟进用户需求,缩短开发周期。
敏捷开发包括编写代码和构建代码两个阶段,可以使用 git 或者 svn 来管理代码,用 maven 对代码进行构建
java: maven go:go build python: app.py
如何做到敏捷开发: 通过微服务架构
2.1.2 持续集成(CI)
持续集成强调开发人员提交了新代码之后,立刻自动的进行构建、(单元)测试。根据测试结果,我们可以确定新代码和原有代码能否正确地集成在一起。持续集成过程中很重视自动化测试验证结果,对可能出现的一些问题进行预警,以保障最终合并的代码没有问题。
常见的持续集成工具:
1. Jenkins
Jenkins 是用 Java 语言编写的,是目前使用最多和最受欢迎的持续集成工具,使用 Jenkins,可以
自动监测到 git 或者 svn 存储库代码的更新,基于最新的代码进行构建,把构建好的源码或者镜像发布到生产环境。Jenkins 还有个非常好的功能:它可以在多台机器上进行分布式地构建和负载测试
2. TeamCity
3. Travis CI
4. Go CD
5. Bamboo
6. GitLab CI
7. Codeship
它的好处主要有以下几点:
1) 较早的发现错误:每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,哪个环节出现问题都可以较早的发现。
2) 快速的发现错误:每完成一部分代码的更新,就会把代码集成到主干中,这样就可以快速的发现错误,比较容易的定位错误。
3) 提升团队绩效:持续集成中代码更新速度快,能及时发现小问题并进行修改,使团队能创造出更好的产品。
4) 防止分支过多的偏离主干:经常持续集成,会使分支代码经常向主干更新,当单元测试失败或者出现 bug,如果开发者需要在没有调试的情况下恢复仓库的代码到没有 bug 的状态,只有很小部分的代码会丢失。
持续集成的目的是提高代码质量,让产品快速的更新迭代。它的核心措施是,代码集成到主干之前, 必须通过自动化测试。只要有一个测试用例失败,就不能集成。
Martin Fowler 说过,"持续集成并不能消除 Bug,而是让它们非常容易发现和改正。"
互动:Martin Fowler 是谁? 马丁·福勒
马丁·福勒是一个软件开发方面的著作者和国际知名演说家,专注于面向对象分析与设计,统一建模语言,领域建模,以及敏捷软件开发方法,包括极限编程。
与持续集成相关的还有持续交付和持续部署。
2.1.3 持续交付
持续交付在持续集成的基础上,将集成后的代码部署到更贴近真实运行环境的「类生产环境」
(production-like environments)中。交付给质量团队或者用户,以供评审。如果评审通过,代码就进入生产阶段。如果所有的代码完成之后一起交付,会导致很多问题爆发出来,解决起来很麻烦,所以持续集成,也就是每更新一次代码,都向下交付一次,这样可以及时发现问题,及时解决,防止问题大量堆积。
2.1.4 持续部署
持续部署是指当交付的代码通过评审之后,自动部署到生产环境中。持续部署是持续交付的最高阶段。Puppet,SaltStack 和 Ansible 是这个阶段使用的流行工具。容器化工具在部署阶段也发挥着重要作用。 Docker 和 k8s 是流行的工具,有助于在开发,测试和生产环境中实现一致性。 除此之外,k8s 还可以实现自动扩容缩容等功能。
2.2 k8s 在 DevOps 中可实现的功能
2.2.1 自动化
持续交付->持续部署。
2.2.2 多集群管理
可以根据客户需求对开发,测试,生产环境部署多套 kubernetes 集群,每个环境使用独立的物理资
源,相互之间避免影响。或者,可以搭建一套 k8s,划分名称空间,给不同的环境用。
2.2.3 多环境一致性
Kubernetes 是基于 docker 的容器编排工具,因为容器的镜像是不可变的,所以镜像把 OS、业务代码、运行环境、程序库、目录结构都包含在内,镜像保存在我们的私有仓库,只要用户从我们提供的私有仓库拉取镜像,就能保证环境的一致性。
2.3 DevOps 容器云平台工作流程
Jenkins—>k8s,帮助你创建一个 pod,pod 里面封装的是 jenkins 服务主 Jenkins pipeline 流水线:
第一步:从 gitlab 拉代码
第二步:对代码编译打包并且把代码传到代码扫描仓库 sonarqube:mvn 生成 jar、war、go build 生成一个可执行的文件、.py
第三步:把 jar 或者 war 包基于 dockerfile 构建镜像第四步: 把镜像传到镜像仓库 harbor
第五步:写 yaml 文件,把开发、测试、生产环境的资源对应的 yaml 都写出来
主 jenkins 构建 pipeline,调用 k8s api,在 k8s 里创建一个 pod,这个 pod 里面运行的是jenkins 服务,只不过这个 pod 里运行的 jenkins 服务是 jenkins 从节点,刚才这五个步骤,都是在jenkins 从节点这个 pod 里做的。完整之后,jenkins 从节点这个 pod 就会被删除。主 jenkins 是包工头, 从是临时工。
2.4 搭建 Harbor
新创建一台虚拟机安装 harbor,配置如下:
| 主机名 | ip | 配置 |
|---|---|---|
| harbor | 192.168.20.206 | 4vCPU/4G 内存/60G 硬盘 |
修改主机名:
在 192.168.20.206上:
关闭 selinux,设置永久关闭,这样重启机器 selinux 也处于关闭状态可用下面方式修改:
上面文件修改之后,需要重启虚拟机,如果测试环境可以用如下命令强制重启:
注:生产环境不要 reboot -f,要正常关机重启
配置 yum 源
[root@harbor ~]# yum install yum-utils -y
[root@harbor ~]# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
安装软件包
[root@harbor ~]# yum -y install wget net-tools nfs-utils lrzsz gcc gcc-c++ make cmake libxml2-devel openssl-devel curl curl-devel unzip sudo ntp libaio-devel wget vim ncurses-devel autoconf automake zlib-devel python-devel epel-release openssh-server socat ipvsadm conntrack ntpdate yum-utils device-mapper-persistent-data lvm2 telnet
关闭 firewalld 防火墙
配置时间同步
编辑计划任务,每分钟做一次同步
1)[root@harbor ~]# crontab -e
* * * * * /usr/sbin/ntpdate cn.pool.ntp.org
修改内核参数
[root@harbor ~]# modprobe br_netfilter
[root@harbor ~]# cat <<EOF >/etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
[root@harbor ~]# sysctl -p /etc/sysctl.d/k8s.conf
2.4.1 安装 Harbor
所有节点 主机的 hosts 文件保持一致,可按如下方法修改: 在/etc/hosts 文件增加如下几行:
192.168.20.201 k8s-master01 m1
192.168.20.202 k8s-master02 m2
192.168.20.203 k8s-master03 m3
192.168.20.204 k8s-node01 n1
192.168.20.205 k8s-node02 n2
192.168.20.206 harbor.yq.com harbor
配置 xuegod63 到 harbor 免密码登陆在 xuegod63 上操作
[root@xuegod63 ~]# cd /root && ssh-copy-id -i .ssh/id_rsa.pub root@harbor #上面需要输入 yes 之后,输入密码,输入 harbor 物理机密码即可
为 Harbor 自签发证书
生成 ca 证书:
[root@harbor ssl]# openssl genrsa -out ca.key 3072 #生成一个 3072 位的 key,也就是私钥
[root@harbor ssl]# openssl req -new -x509 -days 3650 -key ca.key -out ca.pem
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank
For some fields there will be a default value, If you enter '.', the field will be left blank.
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:guangdong Locality Name (eg, city) [Default City]: shenzhen
Organization Name (eg, company) [Default Company Ltd]:xuegod Organizational Unit Name (eg, section) []:CA
Common Name (eg, your name or your server's hostname) []:harbor Email Address [][:mk@163.com](mailto:mk@163.com)
#生成一个数字证书 ca.pem,3650 表示证书的有效时间是 10 年,按箭头提示填写即可,没有箭头标注的为空:
#生成域名的证书:
[root@harbor ssl]# openssl genrsa -out harbor.key 3072 #生成一个 3072 位的 key,也就是私钥
[root@harbor ssl]# openssl req -new -key harbor.key -out harbor.csr
You are about to be asked to enter information that will be incorporated into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank
For some fields there will be a default value, If you enter '.', the field will be left blank.
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:guangdong Locality Name (eg, city) [Default City]: shenzhen
Organization Name (eg, company) [Default Company Ltd]:xuegod Organizational Unit Name (eg, section) []:CA
Common Name (eg, your name or your server's hostname) []:harbor Email Address [][:mk@163.com](mailto:mk@163.com)
Please enter the following 'extra' attributes to be sent with your certificate request
A challenge password []:
An optional company name []:
签发证书:
[root@harbor ssl]# openssl x509 -req -in harbor.csr -CA ca.pem -CAkey ca.key -CAcreateserial -out harbor.pem -days 3650
查看证书是否有效:
[root@harbor ssl]# openssl x509 -noout -text -in harbor.pem
显示如下,说明有效:
Certificate:
Data:
Version: 1 (0x0) Serial Number:
cd:21:3c:44:64:17:65:40
Signature Algorithm: sha256WithRSAEncryption
Issuer: C=CH, ST=BJ, L=BJ, O=Default Company Ltd Validity
Not Before: Dec 26 09:29:19 2020 GMT
Not After : Dec 24 09:29:19 2030 GMT
Subject: C=CN, ST=BJ, L=BJ, O=xuegod Ltd, CN=harbor Subject Public Key Info:
Public Key Algorithm: rsaEncryption Public-Key: (3072 bit)
Modulus:
00:b0:60:c3:e6:35:70:11:c8:73:83:38:9a:7e:b8:
。。。
安装 docker
[root@harbor~]# yum install docker-ce -y #启动 docker 服务
[root@harbor ~]# systemctl start docker && systemctl enable docker
配置镜像加速器
写入如下内容:
{"registry-mirrors":["https://rsbud4vc.mirror.aliyuncs.com","https://registry.docker- cn.com","https://docker.mirrors.ustc.edu.cn","https://dockerhub.azk8s.cn",["http:](http://hub-/)/[/hub-](http://hub-/) mirror.c.163.com",["http](http://qtid6917.mirror.aliyuncs.com/):[//qtid6917.mirror.aliyuncs.com](http://qtid6917.mirror.aliyuncs.com/)","https://rncxm540.mirror.aliyuncs. com","https://e9yneuy4.mirror.aliyuncs.com"],
"insecure-registries":["192.168.2.206","harbor"]
}
重启 docker 服务使配置生效
安装 harbor
创建安装目录
把 harbor 的离线包 harbor-offline-installer-v2.3.0-rc3.tgz 上传到这个目录,离线包在课件里提供了
下载 harbor 离线包的地址:
https://github.com/goharbor/harbor/releases
解压:
[root@harbor harbor]# tar -xf harbor-offline-installer-v2.3.0-rc3.tgz
[root@harbor harbor]# mv harbor/* .
[root@harbor harbor]# cp harbor.yml.tmpl harbor.yml
[root@harbor harbor]# vim harbor.yml
修改配置文件:
hostname: harbor
修改 hostname,跟上面签发的证书域名保持一致#协议用 https
certificate: /data/install/ssl/harbor.pem
private_key: /data/install/ssl/harbor.key
邮件和 ldap 不需要配置,在 harbor 的 web 界面可以配置
其他配置采用默认即可修改之后保存退出
注:harbor 默认的账号密码:admin/Harbor12345
安装 docker-compose
下载二进制文件上传至 linux(课程资料已提供 docker-compose 二进制文件可直接上传)
[root@harbor ~]# rz
[root@harbor ~]# cd /usr/local/bin/
[root@harbor bin]# mv docker-compose-Linux-x86_64.64 docker-compose
# 添加执行权限
[root@harbor bin]# chmod a+x docker-compose
注: docker-compose 项目是 Docker 官方的开源项目,负责实现对 Docker 容器集群的快速编排。Docker-Compose 的工程配置文件默认为 docker-compose.yml,Docker-Compose 运行目录下的必要有一个 docker-compose.yml。docker-compose 可以管理多个 docker 实例。
安装 harbor 需要的离线镜像包 docker-harbor-2-3-0.tar.gz 在课件,可上传到 harbor,通过docker load -i 解压
[root@harbor harbor]# docker load -i docker-harbor-2-3-0.tar.gz
[root@harbor harbor]# cd /data/install/harbor
[root@harbor harbor]# ./install.sh
在自己电脑修改 hosts 文件
在 hosts 文件添加如下一行,然后保存即可
扩展:
如何停掉 harbor:
如何启动 harbor:
如果 docker-compose start 启动 harbor 之后,还是访问不了,那就需要重启虚拟机
2.4.2 **Harbor 图像化界面使用说明配置自己电脑的 hosts 文件: **
C:\Windows\System32\drivers\etc
打开 hosts 文件,修改如下:
在浏览器输入:
接收风险并继续,出现如下界面,说明访问正常
账号:admin
密码:Harbor12345
输入账号密码出现如下:
所有基础镜像都会放在 library 里面,这是一个公开的镜像仓库
新建项目->起个项目名字 test(把访问级别公开那个选中,让项目才可以被公开使用)
2.4.3 在 k8s 节点 xuegod63 和 xuegod64 上测试使用 harbor 镜像仓库
#修改 docker 配置
[root@xuegod63 ~]# vim /etc/docker/daemon.json
{
"registry-mirrors":["https://vh3bm52y.mirror.aliyuncs.com","https://registry.docker-
cn.com","https://docker.mirrors.ustc.edu.cn","https://dockerhub.azk8s.cn","http://hub- mirror.c.163.com"],
"exec-opts": ["native.cgroupdriver=systemd"], "insecure-registries":["192.168.1.62","harbor"]
}
[root@xuegod64~]# vim /etc/docker/daemon.json
{
"registry-mirrors":["https://vh3bm52y.mirror.aliyuncs.com","https://registry.docker-
cn.com","https://docker.mirrors.ustc.edu.cn","https://dockerhub.azk8s.cn","http://hub- mirror.c.163.com"],
"exec-opts": ["native.cgroupdriver=systemd"], "insecure-registries":["192.168.1.62","harbor"]
}
修改配置之后重启 docker:
[root@xuegod63 ~]# systemctl restart docker [root@xuegod64 ~]#systemctl restart docker
登录 harbor:
[root@xuegod63]# docker login 192.168.1.62
Username:admin Password: Harbor12345
输入账号密码之后看到如下,说明登录成功了:
Login Succeeded
登录 harbor:
[root@xuegod64]# docker login 192.168.1.62
Username:admin Password: Harbor12345
输入账号密码之后看到如下,说明登录成功了:
Login Succeeded
#导入 busybox 镜像,busybox.tar.gz 在课件里[root@xuegod63 ~]# docker load -i busybox.tar.gz #把 tomcat 镜像打标签
[root@xuegod63 ~]# docker tag busybox:latest 192.168.1.62/test/busybox:v1 执行上面命令就会把 192.168.1.62/test/busybox:v1 上传到 harbor 里的 test 项目下[root@xuegod63 ~]# docker push 192.168.1.62/test/busybox:v1
执行上面命令就会把 192.168.1.62/test/tomcat:v1 上传到 harbor 里的 test 项目下
2.5 Jenkins+k8s+Git 构建企业级 DevOps 自动化容器云平台
2.5.1 安装 Jenkins
可用如下两种方法
1) 通过 docker 直接下载 jenkins 镜像,基于镜像启动服务
2) 在 k8s 中部署 Jenkins 服务,我们课程基于此方法
2.5.2 安装 nfs 服务
#选择自己的任意一台机器,我选择 k8s 的控制节点 k8s-master0
1)、在 控制节点 上安装 nfs,作为服务端
2) 、在 工作节点 上安装 nfs,作为客户端
[root@k8s-node01 ~]# yum install nfs-utils -y && systemctl enable nfs
[root@k8s-node02 ~]# yum install nfs-utils -y && systemctl enable nfs
3) 、在 控制节点 上创建一个 nfs 共享目录
#新增如下一行
使配置文件生效
2.5.3 在 kubernetes 中部署 jenkins
(1) 创建名称空间
(2) 创建 pv
[root@k8s-master01 jenkins]# cat pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: jenkins-k8s-pv
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteMany
nfs:
server: 192.168.20.201
path: /data/v1
#更新资源清单文件
(3) 创建 pvc
[root@k8s-master01 jenkins]# cat pvc.yaml
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: jenkins-k8s-pvc
namespace: jenkins-k8s
spec:
resources:
requests:
storage: 10Gi
accessModes:
- ReadWriteMany
更新资源清单文件
#查看 pvc 和 pv 绑定是否成功
[root@k8s-master01 jenkins]# kubectl get pvc -n jenkins-k8s
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
jenkins-k8s-pvc Bound jenkins-k8s-pv 10Gi RWX 45s
(4) 创建一个 sa 账号
(5) 把上面的 sa 账号做 rbac 授权
[root@k8s-master01 jenkins]# kubectl create clusterrolebinding jenkins-k8s-sa-cluster --clusterrole=cluster-admin --serviceaccount=jenkins-k8s:jenkins-k8s-sa
(6) 通过 deployment 部署jenkins
注:下面实验用到的镜像是 jenkins-jnlp.tar.gz 压缩包封装的镜像,把压缩包上传到 k8s 的工作节点,用如下方法手动解压:
containerd:
[root@k8s-node01 jenkins]# ctr -n=k8s.io images import jenkins-slave-latest.tar.gz
[root@k8s-node01 jenkins]# ctr -n=k8s.io images import jenkins2.410.tar.gz
[root@k8s-node02 jenkins]# ctr -n=k8s.io images import jenkins-slave-latest.tar.gz
[root@k8s-node02 jenkins]# ctr -n=k8s.io images import jenkins2.410.tar.gz
docker:
[root@k8s-node01 jenkins]# docker load -i jenkins-slave-latest.tar.gz
[root@k8s-node01 jenkins]# docker load -i jenkins2.410.tar.gz
[root@k8s-node02 jenkins]# docker load -i jenkins-slave-latest.tar.gz
[root@k8s-node02 jenkins]# docker load -i jenkins2.410.tar.gz
[root@k8s-master01 jenkins]# cat jenkins-deployment.yaml
kind: Deployment
apiVersion: apps/v1
metadata:
name: jenkins
namespace: jenkins-k8s
spec:
replicas: 1
selector:
matchLabels:
app: jenkins
template:
metadata:
labels:
app: jenkins
spec:
serviceAccount: jenkins-k8s-sa
containers:
- name: jenkins
image: jenkins/jenkins:2.410
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8080
name: web
protocol: TCP
- containerPort: 50000
name: agent
protocol: TCP
livenessProbe:
httpGet:
path: /login
port: 8080
initialDelaySeconds: 60
timeoutSeconds: 5
failureThreshold: 12
readinessProbe:
httpGet:
path: /login
port: 8080
initialDelaySeconds: 60
timeoutSeconds: 5
failureThreshold: 12
volumeMounts:
- name: jenkins-volume
subPath: jenkins-home
mountPath: /var/jenkins_home
volumes:
- name: jenkins-volume
persistentVolumeClaim:
claimName: jenkins-k8s-pvc
更新资源清单文件
[root@k8s-master01 jenkins]# kubectl get pods -n jenkins-k8s
NAME READY STATUS RESTARTS AGE
jenkins-686dcfb594-77s8w 0/1 CrashLoopBackOff 1 (20s ago) 21s
上面可以看到 CrashLoopBackOff,解决方法如下:
#查看jenkins-686dcfb594-77s8w 日志
[root@k8s-master01 jenkins]# kubectl logs jenkins-686dcfb594-77s8w -n jenkins-k8s
touch: cannot touch '/var/jenkins_home/copy_reference_file.log': Permission denied
Can not write to /var/jenkins_home/copy_reference_file.log. Wrong volume permissions?
上面问题是因为/data/v1 目录权限问题,按如下方法解决:
[root@k8s-master01 jenkins]# kubectl delete -f jenkins-deployment.yaml
[root@k8s-master01 jenkins]# kubectl apply -f jenkins-deployment.yaml
[root@k8s-master01 ~]# kubectl get pod -n jenkins-k8s
NAME READY STATUS RESTARTS AGE
jenkins-686dcfb594-49kpw 1/1 Running 1 (4m11s ago) 6m28s
(7) 把 jenkins 前端加上 service,提供外部网络访问
[root@k8s-master01 jenkins]# cat jenkins-service.yaml
apiVersion: v1
kind: Service
metadata:
name: jenkins-service
namespace: jenkins-k8s
labels:
app: jenkins
spec:
selector:
app: jenkins
type: NodePort
ports:
- name: web
port: 8080
targetPort: web
nodePort: 30002
- name: agent
port: 50000
targetPort: agent
#更新资源清单文件
[root@k8s-master01 jenkins]# kubectl get svc -n jenkins-k8s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
jenkins-service NodePort 10.97.104.141 <none> 8080:30002/TCP,50000:31525/TCP 19s
2.5.4 配置 Jenkins
在浏览器访问 jenkins 的web 界面:
http://192.168.20.201:30002/login?from=%2F
1) 获取管理员密码
在 nfs 服务端,也就是我们的k8s-master01节点获取密码:
$ kubectl exec -it -njenkins-k8s jenkins-686dcfb594-9sjrw -- bash
$ cat /var/jenkins_home/secrets/initialAdminPassword
或者:
[root@k8s-master01 jenkins]# cat /data/v1/jenkins-home/secrets/initialAdminPassword
40b0b04dfd634f88add3b92a05e1039c
把获取到的密码拷贝到上面管理员密码下的方框里点击继续,出现如下界面
2) 安装插件
安装推荐的插件
如果有的插件安装失败,可以多试几次:
插件安装好之后显示如下
3) 创建第一个管理员用户
修改好之后点击保存并完成,出现如下界面
点击保存并完成,出现如下界面
点击开始使用 Jenkins
方法 1:手动安装插件,按照如下方法:
系统管理-插件管理:在这里找到自己要下载的插件的名字和版本号:
在这里下载: 插件下载地址:
http://mirrors.tuna.tsinghua.edu.cn/jenkins/plugins/
或
http://updates.jenkins-ci.org/download/plugins/
比如我要下载:gitlab-api,版本是:1.0.6
下载: https://mirrors.tuna.tsinghua.edu.cn/jenkins/plugins/gitlab-api/1.0.6/ #在有网的环境下,把自己需要的插件下载好,然后再从本地上传。
上传插件,选择:系统管理->插件管理->高级
2.5.5 测试 jenkins 的 CI/CD
登录 harbor,创建一个新项目:
#在 Jenkins 中安装 kubernetes 插件
(1)在 jenkins 中安装 k8s 插件
Manage Jnekins------>插件管理------>可选插件------>搜索 kubernetes---- >出现如下
备注,也可以离线安装 jenkins 插件:
http://mirrors.tuna.tsinghua.edu.cn/jenkins/plugins/
选中 kubernetes 之后------>点击下面的直接安装------>安装之后选择重新启动 jenkins---> http://192.168.1.63:30002/restart-->重启之后登陆 jenkins 即可
#配置 jenkins 连接到我们存在的 k8s 集群
(1)访问 http://192.168.1.63:30002/configureClouds/
测试 jenkins 和k8s 是否可以通信
点击连接测试,如果显示 Connection test successful 或者显示Connected to Kubernetes 1.23
说明测试成功,Jenkins 可以和 k8s 进行通信
配置 k8s 集群的时候 jenkins 地址需要写上面域名的形式,配置之后执行如下:
http://jenkins-service.jenkins-k8s.svc.cluster.local:8080
点击 Save
#配置 pod 模板
添加容器
Docker 镜像:使用 jenkins-slave-latest.tar.gz 解压出来的镜像,把这个镜像上传到 k8s 的工作节点,手动解压:docker load -i jenkins-slave-latest.tar.gz
解压出来的镜像是 jenkins-slave-latest:v1
在 Service Account 处输入jenkins-k8s-sa,这个 sa 就是我们最开始安装 jenkins 时的 sa
添加卷
添加卷------>选择 Host Path Volume
上面配置好之后,点击 save 保存
#添加 dockerhub 凭据
注意:下面需要用到 dockerhub 存放镜像,大家如果没有 dockerhub 可以自己申请一个首页------>系统管理 àcredentials--à全局--à添加凭据
username:xuegod password:19** ID:dockerhub
描述:这个地方随便写
上面修改好之后选择 create 即可
添加登录 harbor 需要的凭据
首页------>系统管理à管理凭据------- >点击 Stores scoped to Jenkins 下的第一行 jenkins,显
示如下
点击这个全局凭据,出现如下------- >
点击左侧的添加凭据,出现如下------- >
username:admin
password:Harbor12345 ID:dockerharbor
描述:随意
上面改好之后选择 create 即可
#测试通过 Jenkins 发布代码到 k8s 开发环境、测试环境、生产环境在 k8s 的控制节点创建名称空间:
[root@k8s-master01 jenkins]# kubectl create ns devlopment
[root@k8s-master01 jenkins]# kubectl create ns production
[root@k8s-master01 jenkins]# kubectl create ns qatest
回到 jenkins 首页:
http://192.168.1.63:30002/
新建任务------>输入一个任务名称处输入 jenkins-variable-test-deploy------>流水线------ >确
定------- >在 Pipeline script 处输入如下内容
node('testhan') {
stage('Clone') {
echo "1.Clone Stage"
git url: "https://gitee.com/qingcaihub/jenkins-sample"
script {
build_tag = sh(returnStdout: true, script: 'git rev-parse --short HEAD').trim()
}
}
stage('Test') {
echo "2.Test Stage"
}
stage('Build') {
echo "3.Build Docker Image Stage"
sh "docker build -t 192.168.20.206/jenkins-demo/jenkins-demo:${build_tag} ."
}
stage('Push') {
echo "4.Push Docker Image Stage"
withCredentials([usernamePassword(credentialsId: 'dockerharbor',passwordVariable: 'dockerHubPassword', usernameVariable: 'dockerHubUser')]) {
sh "docker login 192.168.20.206 -u ${dockerHubUser} -p ${dockerHubPassword}"
sh "docker push 192.168.20.206/jenkins-demo/jenkins-demo:${build_tag}"
}
}
stage('Deploy to dev') {
echo "5. Deploy DEV"
sh "sed -i 's/<BUILD_TAG>/${build_tag}/' k8s-dev-harbor.yaml "
sh "kubectl apply -f k8s-dev-harbor.yaml --validate=false"
}
stage('Promote to qa') {
def userInput = input(
id: 'userInput',
message: 'Promote to qa?',
parameters: [
[
$class: 'ChoiceParameterDefinition',
choices: "YES\nNO",
name: 'Env'
]
]
)
echo "This is a deploy step to ${userInput}"
if (userInput == "YES") {
sh "sed -i 's/<BUILD_TAG>/${build_tag}/' k8s-qa-harbor.yaml "
sh "kubectl apply -f k8s-qa-harbor.yaml --validate=false"
sh "sleep 6"
sh "kubectl get pods -n qatest"
} else {
//exit
}
}
stage('Promote to pro') {
def userInput = input(
id: 'userInput',
message: 'Promote to pro?',
parameters: [
[
$class: 'ChoiceParameterDefinition',
choices: "YES\nNO",
name: 'Env'
]
]
)
echo "This is a deploy step to ${userInput}"
if (userInput == "YES") {
sh "sed -i 's/<BUILD_TAG>/${build_tag}/' k8s-prod-harbor.yaml "
sh "kubectl apply -f k8s-prod-harbor.yaml --record --validate=false"
}
}
}
保存------- >立即构建
在左侧可以看到构建任务,如下所示:
![]() |
点击 Console Output,可以看到 pipeline 定义的步骤的详细信息
点击 Input request,部署应用到预生产环境
![]() |
点击 Input request,部署应用到生产环境
![]() |
2.5.6 验证开发、预生产、生产环境部署的应用是否正常运行
[root@xuegod63 ~]# kubectl get pods -n devlopment
| NAME | READY | STATUS | RESTARTS AGE |
|---|---|---|---|
| jenkins-demo-784885d9c9-b4jkg | 1/1 | Running | 0 6m18s |
[root@xuegod63 ~]# kubectl get pods -n qatest
NAME READY STATUS RESTARTS AGE
jenkins-demo-784885d9c9-59tsm 1/1 Running 0 5m19s [root@xuegod63 ~]# kubectl get pods -n production
| NAME | READY | STATUS | RESTARTS AGE |
|---|---|---|---|
| jenkins-demo-784885d9c9-42hz4 | 1/1 | running | 0 5m38s |
2.5.7 Jenkins 构建时间相差8小时问题
Jenkins 构建时间相差8小时问题 - 林余 - 博客园 (cnblogs.com)
浏览器进入URL:Jenkins访问地址/script
执行:System.setProperty('org.apache.commons.jelly.tags.fmt.timeZone','Asia/Shanghai')
或者:
本章总结:
2.1 什么是 DevOps?
2.2 k8s 在 DevOps 中可实现的功能
2.3 DevOps 容器云平台工作流程
2.4 Jenkins+k8s+Git 构建企业级 DevOps 自动化容器云平台




















































