基於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 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=//mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=//mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg //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 //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 #通過配置文件刪除一個集群資源對象

  

 

Tags: