基於Kubernetes/K8S構建Jenkins持續整合平臺(上)-2
Kubernetes實現Master-Slave分散式構建方案
傳統Jenkins的Master-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 Slave,Job 完成後,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
然後:
修改三臺機器的hostname及hosts檔案
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
安裝kubelet、kubeadm、kubectl 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 #通過配置檔案刪除一個叢集資源物件