基于jenkins+kubernetes的cicd流程实践一:环境搭建及方案原理实现
1.基础环境:Centos7.9,kubernetes:v1.21.5
node-1@112(master):docker,containerd,harbornginx(80),git,etcd
node-2@109(master/worker):docker,containerd,ingress_nginx(80),etcd,glusterfs
node-3@107(worker):docker,containerd,harbor(80),etcd,glusterfs
node-4@106(worker):docker,containerd,harbor(80),glusterfs
node-6@121(单体/应用):docker,containerd,nginx(80/前端),consul,nacos,yapi
2.公有代码仓库,gitee,配置网络钩子
3.私有镜像仓库,harbor双主复制,node-3/node-4,地址:myhub.com
参考:https://github.com/goharbor/harbor
4.持久化存储 ,gluster-kubernetes ,node-2/node-3/node-4,heketi使用Ingress四层代理
参考:https://github.com/gluster/gluster-kubernetes
http://docs.kubernetes.org.cn/803.html#Glusterfs
5.jenkins,k8s Deployment方式部署,推荐本地部署
参考:https://www.jenkins.io/doc/book/installing/kubernetes/
(1)Local Persistent Volume 替换为 GlusterFs(基于Local Persistent Volume搭建的分布式文件),存储配置信息以及workspace
volume.yaml:
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: jenkins-glusterfs-storage-class
provisioner: kubernetes.io/glusterfs
parameters:
# 这里heketi使用ingress四层代理
# 192.168.0.109为ingress-nginx-controller监听地址
resturl: "http://192.168.0.109:30001"
restauthenabled: "true"
restuser: "admin"
restuserkey: "admin123"
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: jenkins-pv-claim
namespace: devops-tools
spec:
storageClassName: jenkins-glusterfs-storage-class
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 3Gi
---
# agent workspace-volume
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: jenkins-agent-pv-claim
namespace: devops-tools
spec:
storageClassName: jenkins-glusterfs-storage-class
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 30Gi
(2)jenkins-server服务暴露方式NodePort替换为Ingress七层代理+四层代理
$ kubectl patch cm tcp-services -n ingress-nginx --patch='{"data": {"32000": "devops-tools/jenkins-service:80"}}'
service.yaml
apiVersion: v1
kind: Service
metadata:
name: jenkins-service
namespace: devops-tools
annotations:
prometheus.io/scrape: 'true'
prometheus.io/path: /
prometheus.io/port: '8080'
spec:
selector:
app: jenkins-server
ports:
- name: web
port: 80
targetPort: 8080
- name: agent
port: 50000
targetPort: 50000
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: jenkins-service
namespace: devops-tools
spec:
rules:
- host: myjenkins.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: jenkins-service
port:
name: web
(3)sa的集群角色中增加对集群中deployment,ingress资源的所有操作权限
serviceAccount.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: jenkins-admin
rules:
#"":core
- apiGroups: [""]
resources: ["*"]
verbs: ["*"]
- apiGroups: ["apps"]
resources: ["deployments"]
verbs: ["*"]
- apiGroups: ["networking.k8s.io"]
resources: ["ingresses"]
verbs: ["*"]
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: jenkins-admin
namespace: devops-tools
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: jenkins-admin
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: jenkins-admin
subjects:
- kind: ServiceAccount
name: jenkins-admin
namespace: devops-tools
(4)安装插件:
参考: https://plugins.jenkins.io/kubernetes/
https://plugins.jenkins.io/kubernetes-cli/
https://gitee.com/help/articles/4193#article-header0
(a)kubernetes:用于和k8s交互,配置创建agent pod
(b)Kubernetes Cli:提供agent使用kubectl与k8s交互环境
(c)Gitee:用于自动触发构建
(d)其他:系统开始建议安装的插件都装一下
(5)工作原理:
(a)pod中的容器挂载infra容器的Namespace,共享Mount Namespace,工作目录/home/jenkins/agent都挂载workspace-volume数据卷,git拉下来的项目文件都是可见的
(b)agent主容器:jnlp默认自动生成,jenkins+kubernetes的cicd整个流程是定义sidecar容器,通过jenkins及其插件,手动一步步的实现sidecar容器对项目文件的具体操作
(6)编译环境准备-build项目时:
golang与alpine镜像对应版本:https://hub.docker.com/_/golang
(a)用的是go项目,需要go进程install项目,使用容器化方式,让k8s去管理
(b)kubernetes 插件pod模板添加容器,编译环境镜像: golang:1.19.1-alpine,上传到harbor
(c)容器启动进程:/bin/sh -c cat,防止容器进程关闭
(d)其他语言项目,使用对应语言环境镜像编译即可
(7)agent pod系统用户权限处理-docker创建镜像时:
(a)由于每个节点都装有docker,root用户登录,所以使用本地数据卷挂载方式,agent pod 的User Namespace相同才能执行即系统用户需要root执行权限才能使用当前节点docker
(b)uid(用户id)和gid(用户组id),securityContext设置针对controller的uid和gid,agent无效,controller和agent默认是jenkins和1000
(c)可以在kubernetes 插件pod模板中修改,使用root用户,uid=0,gid=0,或者Raw YAML for the Pod覆盖主容器
(d)也可以在构建shell脚本中将jenkins用户添加到root用户组中
(e)制作镜像的基础镜像:alpine:3.16,go语言在云原生优势体现,不需要虚拟机,直接编译成对应系统的二进制文件运行,镜像可以瘦身很小
(f)写shell脚本定时查询节点创建的项目镜像并清理一定时间段的镜像,以DaemonSet部署方式亲和到每个worker节点,master节点存在NoSchedule污点,或者镜像上传后立即删除
(g)镜像上传harbor,第一次登陆需要docker login用户注册认证,本地保存在~/.docker/config.json,每个节点不一定都存在,使用cm方式挂载到该路径
$ kubectl create cm docker-hub-credential --from-file=config=config.json -n devops-tools
(h)也可以使用docker in docker 好处是生命周期和agent pod一致,缺点是问题排查难度变大
注:使用docker的多阶段编译制作镜像,可以将(4)的go build过程放在(5)build image中构建,一个build阶段完成
(8)agent pod与k8s api server交互-项目部署到k8s集群时:
(a)使用kubectl,当前只存在master节点中,需要在worker节点使用,为了不污染worker节点,使用容器化方式,让k8s去管理
(b)k8s集群外kubectl与k8s api server交互,客户端证书TLS双向认证,需要useraccount配置信息,客户端保存在~/.kube/config,可以将凭证以cm/pvc方式挂载进去,api server地址一般设置为集群地址或本地代理地址进行解耦
(c)k8s集群内pod可以通过ServiceAccount与k8s k8s api server进行交互,ServiceAccount会创建对应secret自动挂载到pod文件系统中:/var/run/secrets/kubernetes.io/serviceaccount ,包含有token信息,为通信凭证
(d)配置的ServiceAccount具有对集群中core所有资源,deployment,ingress的所有操作权限,获取jenkins-admin的token:
$ kubectl -ndevops-tools describe secret $(kubectl -ndevops-tools get secret | grep jenkins-admin | awk '{print $1}')
(e)可以使用Kubernetes Cli插件进行配置token与k8s api server集群内部地址,自动配置并使用上下文,实现集群内kubectl 与k8s api server交互
(f)kubernetes 插件pod模板添加容器,镜像: registry.cn-shanghai.aliyuncs.com/mydlq/kubectl:1.15.3,上传到harbor
(g)容器启动进程:/bin/sh -c cat,防止容器进程关闭
(9)pipline测试脚本:
def label = "golang1.19.1"
def credential = "global-kubernetes-credential"
timeout(time: 900, unit: 'SECONDS') {
podTemplate(label: label,cloud: 'kubernetes' ){
node (label) {
stage('Git阶段'){
sh '''echo "开始拉取代码"
echo "拉取代码完成"'''
}
stage('Build阶段'){
container('golang') {
sh '''echo "构建开始"
id
go version
echo "构建完成"'''
}
}
stage('Docker阶段'){
sh '''echo "创建镜像开始"
id
docker images
echo "创建镜像完成"'''
}
stage('Kubernetes 阶段'){
container('kubectl') {
withKubeConfig([credentialsId: credential,serverUrl: "https://kubernetes.default.svc.cluster.local"]) {
sh '''echo "k8s部署开始"
id
kubectl get nodes
kubectl get pods
echo "k8s部署完成"'''
}
}
}
}
}
}
注:jenkins全局变量会自动注入到容器环境变量中,每个容器都可以获取使用
基于jenkins+kubernetes的cicd流程实践一:环境搭建及方案原理实现的更多相关文章
- 从零开始针对 .NET 应用的 DevOps 运营实践 - 运行环境搭建
一.Overview 最近的一段时间,在公司里我都在进行基于 Jenkins 和 SonarQube 配合已有的 Gitlab 搭建部门的持续集成环境的工作,虽然之前有使用过 GitHub Actio ...
- 基于Maven的Spring + Spring MVC + Mybatis的环境搭建
基于Maven的Spring + Spring MVC + Mybatis的环境搭建项目开发,先将环境先搭建起来.上次做了一个Spring + Spring MVC + Mybatis + Log4J ...
- 基于Axis1.4的webservice接口开发(环境搭建)
基于Axis1.4的webservice接口开发(环境搭建) 一.环境搭建: 1.搜索关键字“Axis1.4”下载Axis1.4相关的jar包. 下载地址:http://download.csdn.n ...
- ubuntu基于VSCode的C++编程语言的构建调试环境搭建指南
ubuntu基于VSCode的C++编程语言的构建调试环境搭建指南 首先安装g++ sudo apt install g++ 检查是否安装成功: 在插件栏安装插件c/c++.code runner: ...
- kubernetes实战之consul简单测试环境搭建及填坑
这一节内容有点长,我们将介绍如何基于docker搭建一client一server的consul测试环境,以及如何搭建多server consul测试集群.在基于docker搭建多server的cons ...
- kubernetes 单节点和多节点环境搭建
kubernetes单节点环境搭建: 1.在VMWare Workstation中建立一个centos 7虚拟机.虚拟机的配置尽量调大一些 2.操作系统安装完成后,关闭centos 自带的防火墙服务 ...
- 基于Visual c++ 2012的php扩展开发 - 环境搭建
软件准备 Apache2.4 php-5.6.20-Win32-VC11-x86 php-5.6.20-src mysql-5.5.45-win32 vcredist_x86.exe vs2012旗舰 ...
- 3.Flink实时项目之流程分析及环境搭建
1. 流程分析 前面已经将日志数据(ods_base_log)及业务数据(ods_base_db_m)发送到kafka,作为ods层,接下来要做的就是通过flink消费kafka 的ods数据,进行简 ...
- 基于 Jenkins + Kubernetes + Argo CD 的完整 DevOps 流程记录(1) - 环境部署
一.环境准备 1.1 镜像仓库 整套 DevOps 流程使用 Harbor 作为内部镜像仓库,所有构建产物(镜像)都会推送到 Harbor,以备后续进行项目部署.Harbor 从 2.x 版本开始支持 ...
- 基于Jenkins+Maven+Gitea+Nexus从0到1搭建CICD环境
在传统的单体软件架构中,软件开发.测试.运维都是以单个进程为单位. 当拆分成微服务之后,单个应用可以被拆分成多个微服务,比如用户系统,可以拆分成基本信息管理.积分管理.订单管理.用户信息管理.合同管理 ...
随机推荐
- (四)JPA - JQPL 实现增删改查
(一)JPA的快速入门 建议在需要使用时,看看之前的文章,先把环境搭起来. 5.JPQL JPQL和SQL 1.JPQL和SQL很像,查询关键字都是一样的 2.唯一的区别是:JPQL是面向对象的 JP ...
- C#/VB.NET 读取条码类型及条码在图片中的坐标位置
我们在创建条形码时,如果以图片的方式将创建好的条码保存到指定文件夹路径,可以在程序中直接加载图片使用:已生成的条码图片,需要通过读取图片中的条码信息,如条码类型.条码绘制区域在图片中的四个顶点坐标位置 ...
- Java基础之变量
Java基础之变量 目录 Java基础之变量 1.变量概述 1.1 为什么需要变量 1.2 简单理解 1.3 变量使用注意事项 1.4 程序中+号的使用 1.5 Java数据类型 1.6 整数类型 1 ...
- c#-03关于类和继承的基本知识
一.类继承 通过类继承可以定义一个新类,新类纳入一个已经声明的类进行扩展 已经存在的类叫做基类,而通过继承出的类叫做派生类,派生类的组成为: 本身声明中的成员 基类的成员 派生类无法删除基类成员,但可 ...
- 【疫情动态条形图】用Python开发全球疫情排名动态条形图bar_chart_race
一.开发背景 你好,我是 @马哥python说 ,这是我用Python开发的全球疫情动态条形图,演示效果: https://www.zhihu.com/zvideo/15603276220259696 ...
- Maximum Entropy Population-Based Training for Zero-Shot Human-AI Coordination
原文:https://www.cnblogs.com/Twobox/p/16791412.html 熵 熵:表述一个概率分布的不确定性.例如一个不倒翁和一个魔方抛到地上,看他们平稳后状态.很明显,魔方 ...
- NOIP2017总结 & 题解
day1t1的结论貌似在哪见过,自己稍微验证了一下貌似没记错就没有管了.t2一道很好(keng)的模拟题啊t3自己做题好慢啊,想出来dp打上去最后几分钟才过了大样例,我写的是记忆化搜索,判-1很好判, ...
- go-zero docker-compose 搭建课件服务(八):集成jaeger链路追踪
0.转载 go-zero docker-compose 搭建课件服务(八):集成jaeger链路追踪 0.1源码地址 https://github.com/liuyuede123/go-zero-co ...
- 知识图谱-生物信息学-医学顶刊论文(Bioinformatics-2021)-SumGNN:通过有效的KG聚集进行多类型DDI预测
3.(2021.3.26)Bioinformatics-SumGNN:通过有效的KG聚集进行多类型DDI预测 论文标题: SumGNN: multi-typed drug interaction pr ...
- 42.JSON Web Token认证
JSON Web Token认证介绍 简称JWT认证,一般用于用户认证 JWT是一种相当新的标准,可用于基于token的身份验证 与内置的TokenAuthentication方案不同,JWT不需要使 ...