一、 什么是DevOps?
Devops作为敏捷开发的基石,脱离了DevOps谈敏捷开发,只会变得的不“敏捷”,它助力于敏捷开发以用户的需求进化为核心,采用迭代、循序渐进的方法进行软件开发,以达到项目快速交付,一个敏捷开发的流程图大致如下:
“DevOps”从字面意思上很简单,就是 Development(开发)和 Operations (运维)的组合。这个“开发”不能片面的理解为写代码,应该是一个开发阶段或过程,在这个阶段需要做大量的可行性分析、成本预算等,这个在其他行业也是一样,三峡大坝是世界上最大的水利工程,在修建它之前做了大量可行性研究,并为此提早几十年先修建了一座小型的葛洲坝电站,从中积累了大量的经验。而“运维”要考虑后期通过何种方式升级,如何监控服务,如何快速定位和解决问题等。而实际上,它是一组过程、方法与系统的统称,到目前为止没有一个标准,我觉得只要有助于团队之间合作,能够加快项目交付就是一套好的DevOps,就应该大力使用它,反之则不要用。如何建立一套有效的DevOps工具链,我觉得可以从以下几方面入手:
- 团队扁平化,降低沟通成本,促使项目经理、产品经理、开发团队、测试团队、运维团队有效的协作
-
一些工具如leangoo、jira的看板图、燃尽图等,可以明确任务,明确责任
-
快速响应,快速调整,快速迭代
-
实时监控,对项目监控、对人员监控、对服务监控
二、 实现DevOps所需工具?
- 项目管理工具(PM):Jira代码管理
- 代码管理工具:SVN、GibLab等
- 持续集成工具:Jenkins、Gitlab-CI
- 镜像仓库:Registry、Harbor
- 部署环境:Docker、K8S
- 部署脚本:Shell、Python等
三、 安装和配置
1. 安装Jenkins
$ cat < start.sh
#!/bin/bash
HOST_NAME=jenkins.kq
GITLAB_DIR=`pwd`
docker run \
-u root \
--hostname \${HOST_NAME} \
--name jenkins \
--rm \
-d \
-p 9080:9080 \
-p 50000:50000 \
-v ${GITLAB_DIR}:/opt/jenkins \
-v /var/run/docker.sock:/var/run/docker.sock \
jenkinsci/blueocean
EOF
$ chmod u+x start.sh
$ ./start.sh
安装插件
解决插件安装慢问题,替换后重新启动服务
- 替换 google 为 baidu
- 替换 updates.jenkins-ci.org/download 为mirrors.tuna.tsinghua.edu.cn/jenkins
$ vi /root/.jenkins/updates/default.json
修改配置
将jenkins中匿名用户可读选中,跨站的访问去掉
输入一个令牌
在Gitlab中添加Hook(root登录)
其他代码管理工具配置方式类似
2. 安装GitLab
docker安装方式
$ cat < start.sh
#!/bin/bash
HOST_NAME=gitlab.kq
GITLAB_DIR=`pwd`
docker stop gitlab
docker rm gitlab
docker run -d \
--hostname \${HOST_NAME} \
-p 8443:443 -p 9090:80 -p 2222:22 \
--name gitlab \
--memory=2048M \
-v ${GITLAB_DIR}/config:/etc/gitlab \
-v ${GITLAB_DIR}/logs:/var/log/gitlab \
-v ${GITLAB_DIR}/data:/var/opt/gitlab \
registry.cn-hangzhou.aliyuncs.com/imooc/gitlab-ce:latest
EOF
$ chmod u+x start.sh
$ ./start.sh
配置
安装完成之后,可以在/etc/gitblab/gitlab.rb中按照需求修改配置,
- 主要需要修改external_url,改成gitlab.kq:9090
- 或修改nginx配置,修改监听端口,增加 ssl 配置,设置 header:
# external_url主要是配置拉取代码是的地址,如果端口不是80,需要修改成指定的端口
external_url 'http://gitlab.kq:9090'
# 这个是配置gitlab监听在哪个地址上
nginx['listen_addresses'] = ['127.0.0.1']
# 这个配置gitlab监听在哪个端口上
nginx['listen_port'] = 9090
# For GitLab
nginx['ssl_certificate'] = "/etc/gitlab/ssl/gitlab.example.com.crt"
nginx['ssl_certificate_key'] = "/etc/gitlab/ssl/gitlab.example.com.key"
# proxy set header
nginx['proxy_set_headers'] = {
"X-Forwarded-Proto" => "http",
"CUSTOM_HEADER" => "VALUE"
}
访问:http://gitlab.kq:9090 账号:root/12345678
3. 安装harhor
安装harhor需要先安装docker和docker-compose
$ sudo curl -L "https://github.com/docker/compose/releases/download/1.25.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
在harbor安装机器上生成证书(如果不用https访问,此步骤略)
## 生成证书
$ mkdir -pv /etc/harbor/pki/ & cd /etc/harbor/pki/
$ openssl genrsa -out harbor-ca.key
$ openssl req -x509 -new -nodes -key harbor-ca.key -subj "/CN=harbor.kq" -days 7120 -out harbor-ca.crt
## 添加harbor域名,域名要和证书中的域名保持一致
$ echo "192.168.x.x harbor.kq" >> /etc/hosts
修改harbor.yml文件,将hostname改成harbor,配置证书位置(如果不用https访问,此步骤略)
hostname: harbor
# http related config
http:
# port for http, default is 80. If https enabled, this port will redirect to https port
port: 80
# https related config
https:
# https port for harbor, default is 443
port: 443
# 配置证书位置
certificate: /etc/harbor/pki/harbor-ca.crt
private_key: /etc/harbor/pki/harbor-ca.key
## 修改admin密码
harbor_admin_password: 123456
安装并启动harbor
$ gzip -dv harbor-offline-installer-v1.10.1.tgz
$ tar zxvf harbor-offline-installer-v1.10.1.tar
$ ./install.sh
# 在daemon.json "insecure-registries": ["harbor.kq"],否则会push到docker.io上
$ vi /etc/docker/daemon.json
{
......
"insecure-registries": ["harbor.kq"]
}
# harbor是通过docker-compose 来启动的
$ cd /root/harbor
$ docker-compose up
# 如果启动时报错,把docker服务重启试试
$ systemctl daemon-reload
$ service docker restart
在其他主机测试harbor
$ echo "192.168.x.x harbor.kq" >> /etc/hosts
## 拷贝证书到doker目录下,否则登录会报: x509: cannot validate certificate
$ mkdir -p /etc/docker/certs.d/harbor.kq/
$ scp [email protected]:/etc/harbor/pki/harbor-ca.crt /etc/docker/certs.d/harbor.kq/
# 在daemon.json "insecure-registries": ["harbor.kq"],否则会push到docker.io上
$ vi /etc/docker/daemon.json
{
......
"insecure-registries": ["harbor.kq"]
}
$ systemctl daemon-reload
$ service docker restart
访问页面: http://192.168.x.x/ 用admin/123456登录
创建一个公开仓库:oauth2,创建私有仓库的话集群中所有节点都需要登录才能拉取镜像
$ docker login harbor.kq
Username: admin
Password: [123456]
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
## 推送一个Nginx镜像到harbor上
## !!!一定要加仓库名,否则无法push
$ docker tag registry.cn-hangzhou.aliyuncs.com/moobox/nginx:latest harbor.kq/<仓库名>/nginx:latest
$ docker push harbor.kq/<仓库名>/nginx:latest
harbor用久了,会占用大量磁盘空间,执行下面命令进行垃圾回收
docker run -it --name gc --rm --volumes-from registry vmware/registry:2.6.2-photon garbage-collect /etc/registry/config.yml
5. 安装nexus
参考,nexus里可以配置3种类型的仓库,分别是proxy、hosted、group
- proxy是远程仓库的代理。比如说在nexus中配置了一个central repository的proxy,当用户向这个proxy请求一个artifact,这个proxy就会先在本地查找,如果找不到的话,就会从远程仓库下载,然后返回给用户,相当于起到一个中转的作用
- hosted是宿主仓库,用户可以把自己的一些构件,deploy到hosted中,也可以手工上传构件到hosted里。比如说oracle的驱动程序,ojdbc6.jar,在central repository是获取不到的,就需要手工上传到hosted里
- group是仓库组,在maven里没有这个概念,是nexus特有的。目的是将上述多个仓库聚合,对用户暴露统一的地址,这样用户就不需要在pom中配置多个地址,只要统一配置group的地址就可以了
创建一个阿里云proxy的代理库
添加到maven-public组中
将创建的阿里云proxy库,添加到maven-public组中,访问优先级自上而下
在本地配置仓库地址:$HOME/.m2/setting.xml文件
maven-public
central
Nexus kq
http://192.168.x.x:8082/repository/maven-public/