k8s入坑之路(16)kubernetes中CICD/基于宿主机jenkins

时间:2022-03-11 05:51:38

cicd的结合组件

k8s入坑之路(16)kubernetes中CICD/基于宿主机jenkins

需要代码仓库如gitlab、github。包构建工具Maven等,持续集成工具如jenkins,github/cicd。结合自己脚本实现重复式任务自动化。

传统服务发布流程:

k8s入坑之路(16)kubernetes中CICD/基于宿主机jenkins

提交代码到仓库使用maven工具构建包,发布到指定服务器上(正式测试等),调用脚本或ansible执行发布。

传统存在问题:

k8s入坑之路(16)kubernetes中CICD/基于宿主机jenkins

传统服务常见的是通过负载均衡器更新单个服务测试好在挂载。需要部署多个环境,重复性操作。通过k8s可以把多个环境放置不同的namespace中,通过yaml文件去指定不同namespace,ingress-controller来控制不同域名。实现分流测试。

容器部署:

k8s入坑之路(16)kubernetes中CICD/基于宿主机jenkins

git提交代码maven构建,然后build镜像,将镜像push到私有库。k8s运行进行健康检查。多个环境只需构建一次即可。有不同环境相关东西,可以写入configmap中挂载进去,比如不同环境连接数据库,不要写死地址,通过环境变量去拿相应的地址。k8s传入需要的环境变量。上线后可以通过service version实现A B版本权重分流测试,或通过controller-ingress进行分流及AB版本测试。

环境安装:

宿主机环境安装git、maven、jenksion

jenkins 官网下载地址:jenkins.io

下载包后直接后台运行

nohup java -jar jenkins.war --httpPort=8081 &

进入jenkins后台

创建一个新的job

构建一个流水线pipeline管道

k8s入坑之路(16)kubernetes中CICD/基于宿主机jenkins

通过script去构建cicd

k8s入坑之路(16)kubernetes中CICD/基于宿主机jenkins

###通过点击右侧可以出现一个构建基本模板。更多语法可以参考pipeline语法。

定义Pipoline script

node {
env.BUILD_DIR = "/root/build-workspace" #定义build目录
env.MODULE = "web-demo" #定义当前名称
env.HOST = "www.cswjh.com" #定义ingress 域名
stage('Preparation') { // for display purposes
// Get some code from a GitHub repository
git 'http://172.17.166.172/root/k8s-web-demo.git' #拷贝代码
}
stage('maven build'){//build images sh "mvn -pl ${MODULE} -am clean package" #构建包
}
stage('build images'){//build docker images sh "/root/script/build-image-web.sh" #执行build 及push脚本
}
stage('Deplay'){//kubectl apply sh "/root/script/deploy.sh" #k8s部署
} }

build-image-web.sh

k8s入坑之路(16)kubernetes中CICD/基于宿主机jenkinsk8s入坑之路(16)kubernetes中CICD/基于宿主机jenkins
#!/bin/bash
if [ ${BUILD_DIR} == "" ];then #判断jenkins 默认定义的变量 build目录是否生效
echo "env 'BUILD_DIR' is not set"
exit 1
fi DOCKER_DIR=${BUILD_DIR}/${JOB_NAME} #在build目录下创建一个工作目录 工作目录以jenkins默认变量 name命名 echo "${DOCKER_DIR}" #输出当前docker 工作目录 if [ ! -d ${DOCKER_DIR} ];then #判断目录是否存在 不存在则建立
mkdir -p ${DOCKER_DIR}
fi echo "docker workspace: ${DOCKER_DIR}" #docker 工作目录 JENKINS_DIR=${WORKSPACE}/${MODULE} #定义jenksin目录 取jenksin默认变量 jenksion的工作目录下的预定义web-demo目录 echo "jenkins workspace: ${JENKINS_DIR}" #输出目录变量是否生效 if [ ! -f ${JENKINS_DIR}/target/*.war ];then #查看工作目录下 是否存在war包 无war包则退出
echo "target/*.war not found"
exit 1
fi cd ${DOCKER_DIR} #跳转docker build 目录 rm -rf * #删除上个构建留下东西 unzip -oq ${JENKINS_DIR}/target/*.war -d ./ROOT #将war包解压到当前文件中 或使用docker 中 mv ${JENKINS_DIR}/Dockerfile . ##将jenksion web-demo工作目录下的Dockerfile 移动到docker build工作目录中 if [ -d ${JENKINS_DIR}/dockerfiles ];then #如果存在dockerfiles目录也移动到当前目录中 dockerfiles中包含了启动脚本文件 及前台运行命令
mv ${JENKINS_DIR}/dockerfiles .
fi VERSION=$(date +%Y%m%d%H) #为镜像生成时间序列 IMAGE_NAME=172.17.166.217/kubenetes/${JOB_NAME}:${VERSION} #为镜像命名 以时间序列为版本号 echo "${IMAGE_NAME}" > ${WORKSPACE}/IMAGE #将镜像版本输入一个文件进行存储方便k8s .yaml取到 echo "building image:${IMAGE_NAME}" #输出images 信息 docker build -t ${IMAGE_NAME} . #构建dockerfile docker push ${IMAGE_NAME} #镜像上传到版本库中

build-image-web.sh

deploy.sh

k8s入坑之路(16)kubernetes中CICD/基于宿主机jenkinsk8s入坑之路(16)kubernetes中CICD/基于宿主机jenkins
#!/bin/bash

name=${JOB_NAME} #jenkins 当前job名称
image=$(cat ${WORKSPACE}/IMAGE) #镜像地址及名称
host=${HOST} #ingress 域名 echo "deploying ... name: ${name} ,image: ${image},host: ${host}" #查看当前变量是否生效 rm -f web.yaml #删除当前目录下web.yaml文件 cp $(dirname "${BASH_SOURCE[0]}")/template/web.yaml ./ #将模板文件导入到当前目录下 sed -i "s,{{name}},${name},g" web.yaml #替换模板文件中name名称
sed -i "s,{{image}},${image},g" web.yaml #替换模板文件中image 地址
sed -i "s,{{host}},${host},g" web.yaml #替换ingress中域名 kubectl apply -f web.yaml #执行kubernetes部署 cat web.yaml #查看文件是否定义成功 #健康检查
sleep 5
count=60
success=0
IFS="," #转换为数组
while [ ${count} -gt 0 ]
do
replicas=$(kubectl get deployments.apps ${name} -o go-template='{{.status.replicas}},{{.status.updatedReplicas}},{{.status.readyReplicas}},{{.status.availableReplicas}}') #查看当前replicas数值
echo "replicas: ${replicas}"
arr=(${replicas})
if [ "${arr[0]}" == "${arr[1]}" -a "${arr[1]}" == "${arr[2]}" -a "${arr[2]}" == "${arr[3]}" ];then #查看replicas各项数值是否相等
echo "health check success"
success=1
break
fi
((count--))
sleep
done if [ ${success} -ne 1 ];then
echo "health check failed"
exit 1
fi

deploy.sh

k8s入坑之路(16)kubernetes中CICD/基于宿主机jenkinsk8s入坑之路(16)kubernetes中CICD/基于宿主机jenkins
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{name}}
spec:
selector:
matchLabels:
app: {{name}}
replicas: 4
template:
metadata:
labels:
app: {{name}}
spec:
containers:
- name: {{name}}
image: {{image}}
ports:
- containerPort: 8080
---
#service
apiVersion: v1
kind: Service
metadata:
name: {{name}}
spec:
ports:
- port: 80
protocol: TCP
targetPort: 8080
selector:
app: {{name}}
type: ClusterIP ---
#ingress
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: {{name}}
spec:
rules:
- host: {{host}}
http:
paths:
- pathType: Prefix
path: /
backend:
service:
name: {{name}}
port:
number: 80

web.yaml

github安装

k8s入坑之路(16)kubernetes中CICD/基于宿主机jenkinsk8s入坑之路(16)kubernetes中CICD/基于宿主机jenkins
# GitLab Server 的搭建

参考 https://about.gitlab.com/installation

## 1. 准备工作

以Centos7为例,准备一台至少内存为4G的机器。

## 2. 安装依赖软件

```
sudo yum install -y git vim gcc glibc-static telnet
sudo yum install -y curl policycoreutils-python openssh-server
sudo systemctl enable sshd
sudo systemctl start sshd sudo yum install postfix
sudo systemctl enable postfix
sudo systemctl start postfix
``` ## 3. 设置gitlab安装源 如果在国内的话,可以尝试使用清华大学的源。 新建 /etc/yum.repos.d/gitlab-ce.repo,内容为 ```
[gitlab-ce]
name=Gitlab CE Repository
baseurl=https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el$releasever/
gpgcheck=0
enabled=1
``` 如果在国外的话,可以使用 ```
curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ee/script.rpm.sh | sudo bash
``` ## 4. 安装GitLab 关于域名,如果要是设置域名,则如下,这个域名可以是真实购买的域名,如果您要把gitlab安装到公网比如阿里云上的话。 如果只是想本地测试,则可以像下面一样,设置一个example的域名,然后记得在本地你的笔记本设置host,如果是MAC就在 /etc/hosts里添加 一行 `192.168.211.10 gitlab.example.com` ```
sudo EXTERNAL_URL="http://gitlab.example.com" yum install -y gitlab-ce
``` 如果不想设置域名,或者想将来再考虑,可以直接 ```
sudo yum install -y gitlab-ce
``` 安装完成以后,运行下面的命令进行配置 ```
sudo gitlab-ctl reconfigure
``` ## 5. 登陆和修改密码 打开http://gitlab.example.com/ 修改root用户密码,然后使用root和新密码登陆。 ![gitlab](img/gitlab-1.png)

gitlab-service安装

k8s入坑之路(16)kubernetes中CICD/基于宿主机jenkins的更多相关文章

  1. k8s入坑之路(7)kubernetes设计精髓List/Watch机制和Informer模块详解

    1.list-watch是什么 List-watch 是 K8S 统一的异步消息处理机制,保证了消息的实时性,可靠性,顺序性,性能等等,为声明式风格的API 奠定了良好的基础,它是优雅的通信方式,是 ...

  2. k8s入坑之路(15)kubernetes共享存储与StatefulSet有状态

    共享存储 docker默认是无状态,当有状态服务时需要用到共享存储 为什么需要共享存储: 1.最常见有状态服务,本地存储有些程序会把文件保存在服务器目录中,如果容器重新启停则会丢失. 2.如果使用vo ...

  3. k8s入坑之路(10)kubernetes coredns详解

    概述 作为服务发现机制的基本功能,在集群内需要能够通过服务名对服务进行访问,那么就需要一个集群范围内的DNS服务来完成从服务名到ClusterIP的解析. DNS服务在kubernetes中经历了三个 ...

  4. k8s入坑之路(2)kubernetes架构详解

    每个微服务通过 Docker 进行发布,随着业务的发展,系统中遍布着各种各样的容器.于是,容器的资源调度,部署运行,扩容缩容就是我们要面临的问题.   基于 Kubernetes 作为容器集群的管理平 ...

  5. k8s入坑之路(11)kubernetes服务发现

    kubernetes访问场景 1.集群内部访问 2.集群内部访问外部 3.集群外部访问内部 1.集群内部访问 1.pod之间直接ip通讯(利用calico通过路由表经过三层将ip流量转发)由于容器之间 ...

  6. k8s入坑之路(4)kubenetes安装

    三种安装方法: 1.kubeadm 2.kubespray 3.二进制安装 kubespray安装kubernetes集群 优点: 1.kuberspray对比kubeadm更加简洁内部集成了kube ...

  7. k8s入坑之路(13)服务迁移(定时任务 微服务 传统服务)

    定时任务迁移kubernetes 服务迁移步骤 1.安装好java 2.安装好maven 项目打包 mvn package 测试传参运行 java -cp cronjob-demo-1.0-SNAPS ...

  8. k8s入坑之路(9)k8s网络插件详解

    Flannel: 最成熟.最简单的选择 Calico: 性能好.灵活性最强,目前的企业级主流 Canal: 将Flannel提供的网络层与Calico的网络策略功能集成在一起. Weave: 独有的功 ...

  9. k8s入坑之路(13)kubernetes重要资源(namespace隔离 resources资源管理 label)

    Namespace --- 集群的共享与隔离 语言中namespace概念 namespace核心作用隔离 以上是隔离的代码.namespace隔离的是: 1.资源对象的隔离:Service.Depl ...

随机推荐

  1. ASP.NET的路由

    之前在探讨ASP.NET  MVC的路由时,无意发现原本ASP.NET也有路由机制的.在学习MVC的路由时觉得这部分的资料不太多,不怎么充实(也许是我不懂得去看微软的官方文档).后来也尝试一下ASP. ...

  2. CSS之盒子模型

    CSS核心内容 源文件目录: D:\Users\ylf\Workspaces\MyEclipse 10 标准流 盒子模型 浮动 定位 标准流/非标准流: 标准流:就是普通的 非标准流:实际工作中要打破 ...

  3. Linux网络编程9——对TCP与UDP的简易封装2.0

    具体生成动态库的操作及使用该动态库的操作请参见上篇博文.以下仅仅列出改进版本的代码. 代码 my_socket.h #ifndef __MY_SOCKET_H__ #define __MY_SOCKE ...

  4. QT 事件过滤器 eventFilter

    在监测的代码里执行需要的行为. 这可以用event Filter来达到. 设置一个event filter有两个步骤: 1. 在目标对象上调用installEventFilter(),将监测对象注册到 ...

  5. Eclipse Removing obsolete files from server 问题

    今天在修改server.xml调试程序时,遇到下面这个问题,clean,重启都不好使.                 Removing obsolete files from server..    ...

  6. [原创]基于Zynq SDIO WIFI 2.4G/5G SotfAP STA

    支持正基WiFi模块.高通WiFi模块: 2.4G速率: 5G AC速率: 支持SoftAP.STA模式:

  7. 安装 xadmin 报错: Command "python setup.py egg_info" failed with error code 1 in C:\Users\Python\AppData\Local\Temp\pip-install-1k1byg0p\xadmin\

    报错详情 安装 xadmin 组件的时候报错 不论是命令行还是 pycharm 方式都不行 分析报错 按照报错提示是说 README.rst 文件的编码问题导致. 解决报错 通过 github 下载源 ...

  8. python--第十二天总结(Python操作 RabbitMQ、Redis、Memcache、SQLAlchemy)

    Memcached Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的速度 ...

  9. dp 最大正方形

    洛谷P1387 最大正方形 分析:画图模拟,发现以坐标(i,j)为右下顶点的正方形可以根据它左上方的三个点得到,就很轻松写出状态转移方程了. 代码: #include<bits/stdc++.h ...

  10. Go 语言相关的优秀框架,库及软件列表

    If you see a package or project here that is no longer maintained or is not a good fit, please submi ...