1. 概述
php应用在kubernetes上运行,每次发布新版本人工部署不是很方便,这就需要建立devops方案进行php应用的快速部署。本方案采用jenkins作为流水线工具,在本方案中使用svn作为代码库,开发人员通过svn提交代码。快速部署时先从svn拉取代码,然后使用docker打包镜像,并用nexus建立私有仓库,在私有仓库中管理镜像,最后devops从私有仓库中拉取镜像并部署于kubernetes。另外大家可以方案作为参考,推广到其他不需要代码依赖和不需要编译的应用。
2. 安装部署
本方案中svn和nexus都是采用的容器云外的应用,docker部署于物理机,在此都不再赘述。
本节重点阐述jenkins在kubernetes上的部署。本文使用jenkins的官方镜像作为我们部署镜像的基镜像,官方镜像中没有安装docker,我们需要在镜像中安装docker。我们还需要使用一些插件,这些插件在镜像中一并安装。
下载https://download.docker.com/linux/debian/dists/stretch/pool/stable/amd64/docker-ce_18.06.0~ce~3-0~debian_amd64.deb并重命名为docker-ce.deb。按照如下Dockerfile文件建立新镜像。
FROM jenkins/jenkins:lts
USER root
RUN apt-get update && apt-get install -y iptables && apt-get install -y libdevmapper1.02.1 && apt-get install -y libltdl7 && apt-get install -y libseccomp2
ADD docker-ce.deb /tmp/
RUN dpkg -i /tmp/docker-ce.deb && rm -rf /tmp/docker-ce.deb
RUN /usr/local/bin/install-plugins.sh kubernetes-cd:0.2.3 subversion:2.11.1 docker-build-publish:1.3.2
USER Jenkins
之后我们就可以使用该镜像部署jenkins。
#————————定义代理服务————————-
apiVersion: v1
kind: Service
metadata:
name: jenkins-php
spec:
type: NodePort
ports:
# Port上的映射端口
– port: 8080
targetPort: 8080
name: pipeline8080
selector:
app: jenkins-php
—
# ————————定义jenkins的部署 ———————–
apiVersion: apps/v1
kind: Deployment
metadata:
name: jenkins-php
spec:
selector:
matchLabels:
app: jenkins-php
revisionHistoryLimit: 2
template:
metadata:
labels:
app: jenkins-php
spec:
containers:
# 应用的镜像
– image:phpdevops:v1.0 #基于官方镜像建立的jenkins镜像
name: jenkins-php
imagePullPolicy: IfNotPresent
# 应用的内部端口
ports:
– containerPort: 8080
name: pipeline8080
volumeMounts:
# jenkins-devops持久化
– name: pipeline-persistent
mountPath: /var/jenkins_home
volumes:
# 使用nfs互联网存储
– name: pipeline-persistent
nfs:
server: 192.168.8.150
path: /k8s-nfs/jenkins-php
3. Devops配置
3.1. Docker配置
在某台安装docker的物理机中,在/etc/docker/daemon.json的文件中添加下面的内容。其中,10.0.32.148:1008为镜像仓库的地址和端口,tcp://0.0.0.0:4243为对外暴露的地址和端口。
{
“hosts”:[“tcp://0.0.0.0:4243″,”unix:///var/run/docker.sock”],
“insecure-registries”:[“10.0.32.148:1008”]
}
并通过执行下面的命令重启docker服务:
$ systemctl daemon-reload
$ systemctl restart docker
3.2. Jenkins配置
创建名为php的任务。
设置svn的信息。
Repository URL:svn的地址。
Credentials:svn的用户名和密码,可以临时添加。
设置构建镜像、上传镜像、部署的信息。
Repository Name:镜像名称
Tag:镜像版本
Docker Host URI:docker服务的地址和端口;
Docker registry URL:docker镜像仓库的地址;
Registry credentials:镜像仓库的用户名和密码。
Kubernetes Cluster Credentials:Kubernetes集群的认证方式;
Path:kubeconfig文件的所在地址;
Config Files:在集群部署应用的yaml配置文件。
配置完成后需要将构建镜像的Dockerfile与部署应用的yaml放在svn项目的根目录下并由svn管理。
4. 构建
在配置完成后,可以对项目进行构建一键操作。通过立即构建一键操作,jenkins将会完成拉取代码,打包镜像,上传镜像,部署的所有工作。
5. 参考资料
https://wiki.jenkins.io/display/JENKINS/CloudBees+Docker+Build+and+Publish+plugin
https://wiki.jenkins.io/display/JENKINS/Kubernetes+Continuous+Deploy+Plugin
作者简介:
王善鹏,北京神舟航天软件技术有限公司软件开发工程师。本文版权归原作者所有。