运行于kubernetes的php应用的devops方案

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.   参考资料

  1. https://github.com/jenkinsci/docker/blob/master/README.md
  2. https://github.com/jenkinsci/docker/blob/master/Dockerfile
  3. https://www.kubernetes.org.cn/4076.html
  4. https://wiki.jenkins.io/display/JENKINS/CloudBees+Docker+Build+and+Publish+plugin
  5. https://wiki.jenkins.io/display/JENKINS/Subversion+Plugin
  6. https://wiki.jenkins.io/display/JENKINS/Kubernetes+Continuous+Deploy+Plugin
  7. https://docs.docker.com/install/linux/docker-ce/debian/

 

作者简介:

王善鹏,北京神舟航天软件技术有限公司软件开发工程师。本文版权归原作者所有。

K8S中文社区微信公众号

评论 抢沙发

登录后评论

立即登录