一.集成交付概念:
持续集成:帮助开发人员更加频繁的将代码合并到共享分支或主干中,合并之后会自动触发
构建应用,运行不同级别的代码扫描(sonarqube)和自动化测试(单元和集成测试)。
持续交付:将通过集成测试的代码合并到一个可以随时部署到生产环境的代码库。
持续部署:持续交付的延伸,就是将代码自动发布到生产环境中。
k8s中一个正常的流水线设计图如下:
一般的步骤如下:
1) 在 GitLab 中创建对应的项目;
2) 配置 Jenkins 集成 Kubernetes 集群,后期 Jenkins 的 Slave 将为在 Kubernetes 中动态创
建的 Slave;
3) Jenkins 创建对应的任务(Job),集成该项目的 Git 地址和 Kubernetes 集群;
4) 开发者将代码提交到 GitLab;
5) 如有配置钩子,推送(Push)代码会自动触发 Jenkins 构建,如没有配置钩子,需要手
动构建;
6) Jenkins 控制 Kubernetes(使用的是 Kubernetes 插件)创建 Jenkins Slave(Pod 形式);
7) Jenkins Slave 根据流水线(Pipeline)定义的步骤执行构建;
8) 通过 Dockerfile 生成镜像;
9) 将镜像提送(Push)到私有 Harbor(或者其它的镜像仓库);
10) Jenkins 再次控制 Kubernetes 进行最新的镜像部署;
11) 流水线结束删除 Jenkins Slave。
二java安装jenkins
1.通过java安装启动(简易)
(1).官网下载jdk包:
http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
注意:这里需要下载 Linux 版本。这里以jdk-8u151-linux-x64.tar.gz为例,你下载的文件可能不是这个版本,这没关系,只要后缀(.tar.gz)一致即可。
(2).创建目录
在/usr/目录下创建java目录,
mkdir /usr/local/java cd /usr/local/java
(3).解压JDK
tar -zxvf jdk-8u151-linux-x64.tar.gz
(4).设置环境变量
修改 vi /etc/profile
在 profile 文件中添加如下内容并保存:
set java environment JAVA_HOME=/usr/local/java/jdk1.8.0_151 JRE_HOME=/usr/local/java/jdk1.8.0_151/jre CLASS_PATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin export JAVA_HOME JRE_HOME CLASS_PATH PATH
注意:其中 JAVA_HOME, JRE_HOME 请根据自己的实际安装路径及 JDK 版本配置。
让修改生效:
source /etc/profile
(5).查看版本号:
[root@mas-master03 ~]# java -version java version "1.8.0_311" Java(TM) SE Runtime Environment (build 1.8.0_311-b11) Java HotSpot(TM) 64-Bit Server VM (build 25.311-b11, mixed mode)
2.通过java的war包启动jenkins
(1).启动:
[root@mas-master03 ~]#java -jar jenkins.war –httpPort=28080
工作目录: .home/.jenkins/ #jenkins以目录经行储存,没有用数据库
(2).登录设置密码用户名
(3).选择手动选择插件:
(4).把默认插件全部去掉,手动上传:
(5).设置账号密码
(6).手动下载插件复制到工作目录:
插件整合地址:链接:https://pan.baidu.com/s/1R_eUWUGlDbQerN_7yMWVUA 提取码:8888
(7).重新启动,查看最新插件
三.容器安装jenkins(2.303)
首先需要一个 Linux 服务器,配置不低于 2C4G 和 40G 硬盘。
(1)安装 Docker:
# yum install -y yum-utils device-mapper-persistent-data lvm2 # yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo # sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo # yum install docker-ce-19.03.* docker-ce-cli-19.03.* -y # systemctl daemon-reload && systemctl enable --now docker
创建 Jenkins 的数据目录,防止容器重启后数据丢失:
# mkdir /data/jenkins_data -p # chmod -R 777 /data/jenkins_data
启动 Jenkins,并配置管理员账号密码为 admin / admin123:
# docker run -d --name=jenkins --restart=always -e JENKINS_PASSWORD=admin123 -e JENKINS_USERNAME=admin -e JENKINS_HTTP_PORT_NUMBER=8080 -p 8080:8080 -p 50000:50000 -v /data/jenkins_data:/bitnami/jenkins bitnami/jenkins:2.303.1-debian-10-r29 e987d004e62b8412e33911eea2c37ffc81b559fb6c3075060b2ea78bac3cae45
其中 8080 端口为 Jenkins Web 界面的端口,50000 是 jnlp 使用的端口,后期 Jenkins Slave 需
要使用 50000 端口和 Jenkins 主节点通信。
查看 Jenkins 日志:
# docker logs -f Jenkins ... # 查看到这条日志说明 Jenkins 已完成启动 INFO: Jenkins is fully up and running
之后通过 Jenkins 宿主机的 IP+8080 即可访问 Jenkins
(2)插件安装:
登录后点击 Manage Jenkins → Manage Plugins 安装需要使用的插件:
在安装之前首先配置国内的插件源,点击 Advanced,将插件源更改为国内插件(https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json):
根据公司需求安装需要的插件:
Git Git Parameter Git Pipeline for Blue Ocean GitLab Credentials Credentials Binding Blue Ocean Blue Ocean Pipeline Editor Blue Ocean Core JS Pipeline SCM API for Blue Ocean Dashboard for Blue Ocean Build With Parameters Dynamic Extended Choice Parameter Plug-In Dynamic Parameter Plug-in Extended Choice Parameter List Git Branches Parameter Pipeline Pipeline: Declarative Kubernetes Kubernetes CLI Kubernetes Credentials Image Tag Parameter Active Choices
勾选后,点击 Download now and install after restart:
或者使用手动下载插件复制到工作目录
插件整合地址:链接:https://pan.baidu.com/s/1R_eUWUGlDbQerN_7yMWVUA 提取码:8888
下载后备份并替换/data/jenkins_data/home/plugins目录即可。
之后可以在 Installed 看到已经安装的插件:
三.安装GitLab(14.8.2)
下载最新的安装包(目前),并上传到服务器:
https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/gitlab-ce-14.8.2-ce.0.el7.x86_64.rpm
将下载后的 rpm 包,上传到服务器,之后通过 yum 直接安装即可:
# yum install -y gitlab-ce-14.8.2-ce.0.el7.x86_64.rpm
安装完成后,需要更改几处配置:
# vim /etc/gitlab/gitlab.rb
将 external_url 更改为自己的发布地址,可以是服务器的 IP,也可以是一个可被解析的域名:
external_url ‘http://192.168.0.109:8082’
大部分公司内可能已经有了 Prometheus 监控平台,所以 GitLab 自带的 Prometheus 可以无需
安装,后期可以安装 GitLab Exporter 即可进行监控。关闭 Prometheus 插件(可选):
把false的注释打开:(不然Prometheus会安装很久)
更改完成后需要重新加载配置文件:
# gitlab-ctl reconfigure
加载配置完成以后,可以看到如下信息:
Notes: Default admin account has been configured with following details: Username: root Password: You didn't opt-in to print initial root password to STDOUT. Password stored to /etc/gitlab/initial_root_password. This file will be cleaned up in first reconfigure run after 24 hours. NOTE: Because these credentials might be present in your log files in plain text, it is highly recommended to reset the password following https://docs.gitlab.com/ee/security/reset_user_password.html#reset-your-root-password. gitlab Reconfigured!
之后可以通过浏览器访问 GitLab,账号 root,默认密码在/etc/gitlab/initial_root_password:
首先创建一个组:
再创建一个项目:
之后可以将git客户端的key导入到GitLab:
首先生成密钥(如有可以无需生成)
# ssh-keygen -t rsa -C "YOUR_EMAIL@ADDRESS.COM"
将公钥的内容放在 GitLab 中即可:
# cat ~/.ssh/id_rsa.pub ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC7F7Nm2r8yhu0RZ2vDh+SdHCcgdW1WmeoP9Ag5SN4qmhnTL38W/pxIjHRkmch+iO/u3SEjuZNf4QGjqwsmKObx83do6yFrosPRteKmZUsGuDtx+SzIdY4ZH8JszL8cXofs/CI7g+97S0GUAhnBxzTuxd9p1jmqPfKFfekiWj3CbXQUm/5bwCb1a0vD8h8WJ2yEn+kk1AZRZ3Ql5j2TpC7nRAhjIbVzoBWHmjPe3BuJae4ebX3CkxdpTZLdErGoPdzXl6Iwu1k2yhcfFvaRgeZsx93Fyou3Acv1qzBs30wsNYzIp/9OmbzkL5FgyeKgfr+qCrSbqvpppSYjGM1KHbw/ root@k8s-master01
在 GitLab 找到 Profil
然后客户端拉取代码
[root@k8s-master01 opt]# git clone git@192.168.0.111:kubernetes/test-project.git Cloning into 'test-project'... remote: Enumerating objects: 3, done. remote: Counting objects: 100% (3/3), done. remote: Compressing objects: 100% (2/2), done. remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0 Receiving objects: 100% (3/3), done.
创建几个文件,然后提交测试:
[root@k8s-master01 test-project]# ls README.md [root@k8s-master01 test-project]# vim README.md [root@k8s-master01 test-project]# git add . [root@k8s-master01 test-project]# git config --global user.email yan@example.com You have new mail in /var/spool/mail/root [root@k8s-master01 test-project]# git config --global user.name "yanjing" [root@k8s-master01 test-project]# git commit -am "first commit" [main 39c011c] first commit 1 file changed, 2 insertions(+), 92 deletions(-) rewrite README.md (99%) [root@k8s-master01 test-project]# git push origin main Counting objects: 5, done. Delta compression using up to 2 threads. Compressing objects: 100% (1/1), done. Writing objects: 100% (3/3), 282 bytes | 0 bytes/s, done. Total 3 (delta 0), reused 0 (delta 0) To git@192.168.0.111:kubernetes/test-project.git 68e6306..39c011c main -> main
四.安装Harbor(2.4.1)
首先在 GitHub 下载最新的 Harbor 离线包,并上传至 Harbor 服务器,官方下载地址:
https://github.com/goharbor/harbor/releases/
由于 Harbor 是采用 docker-compose 一键部署的,所以 Harbor 服务器也需要安装 Docker:
# yum install -y yum-utils device-mapper-persistent-data lvm2 # yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo # sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo # yum install docker-ce-19.03.* docker-ce-cli-19.03.* -y # systemctl daemon-reload && systemctl enable --now docker
安装完成后,将下载的 Harbor 离线包解压并载入 Harbor 镜像:
# tar xf harbor-offline-installer-v2.4.1.tgz # cd harbor # docker load -i harbor.v2.4.1.tar.gz
之后安装 Compose:
# curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose # chmod +x /usr/local/bin/docker-compose # docker-compose -v docker-compose version 1.29.2, build 5becea4c
Harbor 默认提供了一个配置文件模板,需要更改如下字段:
# cp harbor.yml.tmpl harbor.yml # vim harbor.yml
测试环境不需要https,注释掉:
➢ hostname:Harbor 的访问地址,可以是域名或者 IP,生产推荐使用域名,并且带有证书;
➢ https:域名证书的配置,生产环境需要配置权威证书供 Harbor 使用,否则需要添加insecure-registry 配置,由于是学习环境,所以本示例未配置证书;
➢ 账号密码按需修改即可,默认为 admin:Harbor12345。
➢ 修改 Harbor 的数据目录:
创建 Harbor 数据目录并进行预配置:
# mkdir /data/harbor /var/log/harbor -p # ./prepare prepare base dir is set to /root/harbor WARNING:root:WARNING: HTTP protocol is insecure. Harbor will deprecate http protocol in the future. Please make sure to upgrade to https Generated configuration file: /config/portal/nginx.conf Generated configuration file: /config/log/logrotate.conf Generated configuration file: /config/log/rsyslog_docker.conf Generated configuration file: /config/nginx/nginx.conf Generated configuration file: /config/core/env Generated configuration file: /config/core/app.conf Generated configuration file: /config/registry/config.yml Generated configuration file: /config/registryctl/env Generated configuration file: /config/registryctl/config.yml Generated configuration file: /config/db/env Generated configuration file: /config/jobservice/env Generated configuration file: /config/jobservice/config.yml Generated and saved secret to file: /data/secret/keys/secretkey Successfully called func: create_root_cert Generated configuration file: /compose_location/docker-compose.yml Clean up the input dir
执行安装:
# ./prepare ... [Step 5]: starting Harbor ... Creating network "harbor_harbor" with the default driver Creating harbor-log ... done Creating registryctl ... done Creating registry ... done Creating harbor-portal ... done Creating redis ... done Creating harbor-db ... done Creating harbor-core ... done Creating nginx ... done Creating harbor-jobservice ... done ✔ ----Harbor has been installed and started successfully.----
成功启动后,即可通过配置的地址或域名访问:
如果配置不是https协议,所有的Kubernetes节点的Docker(如果是containerd 作为Runtime,可以参考下文配置 insecure-registry)都需要添加 insecure-registries 配置:
# vi /etc/docker/daemon.json { "exec-opts": ["native.cgroupdriver=systemd"], "insecure-registries": ["YOUR_HARBOR_ADDRESS"] } # systemctl daemon-reload # systemctl restart docker
登录测试:
[root@k8s-node02 ~]# docker login 192.168.0.110 Username: admin Password: WARNING! Your password will be stored unencrypted in /root/.docker/config.json. Configure a credential helper to remove this warning. See https://docs.docker.com/engine/reference/commandline/login/#credentials-store Login Succeeded
测试推送镜像到仓库:
改tag:格式: 远程仓库IP地址或域名/项目名称/镜像名称:版本号
[root@k8s-node02 ~]# docker tag registry.cn-beijing.aliyuncs.com/dotbalo/coredns:1.7.0 192.168.0.110/yan/coredns:1.7.0 [root@k8s-node02 ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE registry.cn-beijing.aliyuncs.com/dotbalo/controller v1.0.0 ef43679c2cae 6 months ago 283MB registry.cn-beijing.aliyuncs.com/dotbalo/node v3.15.3 d45bf977dfbf 17 months ago 262MB registry.cn-beijing.aliyuncs.com/dotbalo/pod2daemon-flexvol v3.15.3 963564fb95ed 17 months ago 22.8MB registry.cn-beijing.aliyuncs.com/dotbalo/cni v3.15.3 ca5564c06ea0 17 months ago 110MB 192.168.0.110/yan/coredns 1.7.0 bfe3a36ebd25 20 months ago 45.2MB registry.cn-beijing.aliyuncs.com/dotbalo/coredns 1.7.0 bfe3a36ebd25 20 months ago 45.2MB registry.cn-hangzhou.aliyuncs.com/google_containers/pause-amd64 3.2 80d28bedfe5d 2 years ago 683kB [root@k8s-node02 ~]# docker push 192.168.0.110/yan/coredns:1.7.0 The push refers to repository [192.168.0.110/yan/coredns] 96d17b0b58a7: Pushed 225df95e717c: Pushed 1.7.0: digest: sha256:242d440e3192ffbcecd40e9536891f4d9be46a650363f3a004497c2070f96f5a size: 739
之后就可以在 Harbor 查看该镜像:
五.配置凭证 Credentials
Harbor 的账号密码、GitLab 的私钥、Kubernetes 的证书均使用 Jenkins 的 Credentials 管理。
在下图对应位置可以配置凭证:
1.配置 Kubernetes 证书
首先需要找到集群中的 KUBECONFIG,一般是 kubectl 节点的~/.kube/config 文件,或者是KUBECONFIG 环境变量所指向的文件。
接下来只需要把证书文件放置于 Jenkins 的 Credentials 中即可。首先点击 Manage Jenkins,之后点击 Manage Credentials:
➢ File:KUBECONFIG 文件或其它加密文件;
➢ ID:该凭证的 ID;
➢ Description:证书的描述。
2.配置 Harbor 账号密码
对于账号密码和 Key 类型的凭证,配置步骤是一致的,只是选择的凭证类型不一样。接下来通过 Jenkins 凭证管理 Harbor 的账号密码。
在同样的位置点击 Add Credentials:
选择类型为 Username with password:
➢ Username:Harbor 或者其它平台的用户名;
➢ Password:Harbor 或者其它平台的密码;
➢ ID:该凭证的 ID;
➢ Description:证书的描述。
3.配置 GitLab Key
点击 Add Credentials,类型选择为 SSH Username with private key:
➢ Username:用户名,无强制性;
➢ Private Key:Jenkins 服务器的私钥,一般位于~/.ssh/id_rsa。
六.配置 Agent
通常情况下,Jenkins Slave 会通过 Jenkins Master 节点的 50000 端口与之通信,所以需要开启 Agent 的 50000 端口。
点击 Manage Jenkins,然后点击 Configure Global Security:
在安全配置下方找到 Agents,点击 Fixed,输入 50000 即可:
实际使用时,没有必要把整个 Kubernetes 集群的节点都充当创建 Jenkins Slave Pod 的节点,可以选择任意的一个或多个节点作为创建 Slave Pod 的节点。
假设 k8s-node01 作为 Slave 节点:
# kubectl label node k8s-node01 build=true
如果集群并非使用 Docker 作为 Runtime,但是由于构建镜像时,需要使用 Docker,所以该
节点需要安装 Docker:
# yum install -y yum-utils device-mapper-persistent-data lvm2 # yum-config-manager --add-repo https://mirrors.aliyun.com/dockerce/linux/centos/docker-ce.repo # sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo # yum install docker-ce-19.03.* docker-ce-cli-19.03.* -y # systemctl daemon-reload && systemctl enable --now docker
如果镜像仓库未配置证书,需要配置 insecure-registry:
# cat /etc/docker/daemon.json { "exec-opts": ["native.cgroupdriver=systemd"], "insecure-registries": ["CHANGE_HERE_FOR_YOUR_HARBOR_ADDRESS"] # 添加此 行 }
七.配置 Kubernetes 多集群
1.选择系统配置→节点管理
2.点击 Configure Clouds:
3.点击 Add a new cloud,选择 Kubernetes,之后在 Name 字段,输入集群的名称,一般按照可识别的名称即可,比如现在是学习环境的 Kubernetes 可以叫做“kubernetes-study”。之后点击 Kubernetes Cloud details:
4.然后在 Credentials 处选择之前添加 Kubernetes 证书,选择后点击 Test Connection,最后在凭证下方即可看到能否正常连接的结果:
最后点击 Save 即可,添加完 Kubernetes 后,在 Jenkinsfile 的 Agent 中,就可以选择该集群作为创建 Slave 的集群。
如果想要添加多个集群,重复上述的步骤即可。首先添加 Kubernetes 凭证,然后添加 Cloud即可。