基于Kubernetes/K8S构建Jenkins持续集成平台(上)-2

简介: Kubernetes实现Master-Slave分布式构建方案

Kubernetes实现Master-Slave分布式构建方案


传统JenkinsMaster-Slave方案的缺陷


Master节点发生单点故障时,整个流程都不可用了


每个 Slave节点的配置环境不一样,来完成不同语言的编译打包等操作,但是这些差异化的配置导致管理起来非常不方便,维护起来也是比较费劲

资源分配不均衡,有的 Slave节点要运行的job出现排队等待,而有的Slave节点处于空闲状态,资源浪费,每台 Slave节点可能是实体机或者VM,当Slave节点处于空闲状态时,也不会完全释放掉资源


以上种种问题,我们可以引入Kubernates来解决!

 

Kubernetes简介


Kubernetes(简称,K8S)是Google开源的容器集群管理系统,在Docker技术的基础上,为容器化的   应用提供部署运行、资源调度、服务发现和动态伸缩等一系列完整功能,提高了大规模容器集群管理的  便捷性。


其主要功能如下:


使用Docker对应用程序包装(package)、实例化(instantiate)、运行(run)。

以集群的方式运行、管理跨机器的容器。以集群的方式运行、管理跨机器的容器。  

解决Docker跨机器容器之间的通讯问题。解决Docker跨机器容器之间的通讯问题。

Kubernetes的自我修复机制使得容器集群总是运行在用户期望的状态。

 

Kubernates+Docker+Jenkins持续集成架构图


2387773-20220307152942968-1856258803.png2387773-20220307152948254-564446880.png


大致工作流程:手动/自动构建 -> Jenkins 调度 K8S API ->动态生成 Jenkins Slave pod - Slave pod 拉取 Git 代码/编译/打包镜像 -

推送到镜像仓库 Harbor - Slave 工作完成,Pod 自动销毁 ->部署到测试或生产 Kubernetes平台。(完全自动化,无需人工干预)

 

 

Kubernates+Docker+Jenkins持续集成方案好处


服务高可用:


当 Jenkins Master 出现故障时,Kubernetes 会自动创建一个新的 Jenkins Master容器,并且将 Volume 分配给新创建的容器,保证数据不丢失,从而达到集群服务高可用。


动态伸缩,合理使用资源:


每次运行 Job 时,会自动创建一个 Jenkins SlaveJob 完成后,Slave 自动注销并删除容器,资源自动释放,而且 Kubernetes 会根据每个资源的用情况,动态分配Slave 到空闲的节点上创建,降低出现因某节点资源利用率高,还排队等待在该节点的情况。


扩展性好:


当 Kubernetes 集群的资源严重不足而导致 Job 排队等待时,可以很容易的添加一个Kubernetes Node 到集群中,从而实现扩展。


Kubeadm安装Kubernetes


Kubernetes的架构


2387773-20220307210506170-1980888679.png



API  Server:用于暴露Kubernetes  API,任何资源的请求的调用操作都是通过kube-apiserver提供的接口进行的。


Etcd:是Kubernetes提供默认的存储系统,保存所有集群数据,使用时需要为etcd数据提供备份计划。


Controller-Manager:作为集群内部的管理控制中心,负责集群内的Node、Pod副本、服务端点(Endpoint)、命名空间(Namespace)、服务账号(ServiceAccount)、资源定额(ResourceQuota)的管理,当某个Node意外宕机时,Controller Manager会及时发现并执行自动化修复流程,确保集群始终处于预期的工作状态。


Scheduler:监视新创建没有分配到Node的Pod,为Pod选择一个Node。

 

Kubelet:负责维护容器的生命周期,同时负责Volume和网络的管理


Kube proxy:是Kubernetes的核心组件,部署在每个Node节点上,它是实现


Kubernetes Service的通信与负载均衡机制的重要组件。

 

安装环境说明

 

主机名称

IP地址

安装的软件

代码托管服务器

 

20.0.0.20

 

Gitlab-12.4.2

Docker仓库服务器

 

20.0.0.50

 

Harbor1.9.2

 

k8s-master

 

20.0.0.10

kube-apiserver、kube-controller-manager、kube- scheduler、docker、etcd、calico,NFS

k8s-node1

20.0.0.70

kubelet、kubeproxy、Docker18.06.1-ce

k8s-node2

20.0.0.80

kubelet、kubeproxy、Docker18.06.1-ce

 

 

 

三台机器都需要完成


首先全部安装docker


然后:

修改三台机器的hostnamehosts文件


hostnamectl set-hostname k8s-master
hostnamectl set-hostname k8s-node1
hostnamectl set-hostname k8s-node2
vim /etc/hosts
0.0.0.10 k8s-master
20.0.0.70 k8s-node1
20.0.0.80 k8s-node2


闭防火墙和关闭SELinux


systemctl stop firewalld systemctl disable firewalld
setenforce 0 临时关闭
vi /etc/sysconfig/selinux
永久关闭改为SELINUX=disabled


设置系统参数,加载br_netfilter模块,不然后面会报错


modprobe br_netfilter


设置允许路由转发,不对bridge的数据进行处理创建文件

vim /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
vm.swappiness = 0


执行文件


sysctl -p /etc/sysctl.d/k8s.conf


kube-proxy开启ipvs的前置条件


cat > /etc/sysconfig/modules/ipvs.modules <<EOF
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
EOF
  
chmod 755 /etc/sysconfig/modules/ipvs.modules && bash
/etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4


所有节点关闭

1

2

3

swapoff -a 临时关闭

vi /etc/fstab 永久关闭注释掉以下字段一般在末尾一行

/dev/mapper/cl-swap swap swap defaults 0 0


安装kubeletkubeadmkubectl

swapoff -a 临时关闭
vi /etc/fstab 永久关闭注释掉以下字段一般在末尾一行
/dev/mapper/cl-swap swap swap defaults 0 0


kubeadm: 用来初始化集群的指令。

kubelet: 在集群中的每个节点上用来启动 pod container 等。

kubectl: 用来与集群通信的命令行工具。

 

清空yum缓存


yum clean all



设置Yum安装源


cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF


安装:(1.20之前的版本否则不支持 k8s1.20以后不兼容docker)


yum install -y kubelet-1.17.0 kubeadm-1.17.0 kubectl-1.17.0


kubelet我们可以先设置一下开机自启和看一下版本 (注意:先不启动,现在启动的话会报错)


systemctl enable kubelet
查看版本
kubelet --version


Master节点需要完成的:

 

1)运行初始化命令(具备docker环境)


kubeadm init --kubernetes-version=1.17.0 \
--apiserver-advertise-address=20.0.0.10 \
--image-repository registry.aliyuncs.com/google_containers \
--service-cidr=10.1.0.0/16 \
--pod-network-cidr=10.244.0.0/16

注意:apiserver-advertise-address这个地址必须是master机器的IP

 

2) 启动kubelet


systemctl restart kubelet


3) 配置kubectl工具(一般装完上面会提示你三条命令 依次执行就行了)


mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config <br>sudo chown $(id -u):$(id -g) $HOME/.ku


4)然后就是安装Calico:

mkdir k8s
cd k8s


不检查凭证下载calico.yaml


wget --no-check-certificate https://docs.projectcalico.org/v3.10/getting-started/kubernetes/install


地址更改,方便从节点通信

 

 

sed -i 's/20.0.0.0/10.244.0.0/g' calico.yaml
kubectl apply -f calico.yaml


5) 查看所有Pod的状态,确保所有Pod都是Running状态

 

kubectl get pod --all-namespaces -o wide


2387773-20220307212018508-477809126.png



Slave节点需要完成  (也就是node1,2)


1)让所有节点让集群环境,使用之前Master节点产生的命令加入集群

kubeadm join 20.0.0.10:6443 --token fww6qy.mf2c32wtatulk506 \
    --discovery-token-ca-cert-hash sha256:bb126b5525f3e34a41cd8e4d55b4bb549753bc6794e52cd6432205f6e1731f3c


2) 启动kubelet

systemctl start kubelet
systemctl status kubelet   #查看状态


2) 回到Master节点查看,如果Status全部为Ready,代表集群环境搭建成功!!!

kubectl get nodes   #全部ready  就可以 了    


 

补充:


kubectl常用命令


kubectl get nodes   #查看所有主从节点的状态
kubectl get ns          #获取所有namespace资源
kubectl get pods -n {$nameSpace}              #获取指定namespace的pod
kubectl describe pod的名称   -n {$nameSpace}     #查看某个pod的执行过程
kubectl logs --tail=1000 pod的名称 | less    #查看日志<br>kubectl create -f xxx.yml     



 

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。 &nbsp; &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
1月前
|
Kubernetes Devops 应用服务中间件
基于 Azure DevOps 与阿里云 ACK 构建企业级 CI/CD 流水线
本文介绍如何结合阿里云 ACK 与 Azure DevOps 搭建自动化部署流程,涵盖集群创建、流水线配置、应用部署与公网暴露,助力企业高效落地云原生 DevOps 实践。
196 1
|
6月前
|
jenkins Java Linux
Jenkins环境的部署及任务构建
以上就是Jenkins环境的部署及任务构建的全部内容。希望可以帮助你轻松上手Jenkins,让你的CI/CD之旅更加顺畅!
435 68
|
5月前
|
jenkins 持续交付 开发工具
利用Dockerfile自主构建Jenkins镜像
希望这个过程能善用你的野马般想象,把自己置身于和计算机的卓尔不凡的对话中,让编程的过程充满趣味。
187 36
|
4月前
|
Ubuntu jenkins 机器人
在Jenkins上配置触发Ubuntu环境的图形用户界面(GUI)构建任务。
以上,这趟融合了技术与艺术的Jenkins配置之旅就告一段落了。记住,技术应当像艺术一样有趣和生动,这样才能激发出最大的创新和效率。
126 2
|
7月前
|
存储 Kubernetes 监控
K8s集群实战:使用kubeadm和kuboard部署Kubernetes集群
总之,使用kubeadm和kuboard部署K8s集群就像回归童年一样,简单又有趣。不要忘记,技术是为人服务的,用K8s集群操控云端资源,我们不过是想在复杂的世界找寻简单。尽管部署过程可能遇到困难,但朝着简化复杂的目标,我们就能找到意义和乐趣。希望你也能利用这些工具,找到你的乐趣,满足你的需求。
685 33
|
8月前
|
监控 jenkins Shell
jenkins结合gitlab实现CI(持续集成)
通过本文的介绍,我们详细了解了如何结合Jenkins和GitLab实现持续集成。从环境准备、插件配置到Pipeline任务创建和CI流程监控,每一步都提供了详细的操作步骤和示例代码。希望本文能帮助开发者快速搭建起高效的CI系统,提高项目开发效率和代码质量。
687 8
|
7月前
|
存储 运维 Kubernetes
容器数据保护:基于容器服务 Kubernetes 版(ACK)备份中心实现K8s存储卷一键备份与恢复
阿里云ACK备份中心提供一站式容器化业务灾备及迁移方案,减少数据丢失风险,确保业务稳定运行。
|
9月前
|
Java jenkins 持续交付
Jenkins集成Maven
通过以上步骤,可以在Jenkins中成功集成Maven,实现自动化构建和部署。通过定时构建、SCM轮询等方式,可以确保代码库中的最新变更能够及时构建和测试,提高开发效率和代码质量。这种集成方式在实际项目中具有广泛的应用前景,能够显著提升团队的协作效率。
239 8
|
10月前
|
存储 Kubernetes Docker
Kubernetes(k8s)和Docker Compose本质区别
理解它们的区别和各自的优势,有助于选择合适的工具来满足特定的项目需求。
1089 19
|
10月前
|
Kubernetes 应用服务中间件 nginx
二进制安装Kubernetes(k8s)v1.32.0
本指南提供了一个详细的步骤,用于在Linux系统上通过二进制文件安装Kubernetes(k8s)v1.32.0,支持IPv4+IPv6双栈。具体步骤包括环境准备、系统配置、组件安装和配置等。
3158 11

热门文章

最新文章

推荐镜像

更多