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


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

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持续集成架构图

大致工作流程:手动/自动构建 -> 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的架构

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
20.0.0.10 k8s-master 
20.0.0.70 k8s-node1
20.0.0.80 k8s-node2

关闭防火墙和关闭SELinux

systemctl stop ?rewalld systemctl disable ?rewalld
setenforce 0 临时关闭
vi /etc/syscon?g/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 <



chmod 755 /etc/sysconfig/modules/ipvs.modules && bash 
/etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4

所有节点关闭

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

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

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

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

清空yum缓存

yum clean all

设置Yum安装源

cat < /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 
sudo chown $(id -u):$(id -g) $HOME/.kube/config

4)然后就是安装Calico:

mkdir k8s
cd k8s

不检查凭证下载calico.yaml

wget --no-check-certificate https://docs.projectcalico.org/v3.10/getting-started/kubernetes/installation/hosted/kubernetes-datastore/calico-networking/1.7/calico.yaml

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

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

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	  #查看日志
kubectl create -f xxx.yml #通过配置文件创建一个集群资源对象
kubectl delete -f xxx.yml #通过配置文件删除一个集群资源对象