更新時(shí)間:2020-11-04 來源:黑馬程序員 瀏覽量:
1. 引言
在過去,我們?cè)谶M(jìn)行程序部署的時(shí)候,是直接將環(huán)境和程序統(tǒng)一配置部署到主機(jī)上,但是這樣做容易造成程序與程序之間的混淆,所以為了處理這種問題,我們可以搭建一臺(tái)不可變的虛擬機(jī)鏡像,將環(huán)境和程序配置部署到虛擬機(jī)鏡像中,但是虛擬機(jī)鏡像部署存在體量過于龐大并且不可移動(dòng)的問題,所以容器技術(shù)應(yīng)運(yùn)而生,容器技術(shù)是基于操作系統(tǒng)級(jí)別的虛擬化技術(shù),各個(gè)容器與宿主機(jī)是隔離的,各個(gè)容器之間也是是隔離的,它比虛擬機(jī)鏡像更容易搭建,并且可以很方便在不同的主機(jī)上移動(dòng)。但是隨著分布式、集群等技術(shù)在實(shí)際應(yīng)用中越來越多,在實(shí)際的生產(chǎn)環(huán)境中,我們可能會(huì)涉及到多個(gè)容器,而這些容器可能會(huì)跨越多個(gè)服務(wù)器主機(jī)進(jìn)行部署,所以一個(gè)基于容器技術(shù)的分布式架構(gòu)解決方案應(yīng)用而生,它就是Kubernetes。
2. Kubernetes的概念
Kubernetes(k8s)是一個(gè)基于容器技術(shù)的的分布式架構(gòu)解決方案,是Google開源的容器集群管理系統(tǒng),Google內(nèi)部稱為Borg,主要用于自動(dòng)部署、擴(kuò)展和管理容器化的應(yīng)用程序,是以Docer為基礎(chǔ)的分布式系統(tǒng)架構(gòu)。 Kubernetes可以對(duì)分布式系統(tǒng)進(jìn)行完美的支撐,它具備完善的集群控制能力,內(nèi)建有智能的負(fù)載均衡器,擁有強(qiáng)大的故障發(fā)現(xiàn)和自我修復(fù)能力。同時(shí)還針對(duì)開發(fā)、部署測(cè)試、運(yùn)維監(jiān)控等提供了完善的管理工具。
Kubernetes的核心思想是:一切以服務(wù)為中心,根據(jù)這一核心思想,Kubernetes可以讓在其上構(gòu)建的系統(tǒng)獨(dú)立運(yùn)行在物理機(jī)、虛擬機(jī)群或者云上,所以,Service(服務(wù))是Kubernetes進(jìn)行分布式集群構(gòu)建的核心,必須擁有如下關(guān)鍵特征:
擁有一個(gè)唯一指定的名稱。 擁有一個(gè)虛擬IP和端口。
能夠提供某種遠(yuǎn)程服務(wù)能力。
可以被映射到提供這種遠(yuǎn)程服務(wù)能力的一組容器應(yīng)用上。
3. Kubernetes的術(shù)語
3.1 Master
Kubernetes的集群控制節(jié)點(diǎn),負(fù)責(zé)整個(gè)集群的管理和控制,擁有一個(gè)etcd服務(wù),用來保存所有資源對(duì)象的數(shù)據(jù),我們執(zhí)行的所有控制命令會(huì)發(fā)給他,他負(fù)責(zé)具體的執(zhí)行過程,Master節(jié)點(diǎn)通常會(huì)獨(dú)占一個(gè)服務(wù)器,在其上會(huì)運(yùn)行以上一組關(guān)鍵的進(jìn)程:
Kubernetes API Server:提供Http Rest接口的關(guān)鍵服務(wù)進(jìn)程,是Kubernetes中增、刪、改、查等操作的唯一入口,是集群控制的入口進(jìn)程。
Kubernetes Controller Manager:Kubernetes中所有資源對(duì)象的自動(dòng)化控制中心。
Kubernetes Scheduler:負(fù)責(zé)資源調(diào)度的進(jìn)程。
3.2 Node
Kubernetes集群中的其他機(jī)器被稱為Node節(jié)點(diǎn),Node節(jié)點(diǎn)可以是一臺(tái)物理主機(jī),也可以是一臺(tái)虛擬機(jī),每個(gè)Node節(jié)點(diǎn)會(huì)被Master節(jié)點(diǎn)分配一些負(fù)載,所以Node節(jié)點(diǎn)是Kubernetes集群中工作負(fù)載節(jié)點(diǎn),當(dāng)某個(gè)Node節(jié)點(diǎn)宕機(jī)時(shí),工作負(fù)載會(huì)被Master自動(dòng)轉(zhuǎn)移到其他節(jié)點(diǎn)。Node節(jié)點(diǎn)之上會(huì)運(yùn)行一組關(guān)鍵進(jìn)程:
kubelet:負(fù)責(zé)Pod對(duì)應(yīng)容器的創(chuàng)建,啟動(dòng)、停止等任務(wù)。
kube-proxy:實(shí)現(xiàn)Kubernetes Service通訊與負(fù)載均衡機(jī)制的重要組件。
Docker Engine:Docker引擎,負(fù)責(zé)容器的創(chuàng)建和管理
3.3 Pod
Pod是Kurbernetes進(jìn)行創(chuàng)建、調(diào)度和管理的最小單位,Pod運(yùn)行在Node節(jié)點(diǎn)之上,其中包含多個(gè)業(yè)務(wù)容器,這些業(yè)務(wù)容器之間共享網(wǎng)絡(luò)命名空間、Ip地址、端口,可以通過localhost進(jìn)行通訊。Pod有兩種類型:普通Pod和靜態(tài)Pod。
3.4 Replication Controller
Kurbernetes用來管理和保證集群中擁有的Pod。
4. Kubernetes的架構(gòu)
Kubernetes的一切都是基于分布式的,下面這張圖就是Kubernetes的架構(gòu)圖
通過這張架構(gòu)圖我們發(fā)現(xiàn)Kurbernetes主要由以下幾個(gè)核心組件組成:
·Etcd:保存整個(gè)集群的狀態(tài)。
·API Server:提供認(rèn)證、授權(quán)、訪問控制、API注冊(cè)和發(fā)現(xiàn)等機(jī)制,是資源操作的唯一入口。
·Kurbernetes Controller:負(fù)責(zé)維護(hù)集群的狀態(tài)。
·Scheduler:負(fù)責(zé)資源的調(diào)度。
·kubelet:負(fù)責(zé)維護(hù)容器的生命周期,同時(shí)管理Volume和網(wǎng)絡(luò)。
·Container:負(fù)責(zé)鏡像管理以及Pod和容器的真正運(yùn)行。
·kube-proxy:負(fù)責(zé)為Service提供cluster內(nèi)部的服務(wù)發(fā)現(xiàn)和負(fù)載均衡。
5. Kubernetes的搭建
5.1 準(zhǔn)備工作
因?yàn)镵ubernetes的一切都是基于分布式的,那么,要想搭建Kubernetes就需要準(zhǔn)備多臺(tái)服務(wù)器主機(jī),因?yàn)闂l件有限,這里我采用搭建多臺(tái)虛擬機(jī)系統(tǒng)的方式進(jìn)行,所以需要將虛擬機(jī)和鏡像系統(tǒng)準(zhǔn)備好。
虛擬機(jī):這里的虛擬機(jī)我采用的是VMware,當(dāng)然也可以采用VirtualBox,VMware下載地址如下:
https://www.vmware.com/cn.html
鏡像系統(tǒng):虛擬機(jī)的鏡像系統(tǒng)我采用的是:CentOS-7-x86_64-DVD-1810,下載地址如下:
http://mirrors.zju.edu.cn/centos/7.6.1810/isos/x86_64/CentOS-7-x86_64-DVD-1810.iso
5.2 虛擬機(jī)環(huán)境搭建
我們準(zhǔn)備安裝三個(gè)虛擬機(jī)節(jié)點(diǎn),一個(gè)為Kubernetes的Master節(jié)點(diǎn),剩下兩個(gè)為Kubernetes的Node節(jié)點(diǎn),這里我們只演示第一個(gè)安裝第一個(gè)節(jié)點(diǎn),剩下的兩個(gè)節(jié)點(diǎn),采用VMware復(fù)制鏡像的方式進(jìn)行。
5.2.1 虛擬機(jī)環(huán)境要求
搭建Kubernetes,虛擬機(jī)環(huán)境至少要滿足以下要求:
·操作系統(tǒng) CentOS 7
·內(nèi)存 2G 【至少】
·CPU 2核【至少】
·硬盤 20G 【至少】
5.2.2 創(chuàng)建虛擬機(jī)
打開VMware,選擇“文件”菜單“新建虛擬機(jī)”選項(xiàng),或者直接點(diǎn)擊界面上的“創(chuàng)建新的虛擬機(jī)”選項(xiàng),創(chuàng)建新的虛擬機(jī),如下圖所示:
在彈出的彈窗中選擇“經(jīng)典”選項(xiàng),點(diǎn)擊“下一步”按鈕,如下圖所示:
在彈出的新的彈窗中選擇“稍后安裝操作系統(tǒng)”選項(xiàng),點(diǎn)擊“下一步”按鈕,如下圖所示:
在彈出的新的彈窗中選擇客戶機(jī)操作系統(tǒng)為“Linux”,版本為“CentOS 64位”,點(diǎn)擊“下一步”按鈕,如下圖所示:
在彈出的新的彈窗中設(shè)置虛擬機(jī)名稱為“K8S_Node1”,選擇虛擬機(jī)系統(tǒng)的安裝位置,點(diǎn)擊“下一步”按鈕,如下圖所示:
在彈出的新的彈窗中設(shè)置最大磁盤大小為20G,選擇“將虛擬磁盤存儲(chǔ)為單個(gè)文件”,點(diǎn)擊“下一步”按鈕,如下圖所示:
在彈出的新的彈窗中選擇“自定義硬件”選項(xiàng)
在彈出的硬件配置彈窗中,內(nèi)存設(shè)置為2048M,如下圖所示:
處理器設(shè)置為2個(gè),如下圖所示:
鏡像文件選擇本地下載好的鏡像文件,如下圖所示:
設(shè)置完內(nèi)存、處理、鏡像文件之后,點(diǎn)擊“關(guān)閉”按鈕,回到新建虛擬機(jī)向?qū)ы撁?,點(diǎn)擊“完成”按鈕,完成新建虛擬機(jī)。
5.2.3 安裝操作系統(tǒng)
在新建好虛擬機(jī)之后,在VMware主界面,選擇對(duì)應(yīng)的虛擬機(jī),點(diǎn)擊“開啟此虛擬機(jī)”選項(xiàng),啟動(dòng)虛擬機(jī),如下圖所示:
在打開的系統(tǒng)界面中選擇“Install CentOS 7”,進(jìn)行CentOS 7系統(tǒng)的安裝,如下圖所示:
在打開的界面中選擇中文語言環(huán)境,點(diǎn)擊“繼續(xù)”按鈕,繼續(xù)進(jìn)行安裝,如下圖所示:
在打開的界面中進(jìn)行安裝配置,如下圖所示:
注意:"軟件選擇”建議選擇最后一個(gè)“開發(fā)及生產(chǎn)工作站”,“安裝位置”選擇默認(rèn)“自動(dòng)分區(qū)”,禁用Kdump,打開網(wǎng)絡(luò),讓你的虛擬機(jī)可以連接到互聯(lián)網(wǎng)。
在新打開的頁面中設(shè)置Root密碼,進(jìn)行安裝CentOS 7系統(tǒng)
安裝完成后,會(huì)進(jìn)入到系統(tǒng)的基本配置操作頁面,可以進(jìn)行語言環(huán)境的配置,如下圖所示:
系統(tǒng)鍵盤布局和輸入方式選擇配置,如下圖所示:
最后點(diǎn)擊“開始使用CentOS Linux(s)”按鈕,開始進(jìn)入到CentOS 7系統(tǒng)中,如下圖所示:
進(jìn)入系統(tǒng)之后,使用“ifconfig”指令查看系統(tǒng)的ip地址,發(fā)現(xiàn)沒有ip地址,如下圖所示:
沒有ip地址的原因,查看之前2.2.8的配置步驟,發(fā)現(xiàn)已經(jīng)配置了網(wǎng)絡(luò)適配器為NAT,那沒有ip地址的原因可能就是系統(tǒng)在啟動(dòng)的時(shí)候沒有加載網(wǎng)卡造成的,所以使用“vi”指令打開“/etc/sysconfig/network-scripts/ifcfg-ens33”文件,將其中的“ONBOOT=no”改為“ONBOOT=yes”,使用“wq”指令保存文件,如下圖所示:
修改文件之后,需要通過“service network restart”重啟網(wǎng)絡(luò)服務(wù),之后在使用“ifconfig”指令查看,就會(huì)發(fā)現(xiàn)ip地址就有了,如下圖所示:
5.2.4 遠(yuǎn)程操作操作系統(tǒng)
因?yàn)樵诓僮飨到y(tǒng)的終端中直接操作指令不太方便,比較好的方法是使用第三方的終端模擬軟件,比如Xshell、SecureCRT登錄,我這里使用的是SecureCRT進(jìn)行操作。打開SecureCRT軟件,配置一個(gè)連接,連接CentOS 7操作系統(tǒng),如下圖所示:
在遠(yuǎn)程連接成功之后,我們還需要配置CentOS 7的yum源,因?yàn)槭褂肅entOS 7自帶的yum源,在安裝軟件和下載依賴的時(shí)候會(huì)非常的慢,甚至有時(shí)候還會(huì)超時(shí)失敗,所以這里不建議使用CentOS 7自帶的yum源,我們可以執(zhí)行如下命令,使用阿里云的源替換CentOS 7自帶的yum源,如下圖所示:
考慮到后續(xù)我們需要安裝Kubernetes集群需要各種網(wǎng)絡(luò),所以需要將防火墻關(guān)閉,避免因?yàn)榉阑饓Φ膯栴}導(dǎo)致連網(wǎng)失敗,如下圖所示:
在安裝Kubernetes集群的時(shí)候,為了避免因?yàn)閮?nèi)存交互而影響性能以及穩(wěn)定性,所以這里我們需要關(guān)閉Swap內(nèi)存交互機(jī)制。使用“vi”指令打開“/etc/fstab”文件,將其中的swap配置注釋掉,如下圖所示:
5.2.5 安裝Docker
Kubernetes是以Docker為基礎(chǔ)的一個(gè)全新的分布式系統(tǒng)架構(gòu),安裝Kubernetes必須要先安裝Docker,可以參考Docker官方文檔進(jìn)行操作:https://docs.docker.com/install/linux/docker-ce/centos/#prerequisites
因?yàn)槭褂脃um安裝Docker的時(shí)候經(jīng)常會(huì)超時(shí)失敗,所以可以添加阿里云的Docker倉庫,如下圖所示:
使用yum安裝Docker最新版本,如下圖所示:
執(zhí)行如下命令啟動(dòng)Docker并激活開機(jī)自動(dòng)啟動(dòng),如下圖所示:
5.3 Kubernetes集群搭建
虛擬機(jī)環(huán)境我們?cè)谏线呉呀?jīng)搭建好了,接下來我們就該搭建Kubernetes集群,我們將現(xiàn)在的虛擬機(jī)作為主節(jié)點(diǎn),先安裝Kubernetes,之后再復(fù)制出兩個(gè)虛擬機(jī)作為工作節(jié)點(diǎn)。
5.3.1 安裝Kubernetes
我們可以參考Kubernetes官方文檔進(jìn)行安裝Kubernetes,下面是官方文檔網(wǎng)址:https://kubernetes.io/docs/setup/independent/create-cluster-kubeadm/, 官方倉庫因?yàn)楸粔Φ脑蛭覀儫o法使用,所以還是使用阿里云的倉庫,執(zhí)行以下命令添加kubernetes倉庫:
Linux會(huì)對(duì)我們的訪問進(jìn)行控制,所以需要關(guān)閉,如下圖所示:
5.3.2 安裝kubelet、kubeadm、kubectl
執(zhí)行以下的指令安裝Kubernetes的kubelet、kubeadm、kubectl,如下圖所示:
執(zhí)行以下的指令配置kubelet的cgroup drive,要和docker的cgroup drive保持一致,如下圖所示:
執(zhí)行以下指令,啟動(dòng)kubelet
但是啟動(dòng)kubelet會(huì)失敗,因?yàn)槿鄙僮C書,但是不用擔(dān)心,之后我們?cè)趫?zhí)行kubeadm init命令的時(shí)候會(huì)創(chuàng)建證書,這里不啟動(dòng)也不影響后續(xù)的配置。
5.3.3 下載Kubernetes的Docker鏡像
接下來我們需要使用Kubernetes官方提供的kubeadm工具來初始化Kubernetes集群,但是kubeadm init默認(rèn)會(huì)訪問谷歌服務(wù)器,使用的Docker鏡像倉庫是k8s.gcr.io,國內(nèi)是無法訪問的,我們可以使用docker.io/mirrorgooglecontainers中轉(zhuǎn)一下,所以需要執(zhí)行以下命令,如下圖所示:
但是coredns沒包含在docker.io/mirrorgooglecontainers中,所以需要手工到coredns官方鏡像轉(zhuǎn)換下,執(zhí)行以下命令進(jìn)行操作,如下圖所示:
最后通過“docker images”查看所有的鏡像,會(huì)發(fā)現(xiàn)所有鏡像都已經(jīng)下載完成,如下圖所示:
5.4 復(fù)制虛擬機(jī)
上面執(zhí)行完成,Kubernetes就已經(jīng)安裝完畢了,接下來就需要復(fù)制虛擬機(jī)將其他節(jié)點(diǎn)創(chuàng)建出來。
5.4.1 復(fù)制虛擬機(jī)
關(guān)閉之前的虛擬機(jī),在VMware的界面中,右鍵點(diǎn)擊第一個(gè)節(jié)點(diǎn),我這里叫做K8S_Node1,選擇“管理”選項(xiàng)中的“克隆”選項(xiàng),開始復(fù)制虛擬機(jī),如下圖所示:
進(jìn)入到選擇克隆源的選擇,選擇“虛擬機(jī)中的當(dāng)前狀態(tài)”選項(xiàng),然后點(diǎn)擊“下一步”按鈕,如下圖所示:
在彈出的選擇克隆類型的窗口中選擇“創(chuàng)建完整克隆”選項(xiàng),點(diǎn)擊“下一步”按鈕,如下圖所示:
在彈出的設(shè)置新的虛擬機(jī)名稱的窗口中設(shè)置新的虛擬機(jī)的名稱為K8S_Node2,并設(shè)置保存位置,然后點(diǎn)擊“完成”按鈕,進(jìn)行復(fù)制操作,如下圖所示:
重復(fù)上面的步驟復(fù)制出名稱為K8S_Node3的虛擬機(jī)。
5.4.2 設(shè)置虛擬機(jī)網(wǎng)絡(luò)
復(fù)制虛擬機(jī)結(jié)束之后,我們會(huì)發(fā)現(xiàn)三個(gè)節(jié)點(diǎn)ip為:
K8S_Node1:192.168.149.129
K8S_Node2:192.168.149.130
K8S_Node3:192.168.149.131
但是我們還需要進(jìn)行一些配置,以便后續(xù)操作可以配置連接,這里以K8S_Node1為例:
使用“vi”指令編輯“/etc/hostname”文件,將hostname改為k8s-node1,注意這里不能大寫,不能使用“_”,不然后續(xù)的Kubernetes配置會(huì)出問題,如下圖所示:
使用“vi”指令編輯“/etc/hosts”文件,在其最后添加192.168.149.129 k8s-node1,如下圖所示:
配置完畢之后,重啟生效,剩下的兩個(gè)節(jié)點(diǎn)也是如此的配置,這里不再演示。
5.5 創(chuàng)建Kubernetes集群
前面的準(zhǔn)備工作都已經(jīng)準(zhǔn)備好了,接下來我們就可以開始創(chuàng)建Kubernetes集群了,這里我們使用之前安裝的kubeadm來快速、方便的創(chuàng)建一個(gè)Kubernetes集群。
5.5.1 初始化Kubernetes集群
在主節(jié)點(diǎn)(K8S_Node1)上執(zhí)行以下的命令,如下圖所示:
當(dāng)看到如下信息時(shí),就表示Kubernetes集群初始化成功了,如下圖所示:
我們需要將初始化成功的提示信息中的kubeadm join記錄下來(之后會(huì)使用到),同時(shí)需要執(zhí)行提示信息中關(guān)于以下的幾個(gè)指令,如下圖所示:
5.5.2 創(chuàng)建網(wǎng)絡(luò)
當(dāng)初始化好Kubernetes集群之后,我們還需要配置網(wǎng)絡(luò),以便實(shí)現(xiàn)各個(gè)節(jié)點(diǎn)之間的通訊,設(shè)置網(wǎng)絡(luò)可以使用Calico或者是flannel,這里我們采用flannel來設(shè)置網(wǎng)絡(luò),如下圖所示:
5.6 配置Kubernetes集群
當(dāng)Kubernetes集群初始化成功并設(shè)置好網(wǎng)絡(luò)之后,我們就需要將Pod調(diào)度到Master上,因?yàn)镵ubernetes默認(rèn)是不會(huì)將Pod調(diào)度到Master中,所以我們需要手動(dòng)設(shè)置。
5.6.1 將Master作為工作節(jié)點(diǎn)
可以執(zhí)行以下命令,將Master節(jié)點(diǎn)作為工作節(jié)點(diǎn),如下圖所示:
5.6.2 將其他節(jié)點(diǎn)添加到集群
在K8S_Node2和K8S_Node3的節(jié)點(diǎn)上執(zhí)行K8S_Node1節(jié)點(diǎn)進(jìn)行kubeadm init初始化集群成功之后提示的kubeadm join指令,將K8S_Node2和K8S_Node3添加到集群中,如下圖所示:
如果kubeadm join指令失敗了,可以執(zhí)行kubeadm reset進(jìn)行重置,然后再次執(zhí)行kubeadm join。
最后我們通過“kubectl get nodes”查看節(jié)點(diǎn)是否添加到集群中,如下圖所示:
到此,Kubernetes集群就搭建完畢了。
6. 總結(jié)
通過上述的案例,我們就可以把Kubernetes集群搭建完成,之后我們可以在此基礎(chǔ)上繼續(xù)搭建Kubernetes的Dashboard,也可以在Kubernetes部署nginx、redis等軟件??傊?,通過Kubernetes我們可以很方便的進(jìn)行分布式、集群操作,很方便的實(shí)現(xiàn)在物理機(jī)、虛擬機(jī)或者是云上進(jìn)行項(xiàng)目的部署和遷移。
猜你喜歡: