以下各节点操作系统仍然均为Ubuntu 18.04。
本文假设有两个节点,主节点IP为A,从节点IP为B,以下的方案都搭建在主节点A上,此外还会用到一台个人电脑C,可以为Linux或者Windows系统。
registry主要用于对docker镜像进行收纳,作为一个docker私有仓库。如果没有自建的docker仓库的话,就需要使用公有仓库,因为在主节点打包的镜像不能在从节点上直接拉取,必须要先放到仓库中才能做到。在我搭建的实验环境是内网,所以当时镜像拉取速度很快,但是目前生产环境使用的是公网,可能效果不如放在某个公用仓库那么好了,但搭起来也不难不如顺手搭一下,这里将仓库放在从节点A上,因此以下操作都是在从节点A上进行的。
mkdir registry # 创建存放镜像的文件夹
docker run -d \
-p 5000:5000 \
-v /home/zekdot/registry:/var/lib/registry \
registry
最后进行一次验证
zekdot@A:~$ curl 127.0.0.1:5000/v2/_catalog
{"repositories":[]}
这样说明已经安装成功
使用这种方式时,仓库的使用者可能会报SSL相关的错误,所以有两种解决方法。
第一种是申请SSL证书,然后利用Nginx做一个SSL代理进行数据转发,这样让Nginx监听5000端口并配置证书,然后让registry的端口映射改到5001去。
Nginx的配置文件:
server {
listen 5000;
server_name xxx.com;
#添加头部信息
client_max_body_size 2048m;
ssl on;
ssl_certificate /home/zekdot/ssl/1_www.xxx.com_bundle.crt;
ssl_certificate_key /home/zekdot/ssl/2_www.xxx.com.key;
location / {
proxy_pass http://localhost:5001/; #注意:使用代理地址时末尾记得加上斜杠"/"。
}
}
此时的启动命令:
docker run -d \
-p 5001:5000 \
-v /home/zekdot/registry:/var/lib/registry \
registry
第二种更加对于服务端更加简单一点,需要在客户端从节点B配置忽略ssl。
编辑/etc/docker/daemon.json,增加"insecure-registries",对我们的仓库地址A:5000取消SSL方式。
"insecure-registries"{
"bip" : "192.168.200.1/24",
"mtu" : 1400,
"registry-mirrors": ["https://pee6w651.mirror.aliyuncs.com","http://hub-mirror.c.163.com", "https://registry.docker-cn.com"],
"insecure-registries": [
"A:5000"
]
}
到这里我们的镜像仓库就搭建完成了。
搭建私有git的好处一方面在于可以建立任意多的私有仓库,另一方面,从私有仓库拉取代码部署的速度应该会比公有仓库更快。
这里参考了这篇博客,更多细节可以从这里了解:
Ubuntu下搭建Git服务器
sudo apt-get install git-core openssh-server openssh-client
git config --global user.name "zekdot"
git config --global user.email "[email protected]"
git clone https://github.com/res0nat0r/gitosis.git
sudo apt-get install python-setuptools
cd gitosis/
sudo python setup.py install
这里假设用户名为为zgit
sudo useradd -m zgit
sudo passwd zgit
sudo vim /etc/group
然后在sudo组后面添加zgit。
这里应该主要指的是windows,windows下可以用gitbash来完成公钥的生成,Linux下一般默认公钥在/home/$USER/.ssh下。
ssh-keygen -t rsa
一路回车就行
上传ssh 公钥到服务器
scp ~/.ssh/id_rsa.pub zekdot@A:/tmp
su zgit
cd ~
git config --global user.name "zgit"
git config --global user.email "[email protected]"
sudo -H -u zgit gitosis-init < /tmp/id_rsa.pub #用git管理员的公钥来对Gitosis进行初始化
执行之后,zgit的家目录下会出现一个repositories文件夹,目录下存在一个gitosis-admin.git库,通过这个库来管理整个git的访问权限,这个库下面有一个gitosis.conf文件和一个keydir目录,前者用于权限配置,后者存放客户端公钥,目前这两个文件里面应该都有个人电脑C的用户信息了。
到这里,仓库就架设完毕了。
这里以添加一个测试项目test为例,该项目包含两个git仓库test1和test2。
首先在个人电脑C中拉取管理仓库
git clone zgit@A:gitosis-admin.git
然后当前目录下会出现gitosis-admin目录,进入该目录,编辑gitosis.conf,井号后面的是注释,不要出现在真正的文件中
[gitosis]
[group gitosis-admin]
members = zekdot@z-terminal
writable = gitosis-admin
[group test] # 项目名称
members = zekdot@z-terminal # 该项目的参与者的公钥账户
writable = test1 test2 # 该项目可以编辑的仓库,多个仓库用空格隔开
这里首先说明一下,一个项目可能有多个仓库,比如在微服务下,用户管理是一个仓库,充值业务是一个仓库,每个仓库可以分别用git add、push的方式去提交。
member这个是我们刚才复制过去的公钥,可以查看~/.ssh/id_rsa.pub,可以看到其内容:
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDXUdsafdsafjewklqjrlwqkjewklqjrklewjrlkjy9DeGDjI/Nsqs4hedsOZK1gQdEyiu4ifZBAOa6o1OTVILkkiLSJxa7bPiWMu5I2z3IzkUzWWikqDJqO/lCkezNy9zzvbjee03xYsjfdsafdsafdsafdsahekwqhjrklewjlqkrjfelwqjfljwphyrKQXktf//R11qWB8TuCrS2d6ghcNHcv5ktFbKM8J5myUW/tbpZo1q0fLSb1 zekdot@z-terminal
最后一段则为账户名,如果要为项目增加新的参与者,只需要在keydir里加入新的公钥,并且在gitosis.conf的member项后增加账户名即可。
最后提交更改。
git commit -am "增加新的项目"
git push origin master
在任意工作目录下创建仓库1test1
mkdir test1
cd test1
git init
git remote add origin zgit@A:test1.git
echo test1 > test1.txt
git add .
git commit -m "增加一个测试文件"
git push origin master
可以看到成功提交了项目。
可以用同样的方法来提交test2仓库
mkdir test2
cd test2
git init
git remote add origin zgit@A:test2.git
echo test2 > test2.txt
git add .
git commit -m "增加一个测试文件"
git push origin master
之后我们有新的项目的话,只需要照猫画虎的去改gitosis.conf文件并提交就行了。
为了让maven可用,首先需要保证JAVA环境已经安装好了。
以下操作都是在主节点A上进行的,该部分的操作参考了如下的博客。
Ubuntu18.04 安装Maven 3.5.3
我的项目主要的技术栈还是Java,而且选择使用Maven来构建项目,所以Maven是必不可少的一个环境,如果选择其他技术栈,比如go,那么maven可能不会是一种必需品了。把Maven安装放在Jenkins前面的一个很重要的原因是Jenkins启动时是需要Maven环境的(当然Jenkins也有Maven插件但是我不太习惯这种方式)。
可以去官网找自己对应的版本
Maven官网
当然,通过观察可以知道,只要修改我们下面wget命令后面的参数里面的版本号也可以达到下载对应版本的maven的目的。
wget https://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz # 下载
sudo mv apache-maven-3.5.3-bin.tar.gz /usr/local/ # 移动
cd /usr/local
sudo tar -zxvf apache-maven-3.5.3-bin.tar.gz # 解压
sudo rm -rf apache-maven-3.5.3-bin.tar.gz # 删除压缩包
然后需要配置其到环境变量中
sudo vim /etc/profile
把如下内容添加到末尾
export M2_HOME=/usr/local/apache-maven-3.6.3
export PATH=${M2_HOME}/bin:$PATH
然后使配置生效
source /etc/profile
然后通过如下命令,有版本号输出,则说明安装成功
mvn -version
这样配置之后,速度可能会较慢,而且我们也不知道依赖都会下载到哪里,所以我们需要编辑/usr/local/apache-maven-3.6.3/conf下的settings.xml文件,把如下的内容粘贴进去,注意mirrors不要和原来自带的重复了,否则会报错,即把mirror写在文件原有的mirrors层级里面。
<localRepository>/home/zekdot/repositorylocalRepository>
<mirrors>
<mirror>
<id>alimavenid>
<name>aliyun mavenname>
<url>http://maven.aliyun.com/nexus/content/groups/public/url>
<mirrorOf>centralmirrorOf>
mirror>
mirrors>
这样配置了镜像为阿里云,下载下来的依赖会保存在/home/zekdot/repository下。
对于jenkins我这里选择用docker去部署,那么在启动容器时最关心的问题应该是需要去映射哪些文件,首先是一些必备的环境文件,包括上一步安装的Maven以及其仓库。然后我需要把jenkins的一些配置数据保存下来,这些数据位于/var/jenkins_home,此外就是需要一个工作目录,这个工作目录开辟在物理机上,在容器中命名为/deployFactory,最后,需要把一些ssh公私钥对映射到容器的/root/.ssh路径下,便于其在无密码情况下访问其它从节点。
综上,我们用如下的命令来启动jenkins。
docker pull jenkins/jenkins
cd ~
mkdir jenkins-data
mkdir deployFactory
mkdir jenkinsSsh
docker run --name jenkins -p 8080:8080 -p 50000:50000 \
-u root \
--rm \
-v /var/run/docker.sock:/var/run/docker.sock \
-v $(which docker):/bin/docker \
-e M2_HOME="/usr/local/apache-maven-3.6.3" \
-v /usr/local/apache-maven-3.6.3:/usr/local/apache-maven-3.6.3 \
-v /usr/lib64/libltdl.so.7:/usr/lib/x86_64-linux-gnu/libltdl.so.7 \
-v /var/lib/docker/tmp:/var/lib/docker/tmp \
-v /home/zekdot/repository:/home/zekdot/repository \
-v /usr/local/bin/docker-compose:/usr/local/bin/docker-compose \
-v /home/$USER/jenkins-data:/var/jenkins_home \
-v /home/$USER/deployFactory:/deployFactory \
-v /home/$USER/jenkinsSsh:/root/.ssh \
-d jenkins/jenkins
然后访问http://A:8080进行配置即可,这里直接安装他推荐的插件。
进入jenkins之后,我们需要增加一个凭证来方便我们之后从我们自己搭建的git里面拉取项目。
进入系统管理-管理凭证-添加凭据
按如下的方式,输入我们刚才创建的私钥,如我们公钥是id_rsa.pub,那么私钥就为id_rsa,把里面的内容都粘贴进去,然后如果有密码的话在Passphrase对应的文本框中加入。
到这里,需要的仓库和流水线就都搭建完成了。