Kubernetes-基于容器云构建devops平台
1、基于kubernetes devops的整体方案
本文以Kubernetes为基础,为基于java语言研发团队提供一套完整的devops解决方案。在此方案中,开发人员基于eclipse集成开发环境进行代码;开发人员所开发的代码交由由gitlab进行托管、版本管理和分支管理;代码的依赖更新和构建工作由Maven进行处理;为了提升工作效率和代码质量,在devops中引入SonarQube进行代码检查;对于打包构建后代码,交由docker进行镜像构建,并在私有镜像仓库中对镜像进行管理;最后,devops会将自动从私有镜像仓库从拉取镜像,并在Rancher中进行部署。
基于此devops解决方案的整体工作过程如下所示:
1)开发人员基于eclipse集成开发环境镜像代码开发的,将代码到gitlab中进行托管;
2)jenkins从gitlab拉取代码;
3)jenkins调用Maven对代码进行打包构建;
4)jenkins调用docker构建镜像;
5)jenkins将构建好的镜像上传至基于Nexus的私有镜像仓库;
6)jenkins拉取镜像,并部署镜像至Rancher中。
2、组件安装部署
此部分描述需要为devops部署的组件,根据整体方案,devops需要使用gitlab、jenkins、nexus、maven、docker和kubernetes这些组件和系统。其中,gitlab、jenkins、nexus都在kubernetes中安装部署,在jenkins中包含了maven;docker直接在物理机提供,对于docker的部署不在此部分进行阐述。
2.1 代码托管工具-Gitlab
在本文的方案中,代码的托管基于Gitlab。下面是在Kubernetes中部署gitlab的YAML配置文件,在此文件中定义了gitlab部署和服务。gitlab部署使用的镜像为gitlab/gitlab-ce:latest,并暴露了443、80和22这三个端口,并通过NFS对配置文件、日志和数据进行持久化。在服务中,端口的类型为NodePort,即允许集群外的用户可以通过映射在主机节点上的端口对gitlab进行访问。
#------------------------定义代理服务-------------------------
apiVersion: v1
kind:Service
metadata:
name: gitlab
spec:
type:NodePort
ports:
# Port上的映射端口
- port:443
targetPort:443
name: gitlab443
- port:80
targetPort:80
name: gitlab80
- port:22
targetPort:22
name: gitlab22
selector:
app: gitlab
---
# ------------------------定义Gitlab的部署 -----------------------
apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
kind:Deployment
metadata:
name: gitlab
spec:
selector:
matchLabels:
app: gitlab
revisionHistoryLimit:2
template:
metadata:
labels:
app: gitlab
spec:
containers:
# 应用的镜像
- image: gitlab/gitlab-ce
name: gitlab
imagePullPolicy:IfNotPresent
# 应用的内部端口
ports:
- containerPort:443
name: gitlab443
- containerPort:80
name: gitlab80
- containerPort:22
name: gitlab22
volumeMounts:
# gitlab持久化
- name: gitlab-persistent-config
mountPath:/etc/gitlab
- name: gitlab-persistent-logs
mountPath:/var/log/gitlab
- name: gitlab-persistent-data
mountPath:/var/opt/gitlab
imagePullSecrets:
- name: devops-repo
volumes:
# 使用nfs互联网存储
- name: gitlab-persistent-config
nfs:
server:192.168.8.150
path:/k8s-nfs/gitlab/config
- name: gitlab-persistent-logs
nfs:
server:192.168.8.150
path:/k8s-nfs/gitlab/logs
- name: gitlab-persistent-data
nfs:
server:192.168.8.150
path:/k8s-nfs/gitlab/data
通过kubectl命令工具,执行如下的命令,在kubernetes集群中部署gitlab:
$ kubectl create -f {path}/gitlab.yaml
2.2 镜像仓库-Nexus
在本文的devops方案中,采用Nexus作为docker私有镜像仓库和maven的远程仓库。下面是在Kubernetes中部署Nexus的YAML配置文件,在此文件中定义了Nexus部署和服务。Nexus部署使用的镜像为sonatype/nexus3:latest,并暴露了8081、5001这两个端口,并通过NFS对配置文件、日志和数据进行持久化。在服务中,端口的类型为NodePort,即允许集群外的用户可以通过映射在主机节点上的端口对nexus进行访问。其中,5001作为docker私有镜像仓库的端口。
#------------------------定义Nexus代理服务-------------------------
apiVersion: v1
kind:Service
metadata:
name: nexus3
spec:
type:NodePort
ports:
# Port上的映射端口
- port:8081
targetPort:8081
name: nexus8081
- port:5001
targetPort:5001
name: nexus5001
selector:
app: nexus3
---#-----------------------定义Nexus部署-------------------------
apiVersion: apps/v1beta2
kind:Deployment
metadata:
name: nexus3
labels:
app: nexus3
spec:
replicas:1#副本数为3
selector:#选择器
matchLabels:
app: nexus3 #部署通过app:nginx标签选择相关资源
template:#Pod的模板规范
metadata:
labels:
app: nexus3 #Pod的标签
spec:
imagePullSecrets:
- name: devops-repo
containers:#容器
- name: nexus3
image: sonatype/nexus3
imagePullPolicy:IfNotPresent
ports:#端口
- containerPort:8081
name: nexus8081
- containerPort:5001
name: nexus5001
volumeMounts:
- name: nexus-persistent-storage
mountPath:/nexus-data
volumes:
# 宿主机上的目录
- name: nexus-persistent-storage
nfs:
server: 192.168.8.150
path: /k8s-nfs/nexus
通过kubectl命令工具,执行如下的命令,在kubernetes集群中部署nexus:
$ kubectl create -f {path}/nexus.yaml
2.3 流水线工具-Jenkins
2.3.1 jenkins安装部署
在本文的devops方案中,采用jenkins作为流水线工具。下面是在Kubernetes中部署jenkins的YAML配置文件,在此文件中定义了jenkins部署和服务。jenkins部署使用的镜像为lw96/java8-jenkins-maven-git-vim:latest,并暴露了8080这个端口,并通过NFS对配置文件和数据进行持久化。在服务中,端口的类型为NodePort,即允许集群外的用户可以通过映射在主机节点上的端口对jenkins进行访问。另外,在此镜像中也提供maven和java。
#------------------------定义代理服务-------------------------apiVersion: v1kind:Servicemetadata: name: jenkins-devopsspec: type:NodePort ports: # Port上的映射端口 - port:8080 targetPort:8080 name: pipeline8080 selector: app: jenkins-devops---
# ------------------------定义mysql的部署 -----------------------
apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
kind:Deployment
metadata:
name: jenkins-devops
spec:
selector:
matchLabels:
app: jenkins-devops
revisionHistoryLimit:2
template:
metadata:
labels:
app: jenkins-devops
spec:
containers:
# 应用的镜像
- image:10.0.32.148:1008/lw96/java8-jenkins-maven-git-vim
name: jenkins-devops
imagePullPolicy:IfNotPresent
# 应用的内部端口
ports:
- containerPort:8080
name: pipeline8080
volumeMounts:
# jenkins-devops持久化
- name: pipeline-persistent
mountPath:/etc/localtime
# jenkins-devops持久化
- name: pipeline-persistent
mountPath:/jenkins
# jenkins-devops持久化
- name: pipeline-persistent-repo
mountPath: /root/.m2/repository
- name: pipeline-persistent-mnt
mountPath:/mnt
volumes:
# 使用nfs互联网存储
- name: pipeline-persistent
nfs:
server: 192.168.8.150
path: /k8s-nfs/jenkins-devops
- name: pipeline-persistent-mnt
nfs:
server:192.168.8.150
path:/k8s-nfs/jenkins-devops/mnt
- name: pipeline-persistent-repo
nfs:
server:192.168.8.150
path:/k8s-nfs/jenkins-devops/repo
通过kubectl命令工具,执行如下的命令,在kubernetes集群中部署jenkins:
$ kubectl create -f {path}/jenkins-devops.yaml
注意,后续将执行下面的操作:
- 将Kubernetes集群的kubeconfig文件拷贝到192.168.8.150主机的/k8s-nfs/jenkins-devops/mnt目录下;
- 将maven的settings.xml文件拷贝至到192.168.8.150主机的/k8s-nfs/jenkins-devops/repo目录下;
- 将maven的依赖插件包拷贝至到192.168.8.150主机的/k8s-nfs/jenkins-devops/repo目录下。
3、 devops平台搭建
3.1 nexus设置
nexus在devops中承担两个功能,作为maven的远程仓库和作为docker的私有镜像仓库。
在本文中,使用nexus默认安装的maven-snapshots、maven-releases和maven-public这三个仓库。
并为docker创建一个名为registry的私有镜像仓库,其端口为5001:
3.2 maven设置
maven负责管理代码的依赖关系和构建。maven通过settings.xml文件设置运行环境,包括与远程仓库的连接。本文中的settings.xml如下所示,http://nexus3:8081中的nexus3是在kubernetes中的服务名称。将settings.xml拷贝至192.168.8.150机器的/k8s-nfs/jenkins-devops/repo目录下。
<?xml version="1.0" encoding="UTF-8"?><settingsxmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd"> <pluginGroups> </pluginGroups> <proxies> </proxies> <servers> <server> <id>maven-release</id> <username>admin</username> <password>admin123</password> </server> <server> <id>maven-snapshots</id> <username>admin</username> <password>admin123</password> </server> </servers>
<mirrors>
<mirror>
<id>nexus</id>
<url>http://nexus3:8081/repository/maven-public/</url>
<mirrorOf>*</mirrorOf>
</mirror>
</mirrors>
<profiles>
<profile>
<id>maven-release</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<repositories>
<repository>
<id>maven-release</id>
<name>Repository for Release</name>
<url>http://nexus3:8081/repository/maven-releases/</url>
<releases>
<enabled>false</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
</profile>
<profile>
<id>maven-snapshots</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<repositories>
<repository>
<id>maven-release</id>
<name>Repository for Release</name>
<url>http://nexus3:8081/repository/maven-snapshots/</url>
<releases>
<enabled>false</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
</profile>
</profiles>
</settings>
3.3 docker设置
为了能够支持将远程提交的代码构建成镜像,以及将构建好的镜像上传至镜像仓库需要在/etc/docker/daemon.json的文件中添加下面的内容。其中,10.0.32.163:32476为镜像仓库的地址和端口,tcp://0.0.0.0:4243为对外暴露的地址和端口。
{"hosts":["tcp://0.0.0.0:4243","unix:///var/run/docker.sock"],"insecure-registries":["10.0.32.163:32476"]}
并通过执行下面的命令重启docker服务:
$ systemctl daemon-reload
$ systemctl restart docker
3.4 jenkins设置
3.4.1 安装插件
jenkins作为devops平台的流程线工具,需要从gitlab中获取代码,并提交给maven进行构建;在代码构建成功后,调用docker构建镜像,并将上传至基于Nexus的私有镜像仓库;最终,在Kubernetes中部署和运行镜像。为了实现上述能力,需要在jenkins中安装如下插件:
- git plugin:与gitlab集成的插件,用于获取代码;
- maven plugin:与maven集成的插件,用于构建代码;
- CloudBees Docker Build and Publish plugin:与docker集成的插件,用于构建docker镜像,并上传至镜像仓库;
- Kubernetes Continuous Deploy Plugin:与kubernetes集成的插件,用于将镜像部署到kubernetes环境。
3.4.2 maven设置
在jenkins中的“全局工具配置”页面,设置maven的安装信息,name可以按照自己的喜好填写,MAVEN_HOME为maven的安装地址,此处为/opt/maven。
4、devops持续集成示例
1)安装git客户端和创建密钥
在工作计算上安装git客户端,并通过下面的命令创建ssh密钥:
ssh-keygen -t rsa -C "your.email@example.com"-b 4096
执行上述命令后,会在本地的~/.ssh目录创建id_rsa.pub(公钥)和id_rsa(私钥)。
2)在gitlab创建oms项目
进入gitlab,并创建一个名称为oms的项目。
在gitlab中添加所创建的公钥:
3)在eclipse中进行代码开发
在eclipse中创建类型为maven的oms项目,并进行代码开发。在完成代码开发后,将代码上传至gitlab中进行代码托管。
4)在jenkins中创建oms项目
进入jenkins,创建一个名称为oms的maven项目。
5)在jenkins中设置获取代码信息
在jenkins中,进入oms的配置页面,在源代码管理处设置获取源代码的相关信息。
- Repository URL:项目在gitlab中的地址;
- Credentials:访问gitlab的认证方式;
- Branch Specifier:代码的分支。
此处访问gitlab的认证方式为“SSH Username with private key”,Private Key的值来自于~/.ssh目录下id_rsa(私钥)的内容。
6)在jenkins中设置构建和上传镜像信息
在oms项目的配置的“Docker Build and Publish”部分,填写如下的信息;
- Repository Name:镜像的名称;
- Tag:镜像的版本;
- Docker Host URI:docker服务的地址和端口;
- Docker registry URL:docker镜像仓库的地址;
- Registry credentials:镜像仓库的认证方式。
7)在jenkins中设置部署容器信息
在oms项目的配置的“Deploy to Kubernetes”部分,填写如下的信息;
- Kubernetes Cluster Credentials:Kubernetes集群的认证方式;
- Path:kubeconfig文件的所在地址;
- Config Files:构建YAML配置文件。
8)在jenkins中执行oms构建
在oms项目创建和设置完成后,可以对项目进行构建操作。通过一键操作,jenkins将会完成从构建、打包成镜像和部署的所有工作内容:
- 从gitlab中获取oms的代码;
- 提交给maven进行构建;
- 调用docker构建镜像;
- 上传镜像至Nexus的私有镜像仓库;
- 部署镜像到kubernetes集群。
9)在kubernetes中查看部署情况
进入kubernetes(本文使用的为Rancher系统)界面,在default命名空间下,可以看到已部署的oms。
参考材料
1.《User documentation》地址:http://10.0.32.163:32269/help/user/index.md
2.《CloudBees Docker Build and Publish plugin》地址:https://wiki.jenkins.io/display/JENKINS/CloudBees+Docker+Build+and+Publish+plugin
3.《Kubernetes Continuous Deploy Plugin》地址:https://wiki.jenkins.io/display/JENKINS/Kubernetes+Continuous+Deploy+Plugin
作者简介:
季向远,北京神舟航天软件技术有限公司产品经理。本文版权归原作者所有。
微信公众号:ik8s
Kubernetes-基于容器云构建devops平台的更多相关文章
- IBM基于Kubernetes的容器云全解析
基于Kubernetes的容器云 容器云最主要的功能是以应用为中心,帮助用户把所有的应用以容器的形式在分布式里面跑起来,最后把应用以服务的形式呈现给用户.容器云里有两个关键点,一是容器编排,二是资源调 ...
- Kubernetes——基于容器技术的分布式架构领先方案,它的目标是管理跨多个主机的容器,提供基本的部署,维护以及运用伸缩
1.Kubernetes介绍 1.1 简介 Kubernetes是什么?首先,它是一个全新的基于容器技术的分布式架构领先方案.其次,它是一个开放的开发平台.最后,它是一个完备的分布式系统支撑平台.Ku ...
- 声明式语法重写基于容器CICD构建流水线
调试了一下午,一句话都不想说了,看代码. ----- 参考文档 https://blog.csdn.net/weixin_42010394/article/details/90670945 实践代码 ...
- 026.[转] 基于Docker及Kubernetes技术构建容器云平台 (PaaS)
[编者的话] 目前很多的容器云平台通过Docker及Kubernetes等技术提供应用运行平台,从而实现运维自动化,快速部署应用.弹性伸缩和动态调整应用环境资源,提高研发运营效率. 本文简要介绍了与容 ...
- Kubernetes容器云平台建设实践
[51CTO.com原创稿件]Kubernetes是Google开源的一个容器编排引擎,它支持自动化部署.大规模可伸缩.应用容器化管理.伴随着云原生技术的迅速崛起,如今Kubernetes 事实上已经 ...
- 【容器云】传统金融企业的 Docker 实践
基于 Docker 的容器云-Padis 目前市面上基于容器云的产品有很多,对于平安而言,则是基于 Docker 的 Padis 平台.所谓 Padis,全称是 PingAn Distribution ...
- 容器云平台No.1~基于Docker及Kubernetes构建的容器云平台
开篇 最近整理笔记,不知不觉发现关于kubernetes相关的笔记已经达99篇了,索性一起总结了.算是对这两年做容器云平台的一个总结,本文是开篇,先介绍下所有用到的组件.首先来看下架构图(实在画的太丑 ...
- 腾讯基于Kubernetes的企业级容器云平台GaiaStack (转)
GaiaStack介绍 GaiaStack是腾讯基于Kubernetes打造的容器私有云平台.这里有几个关键词: 腾讯:GaiaStack可服务腾讯内部所有BG的业务: Kubernetes:Gaia ...
- 基于Kubernetes构建企业容器云
前言 团队成员有DBA.运维.Python开发,由于需要跨部门向公司私有云团队申请虚拟机, 此时我在思考能否在现有已申请的虚拟机之上,再进行更加细粒度的资源隔离和划分,让本团队的成员使用, 也就是在私 ...
- 基于容器微服务的PaaS云平台设计(一) 实现容器微服务和持续集成
版权声明:本文为博主原创文章,欢迎转载,转载请注明作者.原文超链接 ,博主地址:http://www.cnblogs.com/SuperXJ/ 前言:关于什么是容器微服务PaaS和容器微服务PaaS的 ...
随机推荐
- Elasticsearch:IK中文分词器
Elasticsearch内置的分词器对中文不友好,只会一个字一个字的分,无法形成词语,比如: POST /_analyze { "text": "我爱北京天安门&quo ...
- #Lua:Lua调用C++生成的DLL库
Lua调用C++生成的DLL库 本文参考了某大佬的博客,写得十分详细,推荐!!! 需求: 在之前的求解器中添加了Lua库,使得程序可以在Lua脚本中实现自定义函数功能,考虑到未来可能需要与第三方程序库 ...
- 我的Vue之旅、05 导航栏、登录、注册 (Mobile)
第一期 · 使用 Vue 3.1 + TypeScript + Router + Tailwind.css 构建手机底部导航栏.仿B站的登录.注册页面. 代码仓库 alicepolice/Vue-05 ...
- 源码学习之MyBatis的底层查询原理
导读 本文通过MyBatis一个低版本的bug(3.4.5之前的版本)入手,分析MyBatis的一次完整的查询流程,从配置文件的解析到一个查询的完整执行过程详细解读MyBatis的一次查询流程,通过本 ...
- css事件穿透
代码: pointer-events: none; 解义:你可以看的到第一个元素,但是你看不到下面的元素着,点击第一个元素会穿透触发到第二个元素的元素
- PHP全栈开发(一):CentOS 7 配置LAMP
服务器CentOS7 IP地址:10.28.2.249 进行网络配置 可以使用ip address命令查看当前的网卡状态 两张网卡,一张lo网卡一张ens160网卡 Ens160这个网卡的配置文件为/ ...
- MySQL 窗口函数
1. 窗口函数概念和语法 窗口函数对一组查询行执行类似聚合的操作.然而,聚合操作将查询行分组到单个结果行,而窗口函数为每个查询行产生一个结果: 函数求值发生的行称为当前行 与发生函数求值的当前行相关的 ...
- 记一次 .NET 某工控视觉软件 非托管泄漏分析
一:背景 1.讲故事 最近分享了好几篇关于 非托管内存泄漏 的文章,有时候就是这么神奇,来求助的都是这类型的dump,一饮一啄,莫非前定.让我被迫加深对 NT堆, 页堆 的理解,这一篇就给大家再带来一 ...
- Linux 下搭建 Hadoop 环境
Linux 下搭建 Hadoop 环境 作者:Grey 原文地址: 博客园:Linux 下搭建 Hadoop 环境 CSDN:Linux 下搭建 Hadoop 环境 环境要求 操作系统:CentOS ...
- 同一台电脑安装两个不同版本的mysql。简单暴力有效
1.先找到mysql的安装地址.找到my.ini 2.修改端口号(mysql默认端口是3306)我这里修改为3307 3.打开服务.找到刚刚修改的mysql版本 4.重新启动该服务(我已经安装了mys ...