基於Kubernetes/K8S構建Jenkins持續整合平臺(上)-2

隱姓埋名4869發表於2022-03-07

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

  

 

所有節點關閉

swapoff -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 <<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 
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 #通過配置檔案刪除一個叢集資源物件

  

 

相關文章