基于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     



 

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
19天前
|
人工智能 安全 机器人
LangBot:无缝集成到QQ、微信等消息平台的AI聊天机器人平台
LangBot 是一个开源的多模态即时聊天机器人平台,支持多种即时通信平台和大语言模型,具备多模态交互、插件扩展和Web管理面板等功能。
473 14
LangBot:无缝集成到QQ、微信等消息平台的AI聊天机器人平台
|
19天前
|
存储 人工智能 NoSQL
Airweave:快速集成应用数据打造AI知识库的开源平台,支持多源整合和自动同步数据
Airweave 是一个开源工具,能够将应用程序的数据同步到图数据库和向量数据库中,实现智能代理检索。它支持无代码集成、多租户支持和自动同步等功能。
89 14
|
2月前
|
NoSQL 大数据 关系型数据库
AllData数据中台核心菜单十一:数据集成平台
杭州奥零数据科技有限公司成立于2023年,专注于数据中台业务,维护开源项目AllData并提供商业版解决方案。AllData提供数据集成、存储、开发、治理及BI展示等一站式服务,支持AI大模型应用,助力企业高效利用数据价值。
AllData数据中台核心菜单十一:数据集成平台
|
3月前
|
人工智能 数据可视化 JavaScript
NodeTool:AI 工作流可视化构建器,通过拖放节点设计复杂的工作流,集成 OpenAI 等多个平台
NodeTool 是一个开源的 AI 工作流可视化构建器,通过拖放节点的方式设计复杂的工作流,无需编码即可快速原型设计和测试。它支持本地 GPU 运行 AI 模型,并与 Hugging Face、OpenAI 等平台集成,提供模型访问能力。
176 14
NodeTool:AI 工作流可视化构建器,通过拖放节点设计复杂的工作流,集成 OpenAI 等多个平台
|
2月前
|
运维 监控 Cloud Native
构建深度可观测、可集成的网络智能运维平台
本文介绍了构建深度可观测、可集成的网络智能运维平台(简称NIS),旨在解决云上网络运维面临的复杂挑战。内容涵盖云网络运维的三大难题、打造云原生AIOps工具集的解决思路、可观测性对业务稳定的重要性,以及产品发布的亮点,包括流量分析NPM、网络架构巡检和自动化运维OpenAPI,助力客户实现自助运维与优化。
|
3月前
|
运维 jenkins Java
Jenkins 自动化局域网管控软件构建与部署流程
在企业局域网管理中,Jenkins 作为自动化工具,通过配置源码管理、构建及部署步骤,实现了高效、稳定的软件开发与部署流程,显著提升局域网管控软件的开发与运维效率。
74 5
|
5月前
|
运维 监控 jenkins
运维自动化实战:利用Jenkins构建高效CI/CD流程
【10月更文挑战第18天】运维自动化实战:利用Jenkins构建高效CI/CD流程
|
5月前
|
数据采集 DataWorks 数据管理
DataWorks不是Excel,它是一个数据集成和数据管理平台
【10月更文挑战第10天】随着大数据技术的发展,企业对数据处理的需求日益增长。阿里云推出的DataWorks是一款强大的数据集成和管理平台,提供从数据采集、清洗、加工到应用的一站式解决方案。本文通过电商平台案例,详细介绍了DataWorks的核心功能和优势,展示了如何高效处理大规模数据,帮助企业挖掘数据价值。
198 1
|
5月前
|
数据采集 SQL DataWorks
DataWorks不是Excel,它是一个数据集成和数据管理平台
【10月更文挑战第5天】本文通过一家电商平台的案例,详细介绍了阿里云DataWorks在数据处理全流程中的应用。从多源数据采集、清洗加工到分析可视化,DataWorks提供了强大的一站式解决方案,显著提升了数据分析效率和质量。通过具体SQL示例,展示了如何构建高效的数据处理流程,突显了DataWorks相较于传统工具如Excel的优势,为企业决策提供了有力支持。
175 3
|
5月前
|
人工智能 自然语言处理 关系型数据库
阿里云云原生数据仓库 AnalyticDB PostgreSQL 版已完成和开源LLMOps平台Dify官方集成
近日,阿里云云原生数据仓库 AnalyticDB PostgreSQL 版已完成和开源LLMOps平台Dify官方集成。

热门文章

最新文章