Kubernetes入門到實踐 (一) Kubernetes介紹 與 yum安裝Kubernetes集羣


一、Kubernetes 介紹

    Kubernetes是Google於2014年開源的一個容器編排工具,使用go語言編寫的,是由Google內部已經運行近十年的容器編排工具(Borg系統)衍生而來的。由於docker的橫空出世,導致Google原本準備作爲祕密武器的容器技術胎死腹中。計劃被打亂,容器層面已經痛失良機,慢人一步,只有在編排工具層面下手了,Google當機立斷,基於Brog系統的邏輯編寫出了Kubernetes,開源並捐給了CNCF(開源社區雲原生計算基金會),由於Google近十年的使用經驗,所以Kubernetes一出世就橫掃了其它編排工具,時至今日,地位依然穩固。

    Kubernetes 源於希臘語,意爲 “舵手” 或 “飛行員”, 且是英文governor和 cybernetic的詞根,簡稱K8s,是用8代替8個字符“ubernete”而形成的縮寫。Google採用這個名字的深意就是:既然你docker把自己定位成馱着集裝箱在大海上遨遊的鯨魚,那麼我就以Kubernetes掌舵大航海時代的話語權,鯨魚必須按照我設定的路線巡遊。

    Kubernetes的一大亮點就是自動化,在Kubernetes的解決方案中,一個服務可以自我擴展、自我診斷,並且容易升級,在收到服務擴容的請求後,Kubernetes會觸發調度流程,最終在選定的目標節點上啓動相應數量的服務實例副本,這些實例在啓動成功後會自動加入負載均衡器中並生效,Kubernetes會定時巡查每個服務的所有實例的可用性,確保服務實例的數量與預期的數量一致,當它發現某個實例不可用時,會自動重啓或在其它節點上重建該實例,整個過程無需額外的人工操作。




二、Kubernetes 核心功能介紹

  • 自愈: 重新啓動失敗的容器,在當前節點不可用時,會替換和重新調度其他節點上的容器,同時會對容器進行健康檢查,不響應的容器會被中止,並且在容器尚未準備好服務之前不會向客戶端廣播

  • 彈性伸縮: 通過監控容器的cpu的負載值,實現容器的彈性伸縮,如果這個平均高於設定值,則增加容器的數量,如果這個平均低於設定值,則減少容器的數量

  • 滾動升級和一鍵回滾: Kubernetes 會對應用程序或其配置的更改進行逐漸部署,同時監視應用程序的運行狀況,以確保它不會同時終止所有實例。 如果出現問題,可以使用Kubernetes的一鍵回滾功能,恢復到原先的運行狀態

  • 服務的自動發現和負載均衡: 不需要修改您的應用程序,Kubernetes會自行根據標識去發現服務。同時,Kubernetes 爲容器提供了自己的 IP 地址和一組容器的單個 DNS 名稱,並可以在它們之間進行負載均衡



三、Kubernetes 節點組件介紹

    Kubernetes 是經典的一對多模型,有一個主要的管理節點Master 和 許多的工作節點Node。當然,Kubernetes 也可以配置多個管理節點,擁有兩個以上的管理節點Master被稱爲高可用。接下來就分別對管理節點Master 和 工作節點Node上的組件進行介紹。

    Master組件可以在集羣中任何節點上運行。但是爲了簡單起見,通常在一臺虛擬機上啓動所有的Master組件,並且不會在此虛擬機器上運行用戶容器。同時,集羣中的所有控制命令都是傳遞給Master組件,在Master管理節點上運行,所以kubectl命令在其他Node工作節點上是無法執行的,其Master組件如下所示:

  • api server: 負責對外提供Restful的Kubernetes API服務,其他Master組件都通過調用api server提供的Restful接口實現各自的功能,如controller manager就是通過api server來實時監控各個資源的狀態的

  • etcd: 是 Kubernetes 提供的一個高可用的鍵值數據庫,用於保存集羣所有的網絡配置和資源對象的狀態信息,也就是保存了整個集羣的狀態信息。數據的變更都是通過api server進行的。整個kubernetes系統中一共有兩個服務需要用到etcd用來協同和存儲配置,分別是:

      1. 網絡插件flannel,其它網絡插件也需要用到etcd存儲網絡的配置信息

      2. kubernetes本身,包括各種資源對象的狀態和元信息配置

  • scheduler: 監聽新建pod副本信息,並通過調度算法爲該pod選擇一個最合適的Node節點。會檢索到所有符合該pod要求的Node節點,執行pod調度邏輯。調度成功之後,會將pod信息綁定到目標節點上,同時將信息寫入到etcd中。一旦綁定,就由Node節點上的kubelet接手pod的接下來的生命週期管理。如果把scheduler看成一個黑匣子,那麼它的輸入是pod和由多個Node節點組成的列表,輸出是pod和一個Node節點的綁定,即將這個pod部署到這個Node節點上。Kubernetes目前提供了調度算法,但是同樣也保留了接口,用戶可以根據自己的需求定義自己的調度算法

  • controller manager: 負責維護集羣的狀態,比如故障檢測、自動擴展、滾動更新等。每個資源一般都對應有一個控制器,這些controller通過api server實時監控各個資源的狀態,controller manager就是負責管理這些控制器的。當有資源因爲故障導致狀態變化,controller就會嘗試將系統由“現有狀態”恢復到“期待狀態”,保證其下每一個controller所對應的資源始終處於期望狀態。比如我們通過api server創建一個pod,當這個pod創建成功後,api server的任務就算完成了。而後面保證pod的狀態始終和我們預期的一樣的重任就由controller manager去保證了

    Node工作節點運行着Master管理節點分配的pod,當一個Node工作節點宕機時,其上的pod會被自動轉移到其他Node工作節點上,每一個Node工作節點都安裝了Node組件,其Node組件如下所示:

  • kubelet: 會監視已分配給Node節點的pod,負責pod的創建、啓動、監控、重啓和銷燬等工作,同時與Master節點密切協作,維護和管理該Node節點上面的所有容器,實現集羣管理的基本功能。kubelet會把自己註冊到Master節點上,當Node節點納入集羣管理的範圍後,kubelet進程就會定時向Master節點上報自身的資源情況。Master節點就掌握着每個Node節點的資源情況,就可以實施高效的資源調度策略。當某個Node節點超過指定時間未上報信息時,Master節點會將該Node節點標記爲Not Ready,同時會進行工作負載轉移。即Node工作節點通過kubelet與master組件交互,可以理解爲kubelet是Master節點在每個Node工作節點上面的代理人(agent)。本質上,它負責使pod的運行狀態與期望的狀態保持一致

  • kube-proxy: 是實現Kubernetes Service的通信以及負載均衡的重要組件,將到service的請求轉發到後端的pod上

  • Container runtime: 容器運行環境,負責節點容器的創建與管理工作,目前Kubernetes支持docker和rkt兩種容器

公共組件:

  • flannel: flannel是一個專門爲kubernetes定製的網絡解決方案,主要解決pod跨主機通信問題


四、Kubernetes集羣的安裝與配置

1、Kubernetes集羣的五種安裝方式對比

安裝方式 介紹
源碼編譯安裝 大神級別安裝,需要安裝golang編譯環境,同時對golang版本還有要求,可以安裝最新版本
二進制安裝 二進制安裝又分爲 全程手動安裝 和 自動安裝,自動安裝分爲 shell、ansible 和 saltstack版,可以安裝最新版本,網上安裝文檔比較多
kubeadm安裝 全自動化官方安裝工具,安裝比較簡單,但是對網絡有要求,可以安裝最新版本
minkube安裝 並不適合在生產環境下使用,適合開發者學習使用,可以安裝最新版本
yum安裝 安裝簡單,唯一不足的是Kubernetes的版本固定爲1.5.2,不能安裝最新版本

2、安裝前的環境準備

1、需要準備三臺Linux虛擬機,其配置如下所示:

主機名稱 節點名稱 IP地址 cpu (處理器數量) 內存 系統及內核
k8s-master master 192.168.198.145 1 1G CentOS7.x,內核版本至少爲3.10及以上
k8s-node1 node1 192.168.198.146 1 1G CentOS7.x,內核版本至少爲3.10及以上
k8s-node2 node2 192.168.198.147 1 1G CentOS7.x,內核版本至少爲3.10及以上

2、關閉三個節點(Linux虛擬機) 的firewalld防火牆和SELinux

firewalld會影響Docker的網絡功能,SELinux是2.6+版本的Linux內核中提供的強制訪問控制系統,在很大程度上加強了Linux的安全性,但是它會影響Kubernetes的某些組件功能,所以我們需要在安裝部署前將其禁用掉

//1、關閉Firewalld防火牆
systemctl stop firewalld.service  // 停止firewalld服務
systemctl disable firewalld.service  // 禁止firewalld開機啓動

//2、關閉SELinux
vim /etc/sysconfig/selinux       //編輯selinux文件
SELINUX=disabled         //把文件中的SELINUX=enforcing 改成 SELINUX=disabled 即可

//3、重啓linux
reboot

3、修改三個節點(Linux虛擬機) 的主機名稱

//1、查看當前主機的主機名稱
hostname

//2、修改當前主機的主機名稱
hostnamectl set-hostname 主機名稱

這裏以修改master節點的主機名爲例 (node1 和 node2節點與修改master節點的主機名類似,只不過需要把k8s-master 替換爲k8s-node1 和 k8s-node2即可)


4、配置三個節點(Linux虛擬機) 的ip地址 與 主機名的映射關係

//1、編輯hosts文件
vim /etc/hosts

//2、配置映射關係
192.168.198.145 k8s-master
192.168.198.146 k8s-node1
192.168.198.147 k8s-node2

這裏以配置master節點的ip地址 與 主機名的映射關係爲例 (node1 和 node2節點與配置master節點的ip地址 與 主機名的映射關係相同)


5、同步三個節點(Linux虛擬機) 的系統時間 (多個節點之間強烈建議同步時間)

//1、安裝ntpdate
yum install -y ntpdate

//2、同步系統時間,ntp1.aliyun.com爲阿里的時間(NTP)服務器
ntpdate ntp1.aliyun.com

//3、創建定時任務來自動同步阿里的時間(NTP)服務器
crontab -e

//4、設置每30分鐘同步一次時間
0 */30 * * * ? /usr/sbin/ntpdate ntp1.aliyun.com


設置每30分鐘同步一次時間


6、更新三個節點(Linux虛擬機) 的yum庫

yum -y upgrade //只升級所有包,不升級軟件和系統內核

注意:請不要使用yum -y update命令進行更新,該方式不僅會升級所有包,也會升級軟件和系統內核,容易導致系統奔潰,同時在生產環境對軟件版本和內核版本要求非常精確,所以該方式升級請慎重考慮




3、yum方式安裝 Kubernetes集羣

3.1、節點安裝的相關組件

節點名稱 相關組件
master etcd、api server、scheduler、controller-manager、flannel 和 docker
node1 docker、kubelet、proxy 和 flannel
node2 docker、kubelet、proxy 和 flannel

3.2、Master節點的安裝

3.2.1、etcd組件的安裝與配置

1、安裝etcd組件

yum install -y etcd



2、編輯etcd.conf配置文件

//1、編輯etcd.conf配置文件
vim /etc/etcd/etcd.conf

//2、修改etcd對外提供服務的的ip地址
ETCD_LISTEN_CLIENT_URLS="http://localhost:2379"
修改爲
ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379"

//3、修改etcd對外公告該節點客戶端的監聽地址
ETCD_ADVERTISE_CLIENT_URLS="http://localhost:2379"
修改爲
ETCD_ADVERTISE_CLIENT_URLS="http://master節點的ip地址:2379"



3、啓動etcd服務,並加入到開機啓動

//1、啓動etcd服務
systemctl start etcd

//2、設置etcd服務開機啓動
systemctl enable etcd



3.2.2、kubernetes-master組件的安裝與配置

1、安裝kubernetes-master組件 (其組件包含apiserver、config、controller-manager 和 scheduler)

yum install -y kubernetes-master

可以看到在安裝kubernetes-master組件的同時,會將依賴的kubernetes-client組件一同安裝


2、編輯apiserver配置文件

//1、編輯apiserver配置文件
vim /etc/kubernetes/apiserver

//2、修改api server的監聽地址
KUBE_API_ADDRESS="--insecure-bind-address=127.0.0.1"
修改爲
KUBE_API_ADDRESS="--insecure-bind-address=0.0.0.0"

//3、去掉前面的註釋
KUBE_API_PORT="--port=8080"  //api server監聽的端口
KUBELET_PORT="--kubelet-port=10250"  //kubelet監聽的服務端口

//4、修改etcd的服務地址,如果有多個,請以逗號隔開
KUBE_ETCD_SERVERS="--etcd-servers=http://127.0.0.1:2379"
修改爲
KUBE_ETCD_SERVERS="--etcd-servers=http://master節點的ip地址:2379"

//5、去掉認證參數ServiceAccount
KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ServiceAccount,ResourceQuota"
修改爲
KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ResourceQuota"




3、編輯config配置文件

//1、編輯config配置文件
vim /etc/kubernetes/config

//2、修改kubernetes master統一的管理入口ip地址
KUBE_MASTER="--master=http://127.0.0.1:8080"
修改爲
KUBE_MASTER="--master=http://master節點的ip地址:8080"



4、啓動apiserver、controller-manager 和 scheduler服務,並加入到開機啓動

//1、啓動apiserver服務,並設置開機啓動
systemctl start kube-apiserver
systemctl enable kube-apiserver

//2、啓動controller-manager服務,並設置開機啓動
systemctl start kube-controller-manager
systemctl enable kube-controller-manager

//3、啓動scheduler服務,並設置開機啓動
systemctl start kube-scheduler
systemctl enable kube-scheduler



3.2.3、flannel組件的安裝與配置

1、安裝flannel組件

yum install -y flannel



2、編輯flanneld配置文件

//1、編輯flanneld配置文件
vim /etc/sysconfig/flanneld

//2、修改flanneld服務讀取etcd數據庫的ip地址
FLANNEL_ETCD_ENDPOINTS="http://127.0.0.1:2379"
修改爲
FLANNEL_ETCD_ENDPOINTS="http://master節點的ip地址:2379"




3、分配docker網段

在etcd中添加一個名稱爲 /automic.io/network/config 的主鍵,通過該主鍵設置提供給docker容器使用的網段

etcdctl mk /atomic.io/network/config '{"Network":"172.17.0.0/16"}'



4、啓動flanneld服務,並加入到開機啓動

//1、啓動flanneld服務
systemctl start flanneld

//2、設置開機啓動
systemctl enable flanneld



3.2.4、查看組件的健康狀態
kubectl get componentstatus

//查看flanneld啓動服務的進程
ps -ef|grep flanneld



3.2.5、配置kubectl命令自動補全功能
//1、安裝epel-release 和 bash-completion
yum install -y epel-release bash-completion

//2、配置kubectl命令自動補全
source /usr/share/bash-completion/bash_completion
source <(kubectl completion bash)
echo "source <(kubectl completion bash)" >> ~/.bashrc

//3、測試配置是否成功
kubectl tab鍵



3.2.6、安裝docker 和 鏡像倉庫

由於HarBor鏡像倉庫需要更多的資源,所以這裏我選擇是Registry鏡像倉庫

docker安裝:https://blog.csdn.net/qq_39135287/article/details/101012149

registry鏡像倉庫的搭建:https://blog.csdn.net/qq_39135287/article/details/103307664

如果Master節點服務器配置比較高 或者 電腦配置比較高可以虛擬出多臺虛擬機的話,可以嘗試搭建 企業級容器鏡像倉庫HarBor:https://blog.csdn.net/qq_39135287/article/details/104041772

3.2.7、上傳pod-infrastructure鏡像至Registry鏡像倉庫

由於接下來在安裝Node節點時,kubelet配置文件中的pod-infrastructure鏡像 默認是從紅帽的registry.access.redhat.com/rhel7鏡像倉庫進行下載的,速度特別慢,所以我提前準備了其pod-infrastructure鏡像,將其上傳至Registry鏡像倉庫,在安裝Node節點時,修改其下載的鏡像倉庫地址

pod-infrastructure鏡像下載:https://pan.baidu.com/s/1GWxdGtl3oN4LnisHeOs6HQ 提取碼:8xko

1、將下載好的 pod-infrastructure.tar 上傳至Linux服務器,並導入pod-infrastructure鏡像

docker load -i $(pwd)/pod-infrastructure.tar

註釋:$(pwd)是docker支持的獲取當前目錄路徑的方法,與linux的pwd類似

在這裏插入圖片描述

2、將下載好的 pod-infrastructure.tar 上傳至Linux服務器,並導入pod-infrastructure鏡像

//1、推送鏡像至Registry鏡像倉庫
docker tag registry.access.redhat.com/rhel7/pod-infrastructure:latest registry鏡像倉庫地址:5000/rhel7/pod-infrastructure:latest

docker push registry鏡像倉庫地址:5000/rhel7/pod-infrastructure



3.3、Node節點的安裝

3.3.1、kubernetes-node組件的安裝與配置

1、安裝kubernetes-node組件 (其組件包含config、kubelet 和 proxy )

yum install -y kubernetes-node

提示:如果在使用yum安裝kubernetes-node組件之前,沒有安裝過docker,將不會出現如下安裝失敗現象

可以看到最後四行顯示如下所示:

Error: docker-ce-cli conflicts with 2:docker-1.13.1-103.git7f2769b.el7.centos.x86_64
Error: docker-ce conflicts with 2:docker-1.13.1-103.git7f2769b.el7.centos.x86_64
 You could try using --skip-broken to work around the problem
 You could try running: rpm -Va --nofiles --nodigest

提示我們kubernetes-node組件安裝失敗,原因:在我們使用yum安裝kubernetes-node組件時會自動安裝docker,而在安裝之前虛擬機上已經安裝過docker了,所以導致安裝kubernetes-node組件失敗,按照提示執行rpm -Va --nofiles --nodigest命令,還是解決不了問題,接下來就來記錄一下解決的方法:

(1) 查詢已經安裝過的docker安裝包

yum list installed | grep docker



(2) 刪除已經安裝過的docker安裝包

//1、刪除docker-ce-cli.x86_64 (同時還會刪除docker-ce.x86_64)
yum remove -y docker-ce-cli.x86_64

//2、刪除containerd.io.x86_64
yum remove -y containerd.io.x86_64




(3) 刪除已經安裝過的docker安裝包

//1、刪除鏡像
rm -rf /var/lib/docker

//2、刪除容器
rm -rf /var/run/docker

//3、刪除daemon.json配置文件
rm -rf /etc/docker/daemon.json



(4) 再次安裝kubernetes-node組件

yum install -y kubernetes-node

可以看到在安裝kubernetes-node組件的同時,會將依賴的dcoker和其它組件一同安裝



2、編輯kubelet配置文件

//1、編輯kubelet配置文件
vim /etc/kubernetes/kubelet

//2、修改kubelet的監聽地址
KUBELET_ADDRESS="--address=127.0.0.1"
修改爲
KUBELET_ADDRESS="--address=0.0.0.0"

//3、去掉前面的註釋
KUBELET_PORT="--port=10250"  //kubelet監聽的服務端口

//4、修改主機名
KUBELET_HOSTNAME="--hostname-override=127.0.0.1"
修改爲
KUBELET_HOSTNAME="--hostname-override=node節點的ip地址"

//5、指定api server的ip地址
KUBELET_API_SERVER="--api-servers=http://127.0.0.1:8080"
修改爲
KUBELET_API_SERVER="--api-servers=http://master節點的ip地址:8080"

//6、修改pod infrastructure container的鏡像下載地址
KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=registry.access.redhat.com/rhel7/pod-infrastructure:latest"
修改爲
KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=192.168.198.145:5000/rhel7/pod-infrastructure:latest"

//7、設置service-node-port的端口範圍(默認範圍是:30000-32767)
KUBELET_ARGS=""
修改爲
KUBELET_ARGS="--service-node-port-range=30000-50000"




3、編輯config配置文件

//1、編輯config配置文件
vim /etc/kubernetes/config

//2、修改kubernetes master統一的管理入口ip地址
KUBE_MASTER="--master=http://127.0.0.1:8080"
修改爲
KUBE_MASTER="--master=http://master節點的ip地址:8080"



4、啓動kubelet 和 kube-proxy服務,並加入到開機啓動

//1、啓動kubelet服務,並設置開機啓動
systemctl start kubelet
systemctl enable kubelet

//2、啓動kube-proxy服務,並設置開機啓動
systemctl start kube-proxy
systemctl enable kube-proxy



3.3.2、flannel組件的安裝與配置

1、安裝flannel組件

yum install -y flannel



2、編輯flanneld配置文件

//1、編輯flanneld配置文件
vim /etc/sysconfig/flanneld

//2、修改flanneld服務讀取etcd數據庫的ip地址
FLANNEL_ETCD_ENDPOINTS="http://127.0.0.1:2379"
修改爲
FLANNEL_ETCD_ENDPOINTS="http://master節點的ip地址:2379"




4、啓動flanneld服務,並加入到開機啓動

//1、啓動flanneld服務
systemctl start flanneld

//2、設置開機啓動
systemctl enable flanneld



3.3.3、配置阿里雲鏡像加速器 和 添加鏡像倉庫地址
//1、進入到docker目錄下
cd /etc/docker/

//2、編輯daemon.json配置文件
vim daemon.json

//3、配置阿里雲鏡像加速器 和 添加鏡像倉庫地址
{
  "registry-mirrors": ["你的阿里雲鏡像加速器地址"],
  "insecure-registries": ["master節點的ip地址:鏡像倉庫端口"]
}

獲取阿里雲鏡像加速地址注意:"registry-mirrors"一行末尾有逗號,


3.3.4、重新加載daemon.json配置文件 並 重啓docker服務
//重新加載daemon.json配置文件
systemctl daemon-reload

//重啓服務器
systemctl restart docker



3.3.5、在Master節點上查看Node節點的狀態
kubectl get nodes



3.4、測試所有Node節點是否能夠跨主機通信

3.4.1、修改所有Node節點上的iptables規則
/**
 * 1、測試之前需要修改 所有Node節點上的 iptables規則,將FORWARD規則(默認爲DROP) 改爲 ACCEPT,否則Node節點之間將無法進行通信
 * 2、修改的iptables規則 再重啓Node節點之後將會失效,所以每次重啓Node節點都需要重新設置一遍 FORWARD規則
**/
iptables -L -n //查看iptables規則
iptables -P FORWARD ACCEPT  //修改FORWARD規則爲 ACCEPT

注意:修改的iptables規則 再重啓Node節點之後將會失效,所以每次重啓Node節點都需要重新設置一遍 FORWARD規則

以Node1節點爲例,修改iptables規則,將FORWARD規則(默認爲DROP) 改爲 ACCEPT


3.4.2、所有Node節點運行busybox鏡像,查看其IP地址
//1、拉取busybox鏡像
docker pull busybox

//2、運行busybox鏡像 並進入到容器內部
docker run -it busybox

//3、查看其IP地址
ifconfig

Node1節點的IP地址信息


Node2節點的IP地址信息


3.4.3、Master節點運行busybox鏡像,並測試所有Node節點能否跨主機通信

1、Master節點運行busybox鏡像


2、執行ping命令,測試Node1節點能否跨主機通信

當看到如下信息時,則表示Node1節點能夠跨主機通信

--- 172.17.81.2 ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 0.645/2.744/6.515 ms

3、執行ping命令,測試Node2節點能否跨主機通信

當看到如下信息時,則表示Node2節點能夠跨主機通信

--- 172.17.13.2 ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 0.501/0.648/0.900 ms


Kubernetes入門到實踐系列文章列表:

Kubernetes入門到實踐 (一) Kubernetes介紹 與 yum安裝Kubernetes集羣
Kubernetes入門到實踐 (二) Kubeadm安裝Kubernetes集羣




                   如果有遇到不懂或者有問題時,可以掃描下方二維碼,歡迎進羣交流與分享,希望能夠跟大家交流學習!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章