Kubernetes (k8s) 叢集部署(一) 完整版

最閒的碼農發表於2020-06-09

Kubernetes最初源於谷歌內部的Borg,提供了面向應用的容器叢集部署和管理系統。Kubernetes 的目標旨在消除編排物理/虛擬計算,網路和儲存基礎設施的負擔,並使應用程式運營商和開發人員完全將重點放在以容器為中心的原語上進行自助運營。Kubernetes 也提供穩定、相容的基礎(平臺),用於構建定製化的workflows 和更高階的自動化任務。
Kubernetes 具備完善的叢集管理能力,包括多層次的安全防護和准入機制、多租戶應用支撐能力、透明的服務註冊和服務發現機制、內建負載均衡器、故障發現和自我修復能力、服務滾動升級和線上擴容、可擴充套件的資源自動排程機制、多粒度的資源配額管理能力。
Kubernetes 還提供完善的管理工具,涵蓋開發、部署測試、運維監控等各個環節。

Borg簡介

Borg是谷歌內部的大規模叢集管理系統,負責對谷歌內部很多核心服務的排程和管理。Borg的目的是讓使用者能夠不必操心資源管理的問題,讓他們專注於自己的核心業務,並且做到跨多個資料中心的資源利用率最大化。

Borg主要由BorgMaster、Borglet、borgcfg和Scheduler組成

  • BorgMaster是整個叢集的大腦,負責維護整個叢集的狀態,並將資料持久化到Paxos儲存中;
  • Scheduer負責任務的排程,根據應用的特點將其排程到具體的機器上去;
  • Borglet負責真正執行任務(在容器中);
  • borgcfg是Borg的命令列工具,用於跟Borg系統互動,一般透過一個配置檔案來提交任務。

Kubernetes架構

Kubernetes借鑑了Borg的設計理念,比如Pod、Service、Labels和單Pod單IP等。Kubernetes的整體架構跟Borg非常像,如下圖所示

Kubernetes主要由以下幾個核心元件組成:

  • etcd儲存了整個叢集的狀態;
  • apiserver提供了資源操作的唯一入口,並提供認證、授權、訪問控制、API註冊和發現等機制;
  • controller manager負責維護叢集的狀態,比如故障檢測、自動擴充套件、滾動更新等;
  • scheduler負責資源的排程,按照預定的排程策略將Pod排程到相應的機器上;
  • kubelet負責維護容器的生命週期,同時也負責Volume(CVI)和網路(CNI)的管理;
  • Container runtime負責映象管理以及Pod和容器的真正執行(CRI);
  • kube-proxy負責為Service提供cluster內部的服務發現和負載均衡;

除了核心元件,還有一些推薦的Add-ons:

  • kube-dns負責為整個叢集提供DNS服務
  • Ingress Controller為服務提供外網入口
  • Heapster提供資源監控
  • Dashboard提供GUI
  • Federation提供跨可用區的叢集
  • Fluentd-elasticsearch提供叢集日誌採集、儲存與查詢

分層架構

Kubernetes設計理念和功能其實就是一個類似Linux的分層架構,如下圖所示

  • 核心層:Kubernetes最核心的功能,對外提供API構建高層的應用,對內提供外掛式應用執行環境
  • 應用層:部署(無狀態應用、有狀態應用、批處理任務、叢集應用等)和路由(服務發現、DNS解析等)
  • 管理層:系統度量(如基礎設施、容器和網路的度量),自動化(如自動擴充套件、動態Provision等)以及策略管理(RBAC、Quota、PSP、NetworkPolicy等)
  • 介面層:kubectl命令列工具、客戶端SDK以及叢集聯邦
  • 生態系統:在介面層之上的龐大容器叢集管理排程的生態系統,可以劃分為兩個範疇
    • Kubernetes外部:日誌、監控、配置管理、CI、CD、Workflow、FaaS、OTS應用、ChatOps等
    • Kubernetes內部:CRI、CNI、CVI、映象倉庫、Cloud Provider、叢集自身的配置和管理等

Kubernetes設計理念與分散式系統

分析和理解Kubernetes的設計理念可以使我們更深入地瞭解Kubernetes系統,更好地利用它管理分散式部署的雲原生應用,另一方面也可以讓我們借鑑其在分散式系統設計方面的經驗。

順便說一句,Kubernetes 最簡單的還是用第三方的,比較方便,能用第三方的東西,絕不自己動手幹

Kubernetes (k8s) 叢集部署(一) 完整版

下面就進行安裝:第一步:準備三臺機器,並且都安裝docker

ip Role
192.168.184.28 master01
192.168.184.29 work01
192.168.184.30 work02

1、安裝前要確認以下幾項都已將準備完成:

所有節點彼此網路互通,master01 SSH 登入其他節點為 passwdless。
所有防火牆與 SELinux 已關閉。

$ systemctl stop firewalld && systemctl disable firewalld
$ setenforce 0 
$ vim /etc/selinux/config
SELINUX=disabled

2、為了方便依次修改主機名稱

$ hostnamectl set-hostname master01 //192.168.184.28
$ hostnamectl set-hostname work01   //192.168.184.29
$ hostnamectl set-hostname work02   //192.168.184.30 
$ vim /etc/hosts

Kubernetes (k8s) 叢集部署(一) 完整版

3、設定部署節點到其它所有節點的SSH免密碼登入

$ ssh-keygen -t rsa    
$ ssh-copy-id work01
$ ssh-copy-id work02

4、編輯/lib/systemd/system/docker.service,在ExecStart=..上面加入:

ExecStartPost=/sbin/iptables -I FORWARD -s 0.0.0.0/0 -j ACCEPT
//儲存過後重啟docker
$ systemctl daemon-reload && systemctl restart docker

5、所有節點需要設定/etc/sysctl.d/k8s.conf的系統引數

$ cat <<EOF > /etc/sysctl.d/k8s.conf
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF

$ sysctl -p /etc/sysctl.d/k8s.conf

6、建立相關目錄

$ mkdir -p /etc/etcd/{ssl_tmp,ssl,cfg,log}
$ mkdir -p /usr/local/bin
$ mkdir -p /usr/local/bin/cin
$ mkdir /var/lib/etcd
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章