基於Kubernetes/K8S構建Jenkins持續集成平台(上)-2
基於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=//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 #通過配置文件刪除一個集群資源對象