k8s+jenkins+docker部署微服务实现CI/CD

“所爱隔山海,山海不可平,海有舟可渡,山有路可行,此爱翻山海,山海皆可平。”


作为一个想搞开发的,最近似乎都在干运维,不知道有没有跑偏。。。
2021.5.14
一般的中小公司个人还是不太建议使用k8s,成本太高了。但是学习一下还是可以的。

CI/CD介绍

网上关于CI/CD的文章一大堆,刚开始听着好像好高大尚的感觉,持续集成CI(Continuous Integration),持续交付(Continuous Delivery),持续部署CD(Continuous Deployment),个人认为就是有错尽早发现,添加一点东西就测一下,部一下(部到整体,而不是自己所写的那么一点,因为自己写的肯定没毛病啊。。),看看有无毛病,而不是等着都干完了一起测,哪的多费劲。其实平时好像也是这么开发的啊,但CI/CD还强调自动化部署,这点挺重要的。

  • 持续集成:写了新的代码,添加了新的功能,马上提到仓库测一下,看看和原来的代码会不会有毛病,有毛病就得赶紧治。
  • 持续交付:在持续集成的基础上,将新加的代码部署到接近于正式环境,比如生产环境,测一测。
  • 持续部署:在持续部署的基础上,自动化的进行上面的一些列操作,你只需要提交代码,自动的实现部署,省的自己费半天劲。

k8s搭建

花了一个星期搞了搞k8s,感觉有点复杂,虽然搭建起来了,虽然只学到了皮毛,但是学习过程中找到了很多不错的资源,希望对你们有所帮助。
为什么要用k8s,我现在接触的感觉k8s比较强的一点是,如果你服务有两个副本,其中一个挂了,那么他会帮你自动帮你新建一个副本,保证一直有两个正常的服务在运行,如果挂的服务正常了,多余的将会被删除,个人感觉这个功能非常强悍(匹夫之见)
k8s:容器编排工具,能够和方便的管理集群
自己按照网上五花八门的教程,搭了几遍都失败了,不是这个错就是那个错,有的还要翻墙,国内要求科学上网,所以翻墙只能解决一时的问题,最后找到了大佬搭建的脚本,只需几步便搭建成功了。
搭建之前,如果需要dns,可以先配置一下dns,省的后面麻烦,因为k8s部署后他里面内置的coredns,配置是从宿主机copy过去的,如果你需要用dns先配置一下(云服务器应该不用配,华为云dns是在控制台配置的,自己视情况而定)
教程是使用ansible搭建的k8s
https://github.com/easzlab/kubeasz
首先下载脚本,下载完成执行完命令后,在/etc/ansible下面有个host文件,需要配置一下
对ansible不了解的可以先去了解一下,了解一下就ok,知道配置的意义,已经怎么配。
这是我的配置,仅供参考,ip啥的改成自己的,我是在103机器装的ansible,108为master节点,111和148位node节点,听说k8s后面将不会区分master和node,具体是不是就不得而知了。配置完成后继续执行后面的命令完成安装。

# 'etcd' cluster should have odd member(s) (1,3,5,...)
# variable 'NODE_NAME' is the distinct name of a member in 'etcd' cluster
[etcd]
192.168.1.103 NODE_NAME=etcd1
192.168.1.108 NODE_NAME=etcd2
192.168.1.111 NODE_NAME=etcd3
192.168.1.148 NODE_NAME=etcd4# master node(s)
[kube-master]
192.168.1.108# work node(s)
[kube-node]
192.168.1.111
192.168.1.148# [optional] harbor server, a private docker registry
# 'NEW_INSTALL': 'yes' to install a harbor server; 'no' to integrate with existed one
[harbor]
#192.168.1.8 HARBOR_DOMAIN="harbor.yourdomain.com" NEW_INSTALL=no# [optional] loadbalance for accessing k8s from outside
[ex-lb]
#192.168.1.6 LB_ROLE=backup EX_APISERVER_VIP=192.168.1.250 EX_APISERVER_PORT=8443
#192.168.1.7 LB_ROLE=master EX_APISERVER_VIP=192.168.1.250 EX_APISERVER_PORT=8443# [optional] ntp server for the cluster
[chrony]
#192.168.1.1[all:vars]
# --------- Main Variables ---------------
# Cluster container-runtime supported: docker, containerd
CONTAINER_RUNTIME="docker"# Network plugins supported: calico, flannel, kube-router, cilium, kube-ovn
CLUSTER_NETWORK="flannel"# Service proxy mode of kube-proxy: 'iptables' or 'ipvs'
PROXY_MODE="ipvs"# K8S Service CIDR, not overlap with node(host) networking
SERVICE_CIDR="10.68.0.0/16"# Cluster CIDR (Pod CIDR), not overlap with node(host) networking
CLUSTER_CIDR="172.20.0.0/16"# NodePort Range
NODE_PORT_RANGE="20000-40000"# Cluster DNS Domain
CLUSTER_DNS_DOMAIN="cluster.local."# -------- Additional Variables (don't change the default value right now) ---
# Binaries Directory
bin_dir="/opt/kube/bin"# CA and other components cert/key Directory
ca_dir="/etc/kubernetes/ssl"# Deploy Directory (kubeasz workspace)
base_dir="/etc/ansible"

其他步骤很完善,我这里不在复述,沟通交流那里可以加群,里面大佬挺多的,有问题可以在里面问,也可以留言,我尽量解答。
我是搭建没有问题。。
使用kubectl的一串命令验证一下集群有没有毛病,然后就是搭建可视化界面,
找了一个Kuboard

kubectl apply -f https://kuboard.cn/install-script/kuboard.yaml

执行命令获取token

kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep kuboard-user | awk '{print $1}')

在这里插入图片描述
访问任意节点的IP:32567即可访问界面,附上大佬的k8s教程,
https://www.kuboard.cn/learning/

在这里插入图片描述
k8s就搭建成功了

jenkins

你可以在k8s外搭建jenkins,也可以在k8s上搭建jenkins,搭建在k8s中可以保证其高可用,
外面搭建jenkins很简单,就下载war包java命令运行就行,或者使用docker运行,不在复苏,感兴趣可以去百度,我这里介绍在k8s中搭建jenkins
参考:https://www.jianshu.com/p/0aef1cc27d3d
-首先创建pv用于数剧挂载,pvc.yaml

apiVersion: v1
kind: PersistentVolume
metadata:name: opspv
spec:capacity:storage: 20GiaccessModes:- ReadWriteManypersistentVolumeReclaimPolicy: Deletenfs:server: 192.168.1.108path: /opt/nfs/jenkins---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:name: opspvcnamespace: kube-ops
spec:accessModes:- ReadWriteManyresources:requests:storage: 20Gi

注意修改server,其他自己视情况修改。

  • 创建权限,因为 jenkins 后面需要能够动态创建 slave,因此它必须具备一些权限,jenkins-rbac.yaml
apiVersion: v1
kind: ServiceAccount
metadata:name: jenkinsnamespace: kube-ops---kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: jenkins
rules:- apiGroups: ["extensions", "apps"]resources: ["deployments"]verbs: ["create", "delete", "get", "list", "watch", "patch", "update"]- apiGroups: [""]resources: ["services"]verbs: ["create", "delete", "get", "list", "watch", "patch", "update"]- apiGroups: [""]resources: ["pods"]verbs: ["create","delete","get","list","patch","update","watch"]- apiGroups: [""]resources: ["pods/exec"]verbs: ["create","delete","get","list","patch","update","watch"]- apiGroups: [""]resources: ["pods/log"]verbs: ["get","list","watch"]- apiGroups: [""]resources: ["secrets"]verbs: ["get"]---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:name: jenkinsnamespace: kube-ops
roleRef:apiGroup: rbac.authorization.k8s.iokind: ClusterRolename: jenkins
subjects:- kind: ServiceAccountname: jenkinsnamespace: kube-ops
  • 部署jenkins-deployment.yaml
---
apiVersion: apps/v1
kind: Deployment
metadata:name: jenkinsnamespace: kube-ops
spec:template:metadata:labels:app: jenkinsspec:terminationGracePeriodSeconds: 10serviceAccount: jenkinscontainers:- name: jenkinsimage: jenkins/jenkins:ltsimagePullPolicy: IfNotPresentports:- containerPort: 8080name: webprotocol: TCP- containerPort: 50000name: agentprotocol: TCPresources:limits:cpu: 1000mmemory: 1Girequests:cpu: 500mmemory: 512MilivenessProbe:httpGet:path: /loginport: 8080initialDelaySeconds: 60timeoutSeconds: 5failureThreshold: 12readinessProbe:httpGet:path: /loginport: 8080initialDelaySeconds: 60timeoutSeconds: 5failureThreshold: 12volumeMounts:- name: jenkinshomesubPath: jenkinsmountPath: /var/jenkins_homesecurityContext:fsGroup: 1000volumes:- name: jenkinshomepersistentVolumeClaim:claimName: opspvcselector:matchLabels:app: jenkins
---
apiVersion: v1
kind: Service
metadata:name: jenkinsnamespace: kube-opslabels:app: jenkins
spec:selector:app: jenkinstype: NodePortports:- name: webport: 8080targetPort: webnodePort: 30003- name: agentport: 50000targetPort: agent

对于配置的含义,大部分教程里面都有。
然后就是部署

kubectl create -f pvc.yaml
kubectl create -f jenkins-rbac.yaml
kubectl create -f jenkins-deployment.yaml

然后查看状态

kubectl get pods -n kube-ops

在这里插入图片描述
如果ready哪里是0/1标识不正常
执行命令查看状态

kubectl describe pod jenkins-86d6987987-c9m2t -n kube-ops

查看日志

kubectl logs jenkins-86d6987987-c9m2t -n kube-ops

如果报错

touch: cannot touch '/var/jenkins_home/copy_reference_file.log': Permission denied
Can not write to /var/jenkins_home/copy_reference_file.log. Wrong volume permissions?

很明显是nfs挂载文件没有权限,加权限就行

chown -R 1000 /opt/nfs/jenkins

然后新建一个

# 删除原来的
kubectl delete -f jenkins.yaml
# 新建
kubectl create -f jenkins.yaml
# 再查看状态是否正常,不正常继续排查
kubectl get pods -n kube-ops

然后访问任意节点的ip:30003即可访问jenkins
第一次登陆的密码在日志里面可以看见,然后就是安装他推荐的插件,安装完成后就是配置jenkins,在jenkins配置里面配置好你所需的配置,根据自己情况而定,比如我们项目使用grade我就要配置gradle等等。。

CI/CD实现

到这里你已经搭建好k8s集群,配置好jenkins(太费劲了,曾经的我一度想放弃,这什么玩意儿。。。),然后就是新建一个项目
讲一下你们的心路历程(没错就是你们的),你提交代码到仓库,如果是getlab,使用webhook自动触发拉取,不是的话就配置cron表达式定时构建,jenkins拉取到代码后,需要进行构建,测试,打包,一系列操作,这是最基本的,姑且认为这是持续集成,然后需要将镜像push到镜像仓库,然后执行k8s的命令,从镜像仓库拉取镜像,部署服务,这可以叫持续交付,整个过程你干嘛了?你就提交了代码,啥也没干,看能不能部署成功就完事,整体自动化,这可以算是持续部署,整体思路就是这样
理想很丰满,现实很骨感,k8s感觉性能上还有待提升吧,我直接使用docker,可以自行好几个微服务,但使用k8s部署几个既感觉不太行了,而且我们的项目是saas平台的,直接使用jenkins+docker也可以实现CI/CD只是没有k8s的诸多优点,视情况而定吧
我举例部署一个eureka
在这里插入图片描述
如果用的仓库是getlab的建议使用流水线,直接使用管道Pipeline实现CI/CD,而且有webhook插件可以提供自动触发构建,非常的方便,说实话Pipeline我也不是很会。。群里有人用这个,需要的话可以在群里问,使用Pipeline的话相比比较容易实现,但你的学点Pipeline的知识,反正我是不会。
我们公司用的是华为云的仓库,目前流水线只能使用getlab的仓库,没办法建一个自由项目吧,

  • 配置好代码仓库
    在这里插入图片描述
  • 构建
    在这里插入图片描述
    我们项目使用gradle,使用maven的自己配置,不会的话网上也有其他文章,用完gradle感觉比maven好,不说别的,构建,测试,打包一个build命令完事,真的太方便了。我去掉了测试,加上测试忒慢了,果断先去掉。
  • push镜像
    在这里插入图片描述
    我用的是阿里云的镜像仓库,还有nexus搭建的docker仓库,都一样,你也可以使用dockerhub的想用啥就用啥,私有镜像仓库注意镜像的标签,比如我的:registry.cn-beijing.aliyuncs.com/byb-docker/regist:001,阿里云私有仓库也有介绍,这里使用dockerfile构建镜像 ,Directory for Dockerfile哪里有一个 . 表示在当前工作空间的根目录,也就是项目的根目录
    在这里插入图片描述
  • k8s拉取镜像部署微服务,配置文件放在了项目的根目录下,上图的k8s-deployment.yaml
---
apiVersion: apps/v1
kind: Deployment
metadata:name: admin-registnamespace: kube-spring-cloudlabels:app: regist
spec:replicas: 1selector:matchLabels:app: registtemplate:metadata:labels:app: registnamespace: kube-spring-cloudspec:containers:- name: registimage: registry.cn-beijing.aliyuncs.com/byb-docker/regist:001imagePullPolicy: AlwaysimagePullSecrets:- name: aliyun-secret
---
apiVersion: v1
kind: Service
metadata:name: admin-registnamespace: kube-spring-cloud
spec:type: NodePortports:- name: webport: 38001targetPort: 38001nodePort: 38001selector:app: regist

可以通过参数化构建,将名称和镜像以参数传入配置文件,这样所有的服务用一个配置即可,我是用的是nodeport建立与外网的联系,也可以使用ingerss。
如果k8s里面搭建的jenkins直接执行脚本就行,我是在外面不得jenkins所以使用了ssh
在这里插入图片描述

echo "---------------delete old deployment-----------------------"
kubectl delete deployment admin-regist -n kube-spring-cloudecho "---------------delete old service-----------------------"
kubectl delete service admin-regist -n kube-spring-cloudecho "---------------delete old ingress-----------------------"
kubectl get ingress admin-regist -n kube-spring-cloudecho "---------------deploy-----------------------"
kubectl create -f  /root/k8s/k8s-deployment.yaml -n kube-spring-cloud

在kube-spring-cloud便可以看见部署的微服务
在这里插入图片描述
访问任意节点的ip:380011都可以访问注册中心在这里插入图片描述
至此部署完毕!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/1621579.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

Material UI 的安装与使用

Material UI 的安装使用 (附练习demo) Material UI ( 也称 MUI ) 是一个开源的React组件库,实现了Google的Material Design。 它包括一个全面的预构建组件集合,开箱即用,可用于生产。 材料UI设计精美,并具有一套自定义选项&#…

Chakra-ui

一、chakra-ui组件库介绍 Chakra UI 是⼀个简单的, 模块化的易于理解的 UI 组件库. 提供了丰富的构建 React 应⽤所需的UI组件. ⽂档: https://chakra-ui.com/docs/getting-started Chakra UI 内置 Emotion,是 CSS-IN-JS 解决⽅案的集⼤成者基于 Styled-Systems…

8.6.tensorRT高级(3)封装系列-终极封装形态,以及考虑的问题

目录 前言1. 终极封装总结 前言 杜老师推出的 tensorRT从零起步高性能部署 课程,之前有看过一遍,但是没有做笔记,很多东西也忘了。这次重新撸一遍,顺便记记笔记。 本次课程学习 tensorRT 高级-终极封装形态,以及考虑的…

android版本360ui,国产手机UI系统有哪些

国产手机UI系统有哪些 UI系统的用户体验、生态系统的建立等“软实力”将是移动终端厂商的主战场,拥有生态系统的厂商才能掌握主动。那么,都有国产手机UI系统?下面就和jy135小编一起看看吧! 最好用的九大国产手机UI系统 一、小米MIUI MIUI是小米旗下的定…

仿华为EmotionUI 3.0滑动效果

华为美腿妻手机卖的比较火,其中的一个两点是Emotion 3.0,里面各种UI让人耳目一新的感觉。 一开始看到我就喜欢了其中的很多设计。其中的一个是左右滑动类似于开源项目Indecator的。但是他的实现不仅仅是这个。 于是我就再别人的基础上改动了一下&#x…

中国人需要了解华为鸿蒙系统的8个事实,真的这么美好吗?

1. 华为的鸿蒙系统是怎么回事? 华为于昨天推出的鸿蒙系统是谷歌安卓系统的替代品,可应用于电视、汽车、平板电脑和其他设备。 之前民间一直传言说,华为正在为手机、平板电脑和其他智能设备开发自己的操作系统,以防无法使用谷歌的Android软件…

Android学习之路(11) ActionBar与ToolBar的使用

自android5.0开始,AppCompatActivity代替ActionBarActivity,而且ToolBar也代替了ActionBar,下面就是ActionBar和ToolBar的使用 ActionBar 1、截图 2、使用 2.1、AppCompatActivity和其对应的Theme AppCompatActivity使用的是v7的ActionBa…

十六、pikachu之SSRF

文章目录 1、SSRF概述2、SSRF(URL)3、SSRF(file_get_content) 1、SSRF概述 SSRF(Server-Side Request Forgery:服务器端请求伪造):其形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能&…

基于体素形态学测量分析(VBM)的工具包比较及其在年龄预测中的应用

摘要 基于体素的形态学测量分析(VBM)通常用于灰质体积(GMV)的局部量化。目前存在多种实现VBM的方法。然而,如何比较这些方法及其在应用中的效用(例如对年龄效应的估计)仍不清楚。这会使研究人员疑惑他们应该在其项目中使用哪种VBM工具包。本研究以用户为中心&#…

使用MV制作最简单的游戏:我要做游戏(4)

公众号原文 本期将设计游戏中基本,也是核心的数值元素。不想循规蹈矩的朋友也可自行回顾前三期的内容: 我要做游戏(1) 我要做游戏(2) 我要做游戏(3) 呃,说道数值,可能一些人脑海里觉得它是这样的: 这么想其实也没错啦,不过实际游戏设计中,攻击力与防御力只是…

On-Manifold Optimization: Local Parameterization

Overview Manifold Space vs Tangent Space Jacobian w.r.t Error State Jacobian w.r.t Error State vs True State According 1 2.4, The idea is that for a x ∈ N x \in N x∈N the function g ( δ ) : f ( x ⊞ δ ) g(\delta) : f (x \boxplus \delta) g(δ):f(x…

DeforGAN:用GAN实现星际争霸开全图外挂!

点击上方“机器学习与生成对抗网络”,关注"星标" 获取有趣、好玩的前沿干货! 文章来源:机器之心 作者:Yonghyun Jeong等 参与:李诗萌、Geek AI 对于广大星际争霸迷来说,地图全开作弊代码「Black …

局域网联机_七日杀v17.2(B27)版/支持局域网联机/多项修改器/初始存档/局域网联机教程...

点击蓝字关注我们,每日提供优质游戏 游戏介绍 那时地球表面已经变成废墟,更糟的是,没有人知道到底是因为辐射、生化武器还是天灾,导致地面上出现了一群僵尸。玩家将扮演在美国亚历桑纳地区的一名幸存者,那里是地球最后…

魔兽争霸 / 星际争霸 无法使用 CTRL + 1 进行编队

打游戏时发现不好编队, 应该是快捷键冲突导致。 查了一下,是输入法的问题。 目前用的QQ五笔输入法里用到了 CTRL 1,所以在游戏里就用不了了。 如下面所示,把最后的 CTRL 1 的复选框勾掉就可以了。

DeepMind《星际争霸2》AI碾压人类遭Gary Marcus猛怼:通用智能就是空谈

来源:新智元 本文 3635 字 ,建议阅读 10分钟 。 本文介绍了Marcus对AI碾压人类以及未来通用智能研究意义的质疑。 针对DeepMind前几日发布的《星际争霸2》智能体AlphaStar进化版,他在Twitter再次提出了自己的质疑。不过这次,Marcu…

星际2数据编辑器

转自:https://blog.csdn.net/xoyojank/article/details/8122886 只列了技能的划分,其余的参考链接 对象类型 星际2就对象有很多类型, 这里只说一下比较常见的. 这些类型还有子类型, 对象的实例之间是可以进行数据拷贝和派生的. Units(单位) 大多数人应…

nodejs里面的event loop

1. event loop 1.1 什么是event-loop js的标准文档定义如下 https://developer.mozilla.org/en-US/docs/Web/JavaScript/EventLoop#event_loop https://javascript.info/event-loop html的标准定义 https://html.spec.whatwg.org/multipage/webappapis.html#event-loop-proc…

chatgpt赋能python:如何用Python编写炒股软件

如何用Python编写炒股软件 随着股票投资的普及和互联网技术的发展,越来越多的人开始尝试使用计算机辅助炒股,以获取更好的投资回报。Python作为一种简单易学、高效实用的编程语言,受到了众多股票投资者的青睐。本文将介绍如何用Python编写炒…

单例模式:保证一个类仅有一个实例

单例模式:保证一个类仅有一个实例 欢迎来到设计模式系列的第二篇文章!在上一篇中,我们已经对设计模式有了初步的了解,今天让我们深入研究第一个模式——单例模式。 什么是单例模式? 在软件开发中,我们经…

RabbitMQ从原理到实战—基于Golang【万字详解】

文章目录 前言一、MQ是什么?优势劣势 二、MQ的用途1、应用解耦2、异步加速3、削峰填谷4、消息分发 三、RabbitMQ是什么1、AMQP 协议2、RabbitMQ 包含的要素3、RabbitMQ 基础架构 四、实战1、Simple模式(即最简单的收发模式)2、Work Queues 模型3、Publish/Subscribe…