- 一.系統(tǒng)環(huán)境
- 二.前言
-
三.Kubernetes
- 3.1 概述
-
3.2 Kubernetes 組件
- 3.2.1 控制平面組件
- 3.2.2 Node組件
- 四.配置節(jié)點(diǎn)的基本環(huán)境
- 五.節(jié)點(diǎn)安裝docker,并進(jìn)行相關(guān)配置
- 六.安裝kubelet,kubeadm,kubectl
- 七.kubeadm初始化
- 八.添加worker節(jié)點(diǎn)到k8s集群
- 九.部署CNI網(wǎng)絡(luò)插件calico
- 十.配置kubectl命令tab鍵自動(dòng)補(bǔ)全
- 十一.總結(jié)
一.系統(tǒng)環(huán)境
本文主要基于Kubernetes1.22.2和Linux操作系統(tǒng)Ubuntu 18.04。
服務(wù)器版本 | docker軟件版本 | Kubernetes(k8s)集群版本 | CPU架構(gòu) |
---|---|---|---|
Ubuntu 18.04.5 LTS | Docker version 20.10.14 | v1.22.2 | x86_64 |
Kubernetes集群架構(gòu):k8scludes1作為master節(jié)點(diǎn),k8scludes2,k8scludes3作為worker節(jié)點(diǎn)。
服務(wù)器 | 操作系統(tǒng)版本 | CPU架構(gòu) | 進(jìn)程 | 功能描述 |
---|---|---|---|---|
k8scludes1/192.168.110.128 | Ubuntu 18.04.5 LTS | x86_64 | docker,kube-apiserver,etcd,kube-scheduler,kube-controller-manager,kubelet,kube-proxy,coredns,calico | k8s master節(jié)點(diǎn) |
k8scludes2/192.168.110.129 | Ubuntu 18.04.5 LTS | x86_64 | docker,kubelet,kube-proxy,calico | k8s worker節(jié)點(diǎn) |
k8scludes3/192.168.110.130 | Ubuntu 18.04.5 LTS | x86_64 | docker,kubelet,kube-proxy,calico | k8s worker節(jié)點(diǎn) |
二.前言
下圖描述了軟件部署方式的變遷:傳統(tǒng)部署時(shí)代,虛擬化部署時(shí)代,容器部署時(shí)代。
傳統(tǒng)部署時(shí)代:
早期,各個(gè)組織是在物理服務(wù)器上運(yùn)行應(yīng)用程序。 由于無(wú)法限制在物理服務(wù)器中運(yùn)行的應(yīng)用程序資源使用,因此會(huì)導(dǎo)致資源分配問(wèn)題。 例如,如果在同一臺(tái)物理服務(wù)器上運(yùn)行多個(gè)應(yīng)用程序, 則可能會(huì)出現(xiàn)一個(gè)應(yīng)用程序占用大部分資源的情況,而導(dǎo)致其他應(yīng)用程序的性能下降。 一種解決方案是將每個(gè)應(yīng)用程序都運(yùn)行在不同的物理服務(wù)器上, 但是當(dāng)某個(gè)應(yīng)用程式資源利用率不高時(shí),剩余資源無(wú)法被分配給其他應(yīng)用程式, 而且維護(hù)許多物理服務(wù)器的成本很高。
虛擬化部署時(shí)代:
因此,虛擬化技術(shù)被引入了。虛擬化技術(shù)允許你在單個(gè)物理服務(wù)器的 CPU 上運(yùn)行多臺(tái)虛擬機(jī)(VM)。 虛擬化能使應(yīng)用程序在不同 VM 之間被彼此隔離,且能提供一定程度的安全性, 因?yàn)橐粋€(gè)應(yīng)用程序的信息不能被另一應(yīng)用程序隨意訪問(wèn)。
虛擬化技術(shù)能夠更好地利用物理服務(wù)器的資源,并且因?yàn)榭奢p松地添加或更新應(yīng)用程序, 而因此可以具有更高的可擴(kuò)縮性,以及降低硬件成本等等的好處。 通過(guò)虛擬化,你可以將一組物理資源呈現(xiàn)為可丟棄的虛擬機(jī)集群。
每個(gè) VM 是一臺(tái)完整的計(jì)算機(jī),在虛擬化硬件之上運(yùn)行所有組件,包括其自己的操作系統(tǒng)。
容器部署時(shí)代:
容器類(lèi)似于 VM,但是更寬松的隔離特性,使容器之間可以共享操作系統(tǒng)(OS)。 因此,容器比起 VM 被認(rèn)為是更輕量級(jí)的。且與 VM 類(lèi)似,每個(gè)容器都具有自己的文件系統(tǒng)、CPU、內(nèi)存、進(jìn)程空間等。 由于它們與基礎(chǔ)架構(gòu)分離,因此可以跨云和 OS 發(fā)行版本進(jìn)行移植。
容器因具有許多優(yōu)勢(shì)而變得流行起來(lái),例如:
- 敏捷應(yīng)用程序的創(chuàng)建和部署:與使用 VM 鏡像相比,提高了容器鏡像創(chuàng)建的簡(jiǎn)便性和效率。
- 持續(xù)開(kāi)發(fā)、集成和部署:通過(guò)快速簡(jiǎn)單的回滾(由于鏡像不可變性), 提供可靠且頻繁的容器鏡像構(gòu)建和部署。
- 關(guān)注開(kāi)發(fā)與運(yùn)維的分離:在構(gòu)建、發(fā)布時(shí)創(chuàng)建應(yīng)用程序容器鏡像,而不是在部署時(shí), 從而將應(yīng)用程序與基礎(chǔ)架構(gòu)分離。
- 可觀察性:不僅可以顯示 OS 級(jí)別的信息和指標(biāo),還可以顯示應(yīng)用程序的運(yùn)行狀況和其他指標(biāo)信號(hào)。
- 跨開(kāi)發(fā)、測(cè)試和生產(chǎn)的環(huán)境一致性:在筆記本計(jì)算機(jī)上也可以和在云中運(yùn)行一樣的應(yīng)用程序。
- 跨云和操作系統(tǒng)發(fā)行版本的可移植性:可在 Ubuntu、RHEL、CoreOS、本地、 Google Kubernetes Engine 和其他任何地方運(yùn)行。
- 以應(yīng)用程序?yàn)橹行牡墓芾恚禾岣叱橄蠹?jí)別,從在虛擬硬件上運(yùn)行 OS 到使用邏輯資源在 OS 上運(yùn)行應(yīng)用程序。
- 松散耦合、分布式、彈性、解放的微服務(wù):應(yīng)用程序被分解成較小的獨(dú)立部分, 并且可以動(dòng)態(tài)部署和管理 - 而不是在一臺(tái)大型單機(jī)上整體運(yùn)行。
- 資源隔離:可預(yù)測(cè)的應(yīng)用程序性能。
- 資源利用:高效率和高密度。
在這篇博客中,我們將詳細(xì)介紹如何在Ubuntu 18.04上安裝和部署Kubernetes 1.22.2集群。我們將使用kubeadm工具,這是Kubernetes官方推薦的用于快速部署Kubernetes集群的工具。
如果您的平臺(tái)在Centos系統(tǒng)上,關(guān)于Kubernetes(k8s)集群的安裝部署,可以查看博客《Centos7 安裝部署Kubernetes(k8s)集群》https://www.cnblogs.com/renshengdezheli/p/16686769.html。
如果您對(duì)Ubuntu系統(tǒng)不熟悉,Ubuntu系統(tǒng)的詳細(xì)操作,請(qǐng)查看博客《centos系統(tǒng)和Ubuntu系統(tǒng)命令區(qū)別以及常見(jiàn)操作》。
三.Kubernetes
3.1 概述
Kubernetes 是一個(gè)可移植、可擴(kuò)展的開(kāi)源平臺(tái),用于管理容器化的工作負(fù)載和服務(wù),可促進(jìn)聲明式配置和自動(dòng)化。 Kubernetes 擁有一個(gè)龐大且快速增長(zhǎng)的生態(tài),其服務(wù)、支持和工具的使用范圍相當(dāng)廣泛。
Kubernetes 這個(gè)名字源于希臘語(yǔ),意為“舵手”或“飛行員”。k8s 這個(gè)縮寫(xiě)是因?yàn)?k 和 s 之間有八個(gè)字符的關(guān)系。 Google 在 2014 年開(kāi)源了 Kubernetes 項(xiàng)目。 Kubernetes 建立在 Google 大規(guī)模運(yùn)行生產(chǎn)工作負(fù)載十幾年經(jīng)驗(yàn)的基礎(chǔ)上, 結(jié)合了社區(qū)中最優(yōu)秀的想法和實(shí)踐。
Kubernetes 為你提供的功能如下:
- 服務(wù)發(fā)現(xiàn)和負(fù)載均衡:Kubernetes 可以使用 DNS 名稱(chēng)或自己的 IP 地址來(lái)曝露容器。 如果進(jìn)入容器的流量很大, Kubernetes 可以負(fù)載均衡并分配網(wǎng)絡(luò)流量,從而使部署穩(wěn)定。
- 存儲(chǔ)編排:Kubernetes 允許你自動(dòng)掛載你選擇的存儲(chǔ)系統(tǒng),例如本地存儲(chǔ)、公共云提供商等。
- 自動(dòng)部署和回滾:你可以使用 Kubernetes 描述已部署容器的所需狀態(tài), 它可以以受控的速率將實(shí)際狀態(tài)更改為期望狀態(tài)。 例如,你可以自動(dòng)化 Kubernetes 來(lái)為你的部署創(chuàng)建新容器, 刪除現(xiàn)有容器并將它們的所有資源用于新容器。
- 自動(dòng)完成裝箱計(jì)算:你為 Kubernetes 提供許多節(jié)點(diǎn)組成的集群,在這個(gè)集群上運(yùn)行容器化的任務(wù)。 你告訴 Kubernetes 每個(gè)容器需要多少 CPU 和內(nèi)存 (RAM)。 Kubernetes 可以將這些容器按實(shí)際情況調(diào)度到你的節(jié)點(diǎn)上,以最佳方式利用你的資源。
- 自我修復(fù):Kubernetes 將重新啟動(dòng)失敗的容器、替換容器、殺死不響應(yīng)用戶(hù)定義的運(yùn)行狀況檢查的容器, 并且在準(zhǔn)備好服務(wù)之前不將其通告給客戶(hù)端。
- 密鑰與配置管理:Kubernetes 允許你存儲(chǔ)和管理敏感信息,例如密碼、OAuth 令牌和 ssh 密鑰。 你可以在不重建容器鏡像的情況下部署和更新密鑰和應(yīng)用程序配置,也無(wú)需在堆棧配置中暴露密鑰。
3.2 Kubernetes 組件
Kubernetes 集群架構(gòu)如下:
Kubernetes 集群組件如下:
Kubernetes有兩種節(jié)點(diǎn)類(lèi)型:master節(jié)點(diǎn),worker節(jié)點(diǎn)。master節(jié)點(diǎn)又稱(chēng)為控制平面(Control Plane)??刂破矫嬗泻芏嘟M件,控制平面組件會(huì)為集群做出全局決策,比如資源的調(diào)度。 以及檢測(cè)和響應(yīng)集群事件,例如當(dāng)不滿(mǎn)足部署的 replicas 字段時(shí), 要啟動(dòng)新的 pod)。
控制平面組件可以在集群中的任何節(jié)點(diǎn)上運(yùn)行。 然而,為了簡(jiǎn)單起見(jiàn),設(shè)置腳本通常會(huì)在同一個(gè)計(jì)算機(jī)上啟動(dòng)所有控制平面組件, 并且不會(huì)在此計(jì)算機(jī)上運(yùn)行用戶(hù)容器。
3.2.1 控制平面組件
控制平面組件如下:
-
kube-apiserver:API 服務(wù)器是 Kubernetes 控制平面的組件, 該組件負(fù)責(zé)公開(kāi)了 Kubernetes API,負(fù)責(zé)處理接受請(qǐng)求的工作。 API 服務(wù)器是 Kubernetes 控制平面的前端。
Kubernetes API 服務(wù)器的主要實(shí)現(xiàn)是 kube-apiserver。 kube-apiserver 設(shè)計(jì)上考慮了水平擴(kuò)縮,也就是說(shuō),它可通過(guò)部署多個(gè)實(shí)例來(lái)進(jìn)行擴(kuò)縮。 你可以運(yùn)行 kube-apiserver 的多個(gè)實(shí)例,并在這些實(shí)例之間平衡流量。 - etcd:etcd 是兼顧一致性與高可用性的鍵值對(duì)數(shù)據(jù)庫(kù),可以作為保存 Kubernetes 所有集群數(shù)據(jù)的后臺(tái)數(shù)據(jù)庫(kù)。你的 Kubernetes 集群的 etcd 數(shù)據(jù)庫(kù)通常需要有個(gè)備份計(jì)劃。
- kube-scheduler:kube-scheduler 是控制平面的組件, 負(fù)責(zé)監(jiān)視新創(chuàng)建的、未指定運(yùn)行節(jié)點(diǎn)(node)的 Pods, 并選擇節(jié)點(diǎn)來(lái)讓 Pod 在上面運(yùn)行。調(diào)度決策考慮的因素包括單個(gè) Pod 及 Pods 集合的資源需求、軟硬件及策略約束、 親和性及反親和性規(guī)范、數(shù)據(jù)位置、工作負(fù)載間的干擾及最后時(shí)限。
-
kube-controller-manager:kube-controller-manager 是控制平面的組件, 負(fù)責(zé)運(yùn)行控制器進(jìn)程。從邏輯上講, 每個(gè)控制器都是一個(gè)單獨(dú)的進(jìn)程, 但是為了降低復(fù)雜性,它們都被編譯到同一個(gè)可執(zhí)行文件,并在同一個(gè)進(jìn)程中運(yùn)行。
這些控制器包括:
節(jié)點(diǎn)控制器(Node Controller):負(fù)責(zé)在節(jié)點(diǎn)出現(xiàn)故障時(shí)進(jìn)行通知和響應(yīng)
任務(wù)控制器(Job Controller):監(jiān)測(cè)代表一次性任務(wù)的 Job 對(duì)象,然后創(chuàng)建 Pods 來(lái)運(yùn)行這些任務(wù)直至完成
端點(diǎn)控制器(Endpoints Controller):填充端點(diǎn)(Endpoints)對(duì)象(即加入 Service 與 Pod)
服務(wù)帳戶(hù)和令牌控制器(Service Account & Token Controllers):為新的命名空間創(chuàng)建默認(rèn)帳戶(hù)和 API 訪問(wèn)令牌 -
cloud-controller-manager:一個(gè) Kubernetes 控制平面組件, 嵌入了特定于云平臺(tái)的控制邏輯。 云控制器管理器(Cloud Controller Manager)允許你將你的集群連接到云提供商的 API 之上, 并將與該云平臺(tái)交互的組件同與你的集群交互的組件分離開(kāi)來(lái)。cloud-controller-manager 僅運(yùn)行特定于云平臺(tái)的控制器。 因此如果你在自己的環(huán)境中運(yùn)行 Kubernetes,或者在本地計(jì)算機(jī)中運(yùn)行學(xué)習(xí)環(huán)境, 所部署的集群不需要有云控制器管理器。
與 kube-controller-manager 類(lèi)似,cloud-controller-manager 將若干邏輯上獨(dú)立的控制回路組合到同一個(gè)可執(zhí)行文件中, 供你以同一進(jìn)程的方式運(yùn)行。 你可以對(duì)其執(zhí)行水平擴(kuò)容(運(yùn)行不止一個(gè)副本)以提升性能或者增強(qiáng)容錯(cuò)能力。
下面的控制器都包含對(duì)云平臺(tái)驅(qū)動(dòng)的依賴(lài):
節(jié)點(diǎn)控制器(Node Controller):用于在節(jié)點(diǎn)終止響應(yīng)后檢查云提供商以確定節(jié)點(diǎn)是否已被刪除
路由控制器(Route Controller):用于在底層云基礎(chǔ)架構(gòu)中設(shè)置路由
服務(wù)控制器(Service Controller):用于創(chuàng)建、更新和刪除云提供商負(fù)載均衡器
3.2.2 Node組件
節(jié)點(diǎn)組件會(huì)在每個(gè)節(jié)點(diǎn)上運(yùn)行,負(fù)責(zé)維護(hù)運(yùn)行的 Pod 并提供 Kubernetes 運(yùn)行環(huán)境。
node組件如下:
- kubelet:kubelet 會(huì)在集群中每個(gè)節(jié)點(diǎn)(node)上運(yùn)行。 它保證容器(containers)都運(yùn)行在 Pod 中。kubelet 接收一組通過(guò)各類(lèi)機(jī)制提供給它的 PodSpecs, 確保這些 PodSpecs 中描述的容器處于運(yùn)行狀態(tài)且健康。 kubelet 不會(huì)管理不是由 Kubernetes 創(chuàng)建的容器。
- kube-proxy:kube-proxy 是集群中每個(gè)節(jié)點(diǎn)(node)所上運(yùn)行的網(wǎng)絡(luò)代理, 實(shí)現(xiàn) Kubernetes 服務(wù)(Service) 概念的一部分。kube-proxy 維護(hù)節(jié)點(diǎn)上的一些網(wǎng)絡(luò)規(guī)則, 這些網(wǎng)絡(luò)規(guī)則會(huì)允許從集群內(nèi)部或外部的網(wǎng)絡(luò)會(huì)話(huà)與 Pod 進(jìn)行網(wǎng)絡(luò)通信。如果操作系統(tǒng)提供了可用的數(shù)據(jù)包過(guò)濾層,則 kube-proxy 會(huì)通過(guò)它來(lái)實(shí)現(xiàn)網(wǎng)絡(luò)規(guī)則。 否則,kube-proxy 僅做流量轉(zhuǎn)發(fā)。
四.配置節(jié)點(diǎn)的基本環(huán)境
先配置節(jié)點(diǎn)的基本環(huán)境,3個(gè)節(jié)點(diǎn)都要同時(shí)設(shè)置,在此以k8scludes1作為示例。
查看Ubuntu系統(tǒng)版本。
root@localhost:~# lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 18.04.5 LTS
Release: 18.04
Codename: bionic
首先設(shè)置主機(jī)名。
root@localhost:~# vim /etc/hostname
root@localhost:~# cat /etc/hostname
k8scludes1
配置節(jié)點(diǎn)靜態(tài)IP地址(可選)。
root@localhost:~# vim /etc/netplan/01-netcfg.yaml
root@localhost:~# cat /etc/netplan/01-netcfg.yaml
network:
version: 2
renderer: networkd
ethernets:
ens32:
dhcp4: no
addresses: [192.168.110.128/24]
gateway4: 192.168.110.2
nameservers:
addresses: [192.168.110.2,114.114.114.114]
使配置生效。
root@localhost:~# netplan apply
測(cè)試機(jī)器是否可以訪問(wèn)網(wǎng)絡(luò)。
root@localhost:~# ping www.baidu.com
PING www.baidu.com (14.215.177.39) 56(84) bytes of data.
64 bytes from www.baidu.com (14.215.177.39): icmp_seq=1 ttl=128 time=48.0 ms
64 bytes from www.baidu.com (14.215.177.39): icmp_seq=2 ttl=128 time=52.9 ms
64 bytes from www.baidu.com (14.215.177.39): icmp_seq=3 ttl=128 time=39.8 ms
^C
--- www.baidu.com ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2009ms
rtt min/avg/max/mdev = 39.843/46.940/52.968/5.417 ms
配置IP地址和主機(jī)名映射。
root@localhost:~# ifconfig
ens32: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.110.128 netmask 255.255.255.0 broadcast 192.168.110.255
inet6 fe80::20c:29ff:fe92:3462 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:92:34:62 txqueuelen 1000 (Ethernet)
RX packets 3600 bytes 909889 (909.8 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 2327 bytes 225443 (225.4 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 54 bytes 6421 (6.4 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 54 bytes 6421 (6.4 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
root@localhost:~# vim /etc/hosts
root@localhost:~# cat /etc/hosts
127.0.0.1 localhost
127.0.1.1 tom
192.168.110.128 k8scludes1
192.168.110.129 k8scludes2
192.168.110.130 k8scludes3
# The following lines are desirable for IPv6 capable hosts
::1 localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
重啟機(jī)器之后,主機(jī)名變?yōu)閗8scludes1,另外兩臺(tái)機(jī)器也進(jìn)行相同操作。
k8scludes1可以ping通其他兩個(gè)節(jié)點(diǎn)則成功。
root@k8scludes1:~# ping k8scludes1
PING k8scludes1 (192.168.110.128) 56(84) bytes of data.
64 bytes from k8scludes1 (192.168.110.128): icmp_seq=1 ttl=64 time=0.014 ms
64 bytes from k8scludes1 (192.168.110.128): icmp_seq=2 ttl=64 time=0.040 ms
64 bytes from k8scludes1 (192.168.110.128): icmp_seq=3 ttl=64 time=0.058 ms
^C
--- k8scludes1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2048ms
rtt min/avg/max/mdev = 0.014/0.037/0.058/0.018 ms
root@k8scludes1:~# ping k8scludes2
PING k8scludes2 (192.168.110.129) 56(84) bytes of data.
64 bytes from k8scludes2 (192.168.110.129): icmp_seq=1 ttl=64 time=0.465 ms
64 bytes from k8scludes2 (192.168.110.129): icmp_seq=2 ttl=64 time=2.98 ms
64 bytes from k8scludes2 (192.168.110.129): icmp_seq=3 ttl=64 time=2.34 ms
^C
--- k8scludes2 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2048ms
rtt min/avg/max/mdev = 0.465/1.932/2.983/1.069 ms
root@k8scludes1:~# ping k8scludes3
PING k8scludes3 (192.168.110.130) 56(84) bytes of data.
64 bytes from k8scludes3 (192.168.110.130): icmp_seq=1 ttl=64 time=0.450 ms
64 bytes from k8scludes3 (192.168.110.130): icmp_seq=2 ttl=64 time=3.71 ms
^C
--- k8scludes3 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1022ms
rtt min/avg/max/mdev = 0.450/2.083/3.717/1.634 ms
配置Ubuntu軟件源,軟件源如下,最后三行是k8s源。
root@localhost:~# cat /etc/apt/sources.list
deb http://m.ythuaji.com.cn/uploads/allimg/yx1pezmrjyh bionic main restricted universe multiverse
deb-src http://m.ythuaji.com.cn/uploads/allimg/yx1pezmrjyh bionic main restricted universe multiverse
deb http://m.ythuaji.com.cn/uploads/allimg/yx1pezmrjyh bionic-security main restricted universe multiverse
deb-src http://m.ythuaji.com.cn/uploads/allimg/yx1pezmrjyh bionic-security main restricted universe multiverse
deb http://m.ythuaji.com.cn/uploads/allimg/yx1pezmrjyh bionic-updates main restricted universe multiverse
deb-src http://m.ythuaji.com.cn/uploads/allimg/yx1pezmrjyh bionic-updates main restricted universe multiverse
deb http://m.ythuaji.com.cn/uploads/allimg/yx1pezmrjyh bionic-proposed main restricted universe multiverse
deb-src http://m.ythuaji.com.cn/uploads/allimg/yx1pezmrjyh bionic-proposed main restricted universe multiverse
deb http://m.ythuaji.com.cn/uploads/allimg/yx1pezmrjyh bionic-backports main restricted universe multiverse
deb-src http://m.ythuaji.com.cn/uploads/allimg/yx1pezmrjyh bionic-backports main restricted universe multiverse
deb http://m.ythuaji.com.cn/uploads/allimg/mqvth0rzds0 kubernetes-xenial main
deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu bionic stable
# deb-src [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu bionic stable
apt-key.gpg是k8s的deb源公鑰,加載k8s的deb源公鑰命令為:apt-key add apt-key.gpg,下載并加載k8s的deb源公鑰命令為:curl -s http://m.ythuaji.com.cn/uploads/allimg/hkey1j4oqc5.gpg | sudo apt-key add - ; apt-get update,但是谷歌的網(wǎng)址訪問(wèn)不了,我們直接去網(wǎng)上下載apt-key.gpg文件。
#apt-key.gpg文件下載好了
root@localhost:~# ls
apt-key.gpg
加載k8s的deb源公鑰。
root@localhost:~# cat apt-key.gpg | apt-key add -
OK
更新軟件源。
root@localhost:~# apt-get update
Hit:1 http://mirrors.aliyun.com/ubuntu bionic InRelease
Hit:2 http://mirrors.aliyun.com/ubuntu bionic-security InRelease
Hit:3 http://mirrors.aliyun.com/ubuntu bionic-updates InRelease
Get:4 https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial InRelease [9,383 B]
Hit:5 http://mirrors.aliyun.com/ubuntu bionic-proposed InRelease
Hit:6 http://mirrors.aliyun.com/ubuntu bionic-backports InRelease
Hit:7 https://mirrors.aliyun.com/docker-ce/linux/ubuntu bionic InRelease
Ign:8 https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial/main amd64 Packages
Get:8 https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial/main amd64 Packages [54.7 kB]
Fetched 54.7 kB in 2s (33.3 kB/s)
Reading package lists... Done
關(guān)閉防火墻。
root@k8scludes1:~# ufw disable
Firewall stopped and disabled on system startup
Linux swapoff命令用于關(guān)閉系統(tǒng)交換分區(qū)(swap area)。
注意:如果不關(guān)閉swap,就會(huì)在kubeadm初始化Kubernetes的時(shí)候報(bào)錯(cuò):“[ERROR Swap]: running with swap on is not supported. Please disable swap”。
root@k8scludes1:~# swapoff -a ;sed -i '/swap/d' /etc/fstab
root@k8scludes1:~# cat /etc/fstab
# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
# <file system> <mount point> <type> <options> <dump> <pass>
/dev/mapper/tom--vg-root / ext4 errors=remount-ro 0 1
此時(shí)基本環(huán)境就配置完畢了。
五.節(jié)點(diǎn)安裝docker,并進(jìn)行相關(guān)配置
k8s是容器編排工具,需要容器管理工具,所以三個(gè)節(jié)點(diǎn)同時(shí)安裝docker,還是以k8scludes1為例。
安裝docker。
root@k8scludes1:~# apt-get install docker-ce
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following additional packages will be installed:
containerd.io dbus-user-session docker-ce-cli docker-ce-rootless-extras docker-scan-plugin libltdl7 pigz
......
Processing triggers for libc-bin (2.27-3ubuntu1.2) ...
查看docker安裝包。
root@k8scludes 1:~# dpkg -l | grep docker
ii docker-ce 5:20.10.14~3-0~ubuntu-bionic amd64 Docker: the open-source application container engine
ii docker-ce-cli 5:20.10.14~3-0~ubuntu-bionic amd64 Docker CLI: the open-source application container engine
ii docker-ce-rootless-extras 5:20.10.14~3-0~ubuntu-bionic amd64 Rootless support for Docker.
ii docker-scan-plugin 0.17.0~ubuntu-bionic amd64 Docker scan cli plugin.
設(shè)置docker開(kāi)機(jī)自啟動(dòng)并現(xiàn)在啟動(dòng)docker。
root@k8scludes1:~# systemctl enable docker --now
Synchronizing state of docker.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install enable docker
查看docker狀態(tài)。
root@k8scludes1:~# systemctl status docker
● docker.service - Docker Application Container Engine
Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
Active: active (running) since Sat 2022-04-16 21:39:46 CST; 3min 21s ago
Docs: http://m.ythuaji.com.cn/uploads/allimg/qi211ameh4o.com
Main PID: 1822 (dockerd)
Tasks: 9
CGroup: /system.slice/docker.service
└─1822 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
查看docker版本。
root@k8scludes1:~# docker --version
Docker version 20.10.14, build a224086
注意kubernetes V1.22.2版本及其以后,要求容器的cgroup driver 為systemd,但是docker默認(rèn)的cgroup driver 是cgroupfs,kubernetes 1.21版本及其之前,是不需要修改cgroup driver的。
可以使用docker info | grep -i cgroup查看cgroup driver。
root@k8scludes1:~# docker info | grep -i cgroup
WARNING: No swap limit support
Cgroup Driver: cgroupfs
Cgroup Version: 1
配置docker鏡像加速器,并設(shè)置docker的cgroup driver 為systemd。
root@k8scludes1:~# cat > /etc/docker/daemon.json <<EOF
> {
> "registry-mirrors": ["https://frz7i079.mirror.aliyuncs.com"],
> "exec-opts": ["native.cgroupdriver=systemd"]
> }
> EOF
root@k8scludes1:~# cat /etc/docker/daemon.json
{
"registry-mirrors": ["https://frz7i079.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"]
}
重啟docker。
root@k8scludes1:~# systemctl restart docker
root@k8scludes1:~# systemctl status docker
● docker.service - Docker Application Container Engine
Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
Active: active (running) since Sat 2022-04-16 21:51:29 CST; 8s ago
Docs: http://m.ythuaji.com.cn/uploads/allimg/qi211ameh4o.com
Main PID: 3541 (dockerd)
Tasks: 9
CGroup: /system.slice/docker.service
└─3541 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
這時(shí)Cgroup Driver就變?yōu)閟ystemd了。
root@k8scludes1:~# docker info | grep -i cgroup
Cgroup Driver: systemd
Cgroup Version: 1
WARNING: No swap limit support
設(shè)置iptables不對(duì)bridge的數(shù)據(jù)進(jìn)行處理,啟用IP路由轉(zhuǎn)發(fā)功能。
root@k8scludes1:~# cat <<EOF> /etc/sysctl.d/k8s.conf
> net.bridge.bridge-nf-call-ip6tables = 1
> net.bridge.bridge-nf-call-iptables = 1
> net.ipv4.ip_forward = 1
> EOF
使配置生效。
root@k8scludes1:~# sysctl -p /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
六.安裝kubelet,kubeadm,kubectl
三個(gè)節(jié)點(diǎn)都安裝kubelet,kubeadm,kubectl,以k8scludes1為例:
- Kubelet 是 kubernetes 工作節(jié)點(diǎn)上的一個(gè)代理組件,運(yùn)行在每個(gè)節(jié)點(diǎn)上
- Kubeadm 是一個(gè)快捷搭建kubernetes(k8s)的安裝工具,它提供了 kubeadm init 以及 kubeadm join 這兩個(gè)命令來(lái)快速創(chuàng)建 kubernetes 集群,kubeadm 通過(guò)執(zhí)行必要的操作來(lái)啟動(dòng)和運(yùn)行一個(gè)最小可用的集群
- kubectl是Kubernetes集群的命令行工具,通過(guò)kubectl能夠?qū)罕旧磉M(jìn)行管理,并能夠在集群上進(jìn)行容器化應(yīng)用的安裝部署。
root@k8scludes1:~# apt-get -y install kubelet=1.22.2-00 kubeadm=1.22.2-00 kubectl=1.22.2-00
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following additional packages will be installed:
conntrack cri-tools kubernetes-cni socat
......
Unpacking kubeadm (1.22.2-00) ...
Setting up conntrack (1:1.4.4+snapshot20161117-6ubuntu2) ...
Setting up kubernetes-cni (0.8.7-00) ...
Setting up cri-tools (1.23.0-00) ...
Setting up socat (1.7.3.2-2ubuntu2) ...
Setting up kubelet (1.22.2-00) ...
Created symlink /etc/systemd/system/multi-user.target.wants/kubelet.service → /lib/systemd/system/kubelet.service.
Setting up kubectl (1.22.2-00) ...
Setting up kubeadm (1.22.2-00) ...
Processing triggers for man-db (2.8.3-2ubuntu0.1) ...
設(shè)置kubelet開(kāi)機(jī)自啟動(dòng)并現(xiàn)在啟動(dòng)kubelet。
root@k8scludes1:~# systemctl enable kubelet --now
kubelet現(xiàn)在是啟動(dòng)不了的。
root@k8scludes1:~# systemctl status kubelet
● kubelet.service - kubelet: The Kubernetes Node Agent
Loaded: loaded (/lib/systemd/system/kubelet.service; enabled; vendor preset: enabled)
Drop-In: /etc/systemd/system/kubelet.service.d
└─10-kubeadm.conf
Active: activating (auto-restart) (Result: exit-code) since Sat 2022-04-16 22:07:09 CST; 7s ago
Docs: http://m.ythuaji.com.cn/uploads/allimg/4ov232tlwaw
Process: 5282 ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_EXTRA_ARGS (code=exited, status=1/FAILURE)
Main PID: 5282 (code=exited, status=1/FAILURE)
七.kubeadm初始化
更新軟件源。
root@k8scludes1:~# apt update
查看可得的kubeadm軟件包版本。
root@k8scludes1:~# apt-cache madison kubeadm | grep 1.22
kubeadm | 1.22.8-00 | https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial/main amd64 Packages
kubeadm | 1.22.7-00 | https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial/main amd64 Packages
kubeadm | 1.22.6-00 | https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial/main amd64 Packages
kubeadm | 1.22.5-00 | https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial/main amd64 Packages
kubeadm | 1.22.4-00 | https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial/main amd64 Packages
kubeadm | 1.22.3-00 | https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial/main amd64 Packages
kubeadm | 1.22.2-00 | https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial/main amd64 Packages
kubeadm | 1.22.1-00 | https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial/main amd64 Packages
kubeadm | 1.22.0-00 | https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial/main amd64 Packages
kubeadm init:在主節(jié)點(diǎn)k8scludes1上初始化 Kubernetes 控制平面節(jié)點(diǎn)。
- --image-repository registry.aliyuncs.com/google_containers:表示使用阿里云鏡像倉(cāng)庫(kù),不然有些鏡像下載不下來(lái) ;
- --kubernetes-version=v1.22.2:指定kubernetes的版本;
- --pod-network-cidr=10.244.0.0/16:指定pod的網(wǎng)段 ;
- coredns是一個(gè)用go語(yǔ)言編寫(xiě)的開(kāi)源的DNS服務(wù)。
root@k8scludes1:~# kubeadm init --image-repository registry.aliyuncs.com/google_containers --kubernetes-version=v1.22.2 --pod-network-cidr=10.244.0.0/16
[init] Using Kubernetes version: v1.22.2
[preflight] Running pre-flight checks
......
[bootstrap-token] Creating the "cluster-info" ConfigMap in the "kube-public" namespace
[kubelet-finalize] Updating "/etc/kubernetes/kubelet.conf" to point to a rotatable kubelet client certificate and key
[addons] Applied essential addon: CoreDNS
[addons] Applied essential addon: kube-proxy
Your Kubernetes control-plane has initialized successfully!
To start using your cluster, you need to run the following as a regular user:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
Alternatively, if you are the root user, you can run:
export KUBECONFIG=/etc/kubernetes/admin.conf
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
http://m.ythuaji.com.cn/uploads/allimg/uo11gqgtxhb
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join 192.168.110.128:6443 --token ju8p1y.8gjm5q00l6u5y1rp \
--discovery-token-ca-cert-hash sha256:3f401b6187ed44ff8f4b50aa6453cf3eacc3b86d6a72e3bf2caba02556cb918e
進(jìn)行kubeadm初始化的時(shí)候會(huì)去下載各種鏡像,可以使用docker images查看。
root@k8scludes1:~# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
registry.aliyuncs.com/google_containers/kube-apiserver v1.22.2 e64579b7d886 7 months ago 128MB
registry.aliyuncs.com/google_containers/kube-controller-manager v1.22.2 5425bcbd23c5 7 months ago 122MB
registry.aliyuncs.com/google_containers/kube-proxy v1.22.2 873127efbc8a 7 months ago 104MB
registry.aliyuncs.com/google_containers/kube-scheduler v1.22.2 b51ddc1014b0 7 months ago 52.7MB
registry.aliyuncs.com/google_containers/etcd 3.5.0-0 004811815584 10 months ago 295MB
registry.aliyuncs.com/google_containers/coredns v1.8.4 8d147537fb7d 10 months ago 47.6MB
registry.aliyuncs.com/google_containers/pause 3.5 ed210e3e4a5b 13 months ago 683kB
根據(jù)提示創(chuàng)建目錄和配置文件。
root@k8scludes1:~# mkdir -p $HOME/.kube
root@k8scludes1:~# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
root@k8scludes1:~# sudo chown $(id -u):$(id -g) $HOME/.kube/config
現(xiàn)在已經(jīng)可以看到master節(jié)點(diǎn)了。
root@k8scludes1:~# kubectl get node
NAME STATUS ROLES AGE VERSION
k8scludes1 NotReady control-plane,master 178m v1.22.2
八.添加worker節(jié)點(diǎn)到k8s集群
接下來(lái)把另外的兩個(gè)worker節(jié)點(diǎn)也加入到k8s集群。
kubeadm init的時(shí)候輸出了如下這句。
kubeadm join 192.168.110.128:6443 --token ju8p1y.8gjm5q00l6u5y1rp \
--discovery-token-ca-cert-hash sha256:3f401b6187ed44ff8f4b50aa6453cf3eacc3b86d6a72e3bf2caba02556cb918e
在另外兩個(gè)worker節(jié)點(diǎn)執(zhí)行這一命令就可以把節(jié)點(diǎn)加入到k8s集群里。
如果加入集群的token忘了,可以使用如下的命令獲取最新的加入命令token。
root@k8scludes1:~# kubeadm token create --print-join-command
kubeadm join 192.168.110.128:6443 --token 4xk96a.qizykuirhn8ccvcw --discovery-token-ca-cert-hash sha256:3f401b6187ed44ff8f4b50aa6453cf3eacc3b86d6a72e3bf2caba02556cb918e
在k8scludes2執(zhí)行加入集群的token命令。
root@k8scludes2:~# kubeadm join 192.168.110.128:6443 --token 4xk96a.qizykuirhn8ccvcw --discovery-token-ca-cert-hash sha256:3f401b6187ed44ff8f4b50aa6453cf3eacc3b86d6a72e3bf2caba02556cb918e
[preflight] Running pre-flight checks
[preflight] Reading configuration from the cluster...
[preflight] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -o yaml'
[kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml"
[kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env"
[kubelet-start] Starting the kubelet
[kubelet-start] Waiting for the kubelet to perform the TLS Bootstrap...
This node has joined the cluster:
* Certificate signing request was sent to apiserver and a response was received.
* The Kubelet was informed of the new secure connection details.
Run 'kubectl get nodes' on the control-plane to see this node join the cluster.
可以發(fā)現(xiàn)worker節(jié)點(diǎn)加入到k8s集群后多了兩個(gè)鏡像。
root@k8scludes2:~# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
registry.aliyuncs.com/google_containers/pause 3.5 ed210e3e4a5b 13 months ago 683kB
registry.aliyuncs.com/google_containers/kube-proxy v1.22.2 873127efbc8a 7 months ago 104MB
在k8scludes3執(zhí)行加入集群的token命令。
root@k8scludes3:~# kubeadm join 192.168.110.128:6443 --token 4xk96a.qizykuirhn8ccvcw --discovery-token-ca-cert-hash sha256:3f401b6187ed44ff8f4b50aa6453cf3eacc3b86d6a72e3bf2caba02556cb918e
[preflight] Running pre-flight checks
[preflight] Reading configuration from the cluster...
[preflight] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -o yaml'
[kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml"
[kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env"
[kubelet-start] Starting the kubelet
[kubelet-start] Waiting for the kubelet to perform the TLS Bootstrap...
This node has joined the cluster:
* Certificate signing request was sent to apiserver and a response was received.
* The Kubelet was informed of the new secure connection details.
Run 'kubectl get nodes' on the control-plane to see this node join the cluster.
可以發(fā)現(xiàn)worker節(jié)點(diǎn)加入到k8s集群后多了兩個(gè)鏡像。
root@k8scludes3:~# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
registry.aliyuncs.com/google_containers/kube-proxy v1.22.2 873127efbc8a 7 months ago 104MB
registry.aliyuncs.com/google_containers/pause 3.5 ed210e3e4a5b 13 months ago 683kB
在k8scludes1查看節(jié)點(diǎn)狀態(tài),可以看到兩個(gè)worker節(jié)點(diǎn)都加入到了k8s集群。
root@k8scludes1:~# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8scludes1 NotReady control-plane,master 3h2m v1.22.2
k8scludes2 NotReady <none> 60s v1.22.2
k8scludes3 NotReady <none> 57s v1.22.2
九.部署CNI網(wǎng)絡(luò)插件calico
雖然現(xiàn)在kubernetes集群已經(jīng)有1個(gè)master節(jié)點(diǎn),2個(gè)worker節(jié)點(diǎn),但是此時(shí)三個(gè)節(jié)點(diǎn)的狀態(tài)都是NotReady的,原因是沒(méi)有CNI網(wǎng)絡(luò)插件,為了節(jié)點(diǎn)間的通信,需要安裝cni網(wǎng)絡(luò)插件,常用的cni網(wǎng)絡(luò)插件有calico和flannel,兩者區(qū)別為:flannel不支持復(fù)雜的網(wǎng)絡(luò)策略,calico支持網(wǎng)絡(luò)策略,因?yàn)榻窈筮€要配置kubernetes網(wǎng)絡(luò)策略networkpolicy,所以本文選用的cni網(wǎng)絡(luò)插件為calico!
現(xiàn)在去官網(wǎng)下載calico.yaml文件:
官網(wǎng):https://projectcalico.docs.tigera.io/about/about-calico
搜索框里直接搜索calico.yaml。
找到下載calico.yaml的命令。
下載calico.yaml文件。
root@k8scludes1:~# curl http://m.ythuaji.com.cn/uploads/allimg/ozxdcek44ut.yaml -O
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 212k 100 212k 0 0 8736 0 0:00:24 0:00:24 --:--:-- 18568
root@k8scludes1:~# ls
aa.txt apt-key.gpg calico.yaml set.sh
查看需要下載的calico鏡像。
root@k8scludes1:~# grep image calico.yaml
image: docker.io/calico/cni:v3.22.2
image: docker.io/calico/cni:v3.22.2
image: docker.io/calico/pod2daemon-flexvol:v3.22.2
image: docker.io/calico/node:v3.22.2
image: docker.io/calico/kube-controllers:v3.22.2
這四個(gè)鏡像需要在所有節(jié)點(diǎn)都下載,以k8scloudes1為例。
root@k8scludes1:~# docker pull docker.io/calico/cni:v3.22.2
root@k8scludes1:~# docker pull docker.io/calico/pod2daemon-flexvol:v3.22.2
root@k8scludes1:~# docker pull docker.io/calico/node:v3.22.2
root@k8scludes1:~# docker pull docker.io/calico/kube-controllers:v3.22.2
此時(shí)三個(gè)節(jié)點(diǎn)都有calico鏡像了。
root@k8scludes1:~# docker images | grep calico
calico/kube-controllers v3.22.2 a1a88662416b 2 days ago 132MB
calico/cni v3.22.2 be7dfc21ba2e 2 days ago 236MB
calico/pod2daemon-flexvol v3.22.2 d6660bf471e1 2 days ago 19.7MB
calico/node v3.22.2 fd1608dbbc19 2 days ago 198MB
root@k8scludes2:~# docker images | grep calico
calico/kube-controllers v3.22.2 a1a88662416b 2 days ago 132MB
calico/cni v3.22.2 be7dfc21ba2e 2 days ago 236MB
calico/pod2daemon-flexvol v3.22.2 d6660bf471e1 2 days ago 19.7MB
calico/node v3.22.2 fd1608dbbc19 2 days ago 198MB
root@k8scludes3:~# docker images | grep calico
calico/kube-controllers v3.22.2 a1a88662416b 2 days ago 132MB
calico/cni v3.22.2 be7dfc21ba2e 2 days ago 236MB
calico/pod2daemon-flexvol v3.22.2 d6660bf471e1 2 days ago 19.7MB
calico/node v3.22.2 fd1608dbbc19 2 days ago 198MB
修改calico.yaml 文件,CALICO_IPV4POOL_CIDR的IP段要和kubeadm初始化時(shí)候的pod網(wǎng)段一致,注意格式要對(duì)齊,不然會(huì)報(bào)錯(cuò)。
root@k8scludes1:~# vim calico.yaml
root@k8scludes1:~# cat calico.yaml | egrep "CALICO_IPV4POOL_CIDR|"10.244""
- name: CALICO_IPV4POOL_CIDR
value: "10.244.0.0/16"
不直觀的話(huà)看圖片:修改calico.yaml 文件。
應(yīng)用calico.yaml文件。
root@k8scludes1:~# kubectl apply -f calico.yaml
configmap/calico-config created
customresourcedefinition.apiextensions.k8s.io/bgpconfigurations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/bgppeers.crd.projectcalico.org created
......
clusterrolebinding.rbac.authorization.k8s.io/calico-kube-controllers created
clusterrole.rbac.authorization.k8s.io/calico-node created
clusterrolebinding.rbac.authorization.k8s.io/calico-node created
daemonset.apps/calico-node created
serviceaccount/calico-node created
deployment.apps/calico-kube-controllers created
serviceaccount/calico-kube-controllers created
Warning: policy/v1beta1 PodDisruptionBudget is deprecated in v1.21+, unavailable in v1.25+; use policy/v1 PodDisruptionBudget
poddisruptionbudget.policy/calico-kube-controllers created
查看calico pod。
root@k8scludes1:~# kubectl get pod -A | grep calico
kube-system calico-kube-controllers-65898446b5-gtsz6 1/1 Running 0 58s
kube-system calico-node-d6564 1/1 Running 0 59s
kube-system calico-node-jgvjb 0/1 Running 0 59s
kube-system calico-node-snkxp 1/1 Running 0 59s
此時(shí)發(fā)現(xiàn)三個(gè)節(jié)點(diǎn)都是Ready狀態(tài)了。
root@k8scludes1:~# kubectl get node
NAME STATUS ROLES AGE VERSION
k8scludes1 Ready control-plane,master 3h44m v1.22.2
k8scludes2 Ready <none> 42m v1.22.2
k8scludes3 Ready <none> 42m v1.22.2
十.配置kubectl命令tab鍵自動(dòng)補(bǔ)全
查看kubectl自動(dòng)補(bǔ)全命令。
root@k8scludes1:~# kubectl --help | grep bash
completion Output shell completion code for the specified shell (bash or zsh)
添加source <(kubectl completion bash)到/etc/profile,并使配置生效。
root@k8scludes1:~# vim /etc/profile
root@k8scludes1:~# cat /etc/profile | head -3
# /etc/profile: system-wide .profile file for the Bourne shell (sh(1))
# and Bourne compatible shells (bash(1), ksh(1), ash(1), ...).
source <(kubectl completion bash)
root@k8scludes1:~# source /etc/profile
此時(shí)即可kubectl命令tab鍵自動(dòng)補(bǔ)全。
root@k8scludes1:~# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8scludes1 Ready control-plane,master 3h46m v1.22.2
k8scludes2 Ready <none> 45m v1.22.2
k8scludes3 Ready <none> 45m v1.22.2
十一.總結(jié)
至此,我們已經(jīng)成功在Ubuntu 18.04上安裝并部署了Kubernetes 1.22.2集群。你現(xiàn)在可以開(kāi)始創(chuàng)建和管理你的Kubernetes資源了。