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


作为一个想搞开发的,最近似乎都在干运维,不知道有没有跑偏。。。
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都可以访问注册中心
至此部署完毕!!!

k8s+jenkins+docker部署微服务实现CI/CD相关推荐

  1. docker部署微服务项目

    上次有人说部署单个springboot项目和ssm写的非常的简单可以写一篇docker部署微服务的结构的文章的吗 安排 什么是微服务? 微服务架构是一种将单个应用程序作为一套小型服务开发的方法,每种应 ...

  2. jenkins+Docker+springcloud微服务持续集成

    流程说明 本地部署 微服务是可以独立部署的,如果不借助spring-boot-maven插件,package出来的jar包是不能运行的. 借助spring-boot-maven插件package出来的 ...

  3. Docker部署微服务应用笔记(三)

    Docker安装java:8环境 因为现在都是使用java8开发直接使用命令: docker pull java这是默认下载最新版本镜像 docker pull java:8这是下载指定版本镜像 列出 ...

  4. Docker 部署微服务项目

    目录 一.前言 二.环境准备 1.安装 Docker 2.Docker 安装 MySQL 3.Docker 安装 Redis 4.Docker 安装 Nacos 5.Docker 安装 Nginx 三 ...

  5. Docker部署微服务详解

    2019独角兽企业重金招聘Python工程师标准>>> 2013年发布至今,Docker一直广受瞩目,被认为可能会改变软件行业. 但是,许多人并不清楚Docker 到底是什么,要解决 ...

  6. pg安装部署linux_简简单单基于docker部署微服务网关

    ❝ 本文整理于今年3月,收录在个人开源仓库JavaScriptCollection中,其中很多概念不乏借鉴.摘抄自官网,便于复习相关概念,有兴趣的可以直接去仓库Clone文档学习.参考! ❞ 基本概念 ...

  7. Docker部署微服务时Springcloud网关报错 java.net.UnknownHostException: xxx: Name or service not known

    文章目录 一.问题 二.原因 三.解决办法 一.问题 eureka.gateway 和 微服务应用 部署好后用网关访问应用时报错 java.net.UnknownHostException: 235e ...

  8. 微服务开发及部署_简简单单基于docker部署微服务网关

    ❝ 本文整理于今年3月,收录在个人开源仓库JavaScriptCollection中,其中很多概念不乏借鉴.摘抄自官网,便于复习相关概念,有兴趣的可以直接去仓库Clone文档学习.参考! ❞ 基本概念 ...

  9. 中国.NET开发者峰会特别活动-基于k8s的微服务和CI/CD动手实践报名

    2019.11.9 的中国.NET开发者峰会将在上海举办,到目前为止,大会的主题基本确定,这两天就会和大家会面,很多社区的同学基于对社区的信任在我们议题没有确定的情况下已经购票超过了300张,而且分享 ...

最新文章

  1. 【从零学习OpenCV 4】安装过程中问题解决方案
  2. 每天九点十分开始每半小时一次执行一个cron_趣讲 PowerJob 超强大的调度层,开始表演真正的技术了...
  3. 21个令程序员泪流满面的瞬间【第二弹】
  4. 又双叒叕是一个动态简历
  5. 专业PE优盘启动制作工具 - 优启通
  6. CSS中设置页面背景图片
  7. wltp和nedc续航差多少_WLTP续航和NEDC续航差多少?
  8. 谷歌施密特:中国人相当出色2025年将超美国成AI主导丨业界大佬财报频出【软件网每日新闻播报│第11-3期】
  9. [思语]_一花一世界,一树一菩提
  10. Uber是什么 读书笔记
  11. Linux下安装RTX腾讯通
  12. 网络安全 期末复习 (山东农业大学)
  13. 洛谷P4766 [CERC2014]Outer space invaders题解
  14. 关于echarts中南海诸岛的显示问题
  15. 学会怎样尊重一个程序员
  16. ThinkPadE425拆机图
  17. 监控(monitor)和可观测性(Observability)
  18. 【漫漫转码路】Python Day 05
  19. 相机标定(二)-畸变校正,张正友标定法
  20. 程序员修炼之道:从小工到专家读书笔记

热门文章

  1. Velodyne Lidar公布自动驾驶技术世界安全峰会的议程
  2. 字符串练习11_潜伏者
  3. Android 沉浸状态栏
  4. 如何在xmd上运行java文件,XMD(XML类)类的用法
  5. MySQl建库建表及增删改查
  6. 如何聪明的提问(职场的必踩坑)
  7. 微积分位于基础数学的核心部分
  8. cell delay和net delay
  9. 基于ADS的功分、耦合器的设计
  10. 阿里研究院崔瀚文:“单身经济”背后的“新家园”