教育行業(yè)A股IPO第一股(股票代碼 003032)

全國咨詢/投訴熱線:400-618-4000

Kubernetes核心原理和搭建

更新時間:2020年11月02日15時08分 來源:傳智播客 瀏覽次數(shù):

1. 引言

在過去,我們在進(jìn)行程序部署的時候,是直接將環(huán)境和程序統(tǒng)一配置部署到主機(jī)上,但是這樣做容易造成程序與程序之間的混淆,所以為了處理這種問題,我們可以搭建一臺不可變的虛擬機(jī)鏡像,將環(huán)境和程序配置部署到虛擬機(jī)鏡像中,但是虛擬機(jī)鏡像部署存在體量過于龐大并且不可移動的問題,所以容器技術(shù)應(yīng)運(yùn)而生,容器技術(shù)是基于操作系統(tǒng)級別的虛擬化技術(shù),各個容器與宿主機(jī)是隔離的,各個容器之間也是是隔離的,它比虛擬機(jī)鏡像更容易搭建,并且可以很方便在不同的主機(jī)上移動。但是隨著分布式、集群等技術(shù)在實(shí)際應(yīng)用中越來越多,在實(shí)際的生產(chǎn)環(huán)境中,我們可能會涉及到多個容器,而這些容器可能會跨越多個服務(wù)器主機(jī)進(jìn)行部署,所以一個基于容器技術(shù)的分布式架構(gòu)解決方案應(yīng)用而生,它就是Kubernetes。

2. Kubernetes的概念

Kubernetes(k8s)是一個基于容器技術(shù)的的分布式架構(gòu)解決方案,是Google開源的容器集群管理系統(tǒng),Google內(nèi)部稱為Borg,主要用于自動部署、擴(kuò)展和管理容器化的應(yīng)用程序,是以Docer為基礎(chǔ)的分布式系統(tǒng)架構(gòu)。 Kubernetes可以對分布式系統(tǒng)進(jìn)行完美的支撐,它具備完善的集群控制能力,內(nèi)建有智能的負(fù)載均衡器,擁有強(qiáng)大的故障發(fā)現(xiàn)和自我修復(fù)能力。同時還針對開發(fā)、部署測試、運(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)鍵特征:

擁有一個唯一指定的名稱。 擁有一個虛擬IP和端口。

能夠提供某種遠(yuǎn)程服務(wù)能力。

可以被映射到提供這種遠(yuǎn)程服務(wù)能力的一組容器應(yīng)用上。


3. Kubernetes的術(shù)語

3.1 Master

Kubernetes的集群控制節(jié)點(diǎn),負(fù)責(zé)整個集群的管理和控制,擁有一個etcd服務(wù),用來保存所有資源對象的數(shù)據(jù),我們執(zhí)行的所有控制命令會發(fā)給他,他負(fù)責(zé)具體的執(zhí)行過程,Master節(jié)點(diǎn)通常會獨(dú)占一個服務(wù)器,在其上會運(yùn)行以上一組關(guān)鍵的進(jìn)程:

Kubernetes API Server:提供Http Rest接口的關(guān)鍵服務(wù)進(jìn)程,是Kubernetes中增、刪、改、查等操作的唯一入口,是集群控制的入口進(jìn)程。

Kubernetes Controller Manager:Kubernetes中所有資源對象的自動化控制中心。

Kubernetes Scheduler:負(fù)責(zé)資源調(diào)度的進(jìn)程。

3.2 Node

Kubernetes集群中的其他機(jī)器被稱為Node節(jié)點(diǎn),Node節(jié)點(diǎn)可以是一臺物理主機(jī),也可以是一臺虛擬機(jī),每個Node節(jié)點(diǎn)會被Master節(jié)點(diǎn)分配一些負(fù)載,所以Node節(jié)點(diǎn)是Kubernetes集群中工作負(fù)載節(jié)點(diǎn),當(dāng)某個Node節(jié)點(diǎn)宕機(jī)時,工作負(fù)載會被Master自動轉(zhuǎn)移到其他節(jié)點(diǎn)。Node節(jié)點(diǎn)之上會運(yùn)行一組關(guān)鍵進(jìn)程:

kubelet:負(fù)責(zé)Pod對應(yīng)容器的創(chuà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)之上,其中包含多個業(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)圖

Kubernetes的架構(gòu)

通過這張架構(gòu)圖我們發(fā)現(xiàn)Kurbernetes主要由以下幾個核心組件組成:

·Etcd:保存整個集群的狀態(tài)。

·API Server:提供認(rèn)證、授權(quán)、訪問控制、API注冊和發(fā)現(xiàn)等機(jī)制,是資源操作的唯一入口。

·Kurbernetes Controller:負(fù)責(zé)維護(hù)集群的狀態(tài)。

·Scheduler:負(fù)責(zé)資源的調(diào)度。

·kubelet:負(fù)責(zé)維護(hù)容器的生命周期,同時管理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)備多臺服務(wù)器主機(jī),因?yàn)闂l件有限,這里我采用搭建多臺虛擬機(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)備安裝三個虛擬機(jī)節(jié)點(diǎn),一個為Kubernetes的Master節(jié)點(diǎn),剩下兩個為Kubernetes的Node節(jié)點(diǎn),這里我們只演示第一個安裝第一個節(jié)點(diǎn),剩下的兩個節(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ī),如下圖所示:

打開VMware


在彈出的彈窗中選擇“經(jīng)典”選項(xiàng),點(diǎn)擊“下一步”按鈕,如下圖所示:

新建虛擬機(jī)

在彈出的新的彈窗中選擇“稍后安裝操作系統(tǒng)”選項(xiàng),點(diǎn)擊“下一步”按鈕,如下圖所示:

安裝虛擬機(jī)操作系統(tǒng)

在彈出的新的彈窗中選擇客戶機(jī)操作系統(tǒng)為“Linux”,版本為“CentOS 64位”,點(diǎn)擊“下一步”按鈕,如下圖所示:

選擇虛擬機(jī)版本

在彈出的新的彈窗中設(shè)置虛擬機(jī)名稱為“K8S_Node1”,選擇虛擬機(jī)系統(tǒng)的安裝位置,點(diǎn)擊“下一步”按鈕,如下圖所示:

設(shè)置虛擬機(jī)名稱

在彈出的新的彈窗中設(shè)置最大磁盤大小為20G,選擇“將虛擬磁盤存儲為單個文件”,點(diǎn)擊“下一步”按鈕,如下圖所示:

設(shè)置硬盤尺寸

在彈出的新的彈窗中選擇“自定義硬件”選項(xiàng)

自定義硬件

在彈出的硬件配置彈窗中,內(nèi)存設(shè)置為2048M,如下圖所示:

設(shè)置虛擬內(nèi)存

處理器設(shè)置為2個,如下圖所示:

設(shè)置處理器

鏡像文件選擇本地下載好的鏡像文件,如下圖所示:

選擇鏡像文件

設(shè)置完內(nèi)存、處理、鏡像文件之后,點(diǎn)擊“關(guān)閉”按鈕,回到新建虛擬機(jī)向?qū)ы撁妫c(diǎn)擊“完成”按鈕,完成新建虛擬機(jī)。

5.2.3 安裝操作系統(tǒng)

在新建好虛擬機(jī)之后,在VMware主界面,選擇對應(yīng)的虛擬機(jī),點(diǎn)擊“開啟此虛擬機(jī)”選項(xiàng),啟動虛擬機(jī),如下圖所示:

安裝操作系統(tǒng)

在打開的系統(tǒng)界面中選擇“Install CentOS 7”,進(jìn)行CentOS 7系統(tǒng)的安裝,如下圖所示:

進(jìn)行CentOS 7系統(tǒng)

在打開的界面中選擇中文語言環(huán)境,點(diǎn)擊“繼續(xù)”按鈕,繼續(xù)進(jìn)行安裝,如下圖所示:

選擇簡體中文

在打開的界面中進(jìn)行安裝配置,如下圖所示:

禁用Kdump

注意:"軟件選擇”建議選擇最后一個“開發(fā)及生產(chǎn)工作站”,“安裝位置”選擇默認(rèn)“自動分區(qū)”,禁用Kdump,打開網(wǎng)絡(luò),讓你的虛擬機(jī)可以連接到互聯(lián)網(wǎng)。

在新打開的頁面中設(shè)置Root密碼,進(jìn)行安裝CentOS 7系統(tǒng)

設(shè)置Root密碼

安裝完成后,會進(jìn)入到系統(tǒng)的基本配置操作頁面,可以進(jìn)行語言環(huán)境的配置,如下圖所示:

配置語言環(huán)境

系統(tǒng)鍵盤布局和輸入方式選擇配置,如下圖所示:

設(shè)計(jì)鍵盤

最后點(diǎn)擊“開始使用CentOS Linux(s)”按鈕,開始進(jìn)入到CentOS 7系統(tǒng)中,如下圖所示:

進(jìn)入到CentOS 7系統(tǒng)

進(jìn)入系統(tǒng)之后,使用“ifconfig”指令查看系統(tǒng)的ip地址,發(fā)現(xiàn)沒有ip地址,如下圖所示:

查看系統(tǒng)的ip地址

沒有ip地址的原因,查看之前2.2.8的配置步驟,發(fā)現(xiàn)已經(jīng)配置了網(wǎng)絡(luò)適配器為NAT,那沒有ip地址的原因可能就是系統(tǒng)在啟動的時候沒有加載網(wǎng)卡造成的,所以使用“vi”指令打開“/etc/sysconfig/network-scripts/ifcfg-ens33”文件,將其中的“ONBOOT=no”改為“ONBOOT=yes”,使用“wq”指令保存文件,如下圖所示:

“ data-cke-saved-ONBOOT=no”改為“ONBOOT=yes” ONBOOT=no”改為“ONBOOT=yes”

修改文件之后,需要通過“service network restart”重啟網(wǎng)絡(luò)服務(wù),之后在使用“ifconfig”指令查看,就會發(fā)現(xiàn)ip地址就有了,如下圖所示:

重啟網(wǎng)絡(luò)服務(wù)


5.2.4 遠(yuǎn)程操作操作系統(tǒng)

因?yàn)樵诓僮飨到y(tǒng)的終端中直接操作指令不太方便,比較好的方法是使用第三方的終端模擬軟件,比如Xshell、SecureCRT登錄,我這里使用的是SecureCRT進(jìn)行操作。打開SecureCRT軟件,配置一個連接,連接CentOS 7操作系統(tǒng),如下圖所示:

連接CentOS 7操作系統(tǒng)

在遠(yuǎn)程連接成功之后,我們還需要配置CentOS 7的yum源,因?yàn)槭褂肅entOS 7自帶的yum源,在安裝軟件和下載依賴的時候會非常的慢,甚至有時候還會超時失敗,所以這里不建議使用CentOS 7自帶的yum源,我們可以執(zhí)行如下命令,使用阿里云的源替換CentOS 7自帶的yum源,如下圖所示:

將防火墻關(guān)閉

考慮到后續(xù)我們需要安裝Kubernetes集群需要各種網(wǎng)絡(luò),所以需要將防火墻關(guān)閉,避免因?yàn)榉阑饓Φ膯栴}導(dǎo)致連網(wǎng)失敗,如下圖所示:

將防火墻關(guān)閉

在安裝Kubernetes集群的時候,為了避免因?yàn)閮?nèi)存交互而影響性能以及穩(wěn)定性,所以這里我們需要關(guān)閉Swap內(nèi)存交互機(jī)制。使用“vi”指令打開“/etc/fstab”文件,將其中的swap配置注釋掉,如下圖所示:

swap配置注釋掉


5.2.5 安裝Docker

Kubernetes是以Docker為基礎(chǔ)的一個全新的分布式系統(tǒng)架構(gòu),安裝Kubernetes必須要先安裝Docker,可以參考Docker官方文檔進(jìn)行操作:https://docs.docker.com/install/linux/docker-ce/centos/#prerequisites

因?yàn)槭褂脃um安裝Docker的時候經(jīng)常會超時失敗,所以可以添加阿里云的Docker倉庫,如下圖所示:

添加阿里云的Docker倉庫

使用yum安裝Docker最新版本,如下圖所示:

安裝Docker最新版本

執(zhí)行如下命令啟動Docker并激活開機(jī)自動啟動,如下圖所示:

Docker并激活開機(jī)自動啟動


5.3 Kubernetes集群搭建

虛擬機(jī)環(huán)境我們在上邊已經(jīng)搭建好了,接下來我們就該搭建Kubernetes集群,我們將現(xiàn)在的虛擬機(jī)作為主節(jié)點(diǎn),先安裝Kubernetes,之后再復(fù)制出兩個虛擬機(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倉庫:

令添加kubernetes倉庫

Linux會對我們的訪問進(jìn)行控制,所以需要關(guān)閉,如下圖所示:

關(guān)閉linux


5.3.2 安裝kubelet、kubeadm、kubectl

執(zhí)行以下的指令安裝Kubernetes的kubelet、kubeadm、kubectl,如下圖所示:

安裝Kubernetes的kubelet、kubeadm、kubectl

執(zhí)行以下的指令配置kubelet的cgroup drive,要和docker的cgroup drive保持一致,如下圖所示:

docker的cgroup drive保持一致

執(zhí)行以下指令,啟動kubelet

啟動kubelet

但是啟動kubelet會失敗,因?yàn)槿鄙僮C書,但是不用擔(dān)心,之后我們在執(zhí)行kubeadm init命令的時候會創(chuàng)建證書,這里不啟動也不影響后續(xù)的配置。

5.3.3 下載Kubernetes的Docker鏡像

接下來我們需要使用Kubernetes官方提供的kubeadm工具來初始化Kubernetes集群,但是kubeadm init默認(rèn)會訪問谷歌服務(wù)器,使用的Docker鏡像倉庫是k8s.gcr.io,國內(nèi)是無法訪問的,我們可以使用docker.io/mirrorgooglecontainers中轉(zhuǎn)一下,所以需要執(zhí)行以下命令,如下圖所示:

使用docker.io/mirrorgooglecontainers中轉(zhuǎn)
使用docker.io/mirrorgooglecontainers中轉(zhuǎn)

但是coredns沒包含在docker.io/mirrorgooglecontainers中,所以需要手工到coredns官方鏡像轉(zhuǎn)換下,執(zhí)行以下命令進(jìn)行操作,如下圖所示:

需要手工到coredns官方鏡像轉(zhuǎn)換
需要手工到coredns官方鏡像轉(zhuǎn)換
需要手工到coredns官方鏡像轉(zhuǎn)換

最后通過“docker images”查看所有的鏡像,會發(fā)現(xiàn)所有鏡像都已經(jīng)下載完成,如下圖所示:

docker images

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)擊第一個節(jié)點(diǎn),我這里叫做K8S_Node1,選擇“管理”選項(xiàng)中的“克隆”選項(xiàng),開始復(fù)制虛擬機(jī),如下圖所示:

復(fù)制虛擬機(jī)

進(jìn)入到選擇克隆源的選擇,選擇“虛擬機(jī)中的當(dāng)前狀態(tài)”選項(xiàng),然后點(diǎn)擊“下一步”按鈕,如下圖所示:

選擇克隆源

在彈出的選擇克隆類型的窗口中選擇“創(chuàng)建完整克隆”選項(xiàng),點(diǎn)擊“下一步”按鈕,如下圖所示:

創(chuàng)建完整克隆

在彈出的設(shè)置新的虛擬機(jī)名稱的窗口中設(shè)置新的虛擬機(jī)的名稱為K8S_Node2,并設(shè)置保存位置,然后點(diǎn)擊“完成”按鈕,進(jìn)行復(fù)制操作,如下圖所示:

設(shè)置新的虛擬機(jī)

重復(fù)上面的步驟復(fù)制出名稱為K8S_Node3的虛擬機(jī)。

5.4.2 設(shè)置虛擬機(jī)網(wǎng)絡(luò)

復(fù)制虛擬機(jī)結(jié)束之后,我們會發(fā)現(xiàn)三個節(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配置會出問題,如下圖所示:

K8S_Node1

使用“vi”指令編輯“/etc/hosts”文件,在其最后添加192.168.149.129 k8s-node1,如下圖所示:

 k8s-node1

配置完畢之后,重啟生效,剩下的兩個節(jié)點(diǎn)也是如此的配置,這里不再演示。

5.5 創(chuàng)建Kubernetes集群

前面的準(zhǔn)備工作都已經(jīng)準(zhǔn)備好了,接下來我們就可以開始創(chuàng)建Kubernetes集群了,這里我們使用之前安裝的kubeadm來快速、方便的創(chuàng)建一個Kubernetes集群。

5.5.1 初始化Kubernetes集群

在主節(jié)點(diǎn)(K8S_Node1)上執(zhí)行以下的命令,如下圖所示:

K8S_Node1

當(dāng)看到如下信息時,就表示Kubernetes集群初始化成功了,如下圖所示:

Kubernetes集群初始化

我們需要將初始化成功的提示信息中的kubeadm join記錄下來(之后會使用到),同時需要執(zhí)行提示信息中關(guān)于以下的幾個指令,如下圖所示:

kubeadm join記錄

5.5.2 創(chuàng)建網(wǎng)絡(luò)

當(dāng)初始化好Kubernetes集群之后,我們還需要配置網(wǎng)絡(luò),以便實(shí)現(xiàn)各個節(jié)點(diǎn)之間的通訊,設(shè)置網(wǎng)絡(luò)可以使用Calico或者是flannel,這里我們采用flannel來設(shè)置網(wǎng)絡(luò),如下圖所示:

使用Calico或者是flannel

5.6 配置Kubernetes集群

當(dāng)Kubernetes集群初始化成功并設(shè)置好網(wǎng)絡(luò)之后,我們就需要將Pod調(diào)度到Master上,因?yàn)镵ubernetes默認(rèn)是不會將Pod調(diào)度到Master中,所以我們需要手動設(shè)置。

5.6.1 將Master作為工作節(jié)點(diǎn)

可以執(zhí)行以下命令,將Master節(jié)點(diǎn)作為工作節(jié)點(diǎn),如下圖所示:

Master節(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

K8S_Node3

如果kubeadm join指令失敗了,可以執(zhí)行kubeadm reset進(jìn)行重置,然后再次執(zhí)行kubeadm join。

最后我們通過“kubectl get nodes”查看節(jié)點(diǎn)是否添加到集群中,如下圖所示:

kubectl get nodes

到此,Kubernetes集群就搭建完畢了。

6. 總結(jié)

通過上述的案例,我們就可以把Kubernetes集群搭建完成,之后我們可以在此基礎(chǔ)上繼續(xù)搭建Kubernetes的Dashboard,也可以在Kubernetes部署nginx、redis等軟件??傊?,通過Kubernetes我們可以很方便的進(jìn)行分布式、集群操作,很方便的實(shí)現(xiàn)在物理機(jī)、虛擬機(jī)或者是云上進(jìn)行項(xiàng)目的部署和遷移。 ?


猜你喜歡:

Kubernetes網(wǎng)絡(luò)模型詳細(xì)介紹 

10分鐘創(chuàng)建阿里云容器服務(wù)kubernetes專有版 

5分鐘6步強(qiáng)制刪除kubernetes NameSpace小技巧

Kubernetes(K8S)入門教程下載 

Kubernetes集群部署詳細(xì)圖文教程

0 分享到:
和我們在線交談!