如何在 Ubuntu 上安裝 Kubernetes
在多台伺服器上手動部署 Docker 容器可能極為耗時,甚至會佔用負責此任務的系統管理員所有時間。在現代 IT 產業中,雲、微服務和容器的普及度持續攀升,正因如此,才催生了 Kubernetes 等解決方案。
Kubernetes 是一套開源的容器管理與編排解決方案,可協助您建置叢集,不僅能簡化在分散式環境中部署容器的流程,還能為容器化應用程式提供高可用性。本文旨在探討如何在 Ubuntu 上安裝 Kubernetes,以便在 Docker 容器中執行應用程式。
在 Ubuntu 上安裝 Kubernetes 的需求與系統配置
Kubernetes 叢集由主節點和工作節點組成。硬體配置取決於您的需求,以及您計劃在 Docker 容器中執行的應用程式。在 Ubuntu 上安裝 Kubernetes 的最低硬體需求如下:
- 至少需配備 2 核心的 x86/x64 處理器(CPU)
- 2 GB 記憶體 (RAM) 或更多
- 網路連線
在 Ubuntu 上安裝 Kubernetes 時必須開啟的端口:
| 議程 & 埠範圍 | 來源 | 目的 | 方向 |
| TCP 443 | 工作節點、終端使用者、API 請求 | Kubernetes API 伺服器 | 主節點傳入 |
| TCP 10250 | 主節點 | 工作節點 Kubelet 狀態檢查埠 | 工作節點傳入 |
| TCP 30000-32767 | 外部應用程式客戶端 | 提供外部服務的預設端口範圍 | |
| UDP 8285 | 工作節點 | Flannel 覆蓋網路的 UDP 後端 | |
| UDP 8472 | 工作節點 | Flannel 覆蓋網路的 VXLAN 後端 | |
| TCP 179 | 工作節點 | 僅在使用 Calico BGP 網路時才需要 | |
| TCP 2379-2380 | 主節點 | etcd 伺服器與客戶端 API | etcd 節點傳入 |
| TCP 2379-2380 | 工作節點 | 若使用 Calico 的 Flannel,則需使用 etcd 伺服器客戶端 API |
Ubuntu 預設已安裝 iptables 防火牆,但並未預先設定任何阻擋規則。因此,若您是為了嘗試 Kubernetes 而安裝 Ubuntu,則無需編輯防火牆規則。 Kube-proxy 會先建立其 iptables 鏈,然後插入兩條 iptables 規則。這些規則是 KUBE-EXTERNAL-SERVICES 和 KUBE-FIREWALL,它們會被插入到 INPUT 鏈的頂端。
在 Ubuntu 上安裝 Kubernetes 既可在實體機器上進行,也可在虛擬機器上進行。一般建議使用最新版本的 64 位元 Ubuntu Linux。 今天的部落格文章將說明如何在運行於 VMware 虛擬機上的 Ubuntu 18.04 LTS 上安裝 Kubernetes。首先說明的 Kubernetes 部署類型包含一個主節點,並使用兩個工作節點來構成 Kubernetes 叢集。請參閱下表,查看此範例中使用的機器所對應的節點數量、節點角色、主機名稱及 IP 位址。
| № | 節點角色 | IP 位址 | 主機名稱 |
| 1 | 大師 | 192.168.101.21 | docker-nakivo21 |
| 2 | 工人 | 192.168.101.31 | docker-nakivo31 |
| 3 | 工人 | 192.168.101.32 | docker-nakivo32 |
如果您使用 VMware vSphere,可以運用在 ESXi 主機上運行的虛擬機器;或者,您也可以在個人電腦上安裝 VMware 工作站,並在 Linux 或 Windows 系統中運行虛擬機器。在今天的範例中,我們將使用在 VMware 工作站上運行的虛擬機器。虛擬機器採用 NAT 網路 具備網路連線功能,若您偏好 VirtualBox 若您使用 VMware,即可使用此功能。
主機的 IP 位址: 10.10.10.53
NAT 網路(VMNet8)的虛擬閘道 IP 位址: 192.168.101.2
所有 Ubuntu 電腦上都存在同一位 Linux 使用者: kubernetes-user
虛擬機器設定: 2 顆 CPU、4 GB 記憶體、20 GB 虛擬磁碟
您可以透過前往以下位置來變更 VMnet8 的 IP 位址: Edit > Virtual Network Editor 在 VMware 工作站中。
為了讓大家更容易理解,在今天的範例中,所有元件都將在 Linux 上手動安裝,不會使用 Ansible 等自動化工具。
部署 Ubuntu 虛擬機器
建立一台名為 is 的新虛擬機器 docker-nakivo21.
在第一台機器上安裝 Ubuntu 64 位元版本,並設定主機名稱和使用者名稱。
虛擬機器名稱: docker-nakivo21
使用者名稱: kubernetes-user

請在首次登入已安裝的作業系統後安裝 VMware Tools。若您使用實體機器,則無需使用 VMware Tools,可跳過此步驟。
註:該 $ 開頭的字元表示該指令是以一般使用者身分執行(kubernetes-user (在此情況下)。如果字串以 # 若要執行該指令,必須以 根. 該 sudo (以其他使用者身分執行或以超級使用者身分執行) 指令可讓您以其他使用者(包括 root使用者)的身分執行命令。您可以輸入 sudo -i 以取得控制台的 root 權限。按下 Ctrl+D 即可退出 root 模式。
您可以從 VMware 虛擬化平台隨附的 ISO 映像檔,或從 Linux 儲存庫(詳見下文說明)安裝 VMware Tools。
$ sudo apt-get install open-vm-tools
如果您需要進階的桌面功能,例如共用剪貼簿、拖放 & 將檔案等放入,執行:
$ sudo apt-get install open-vm-tools-desktop
重新啟動虛擬機器。
$ init 6
在安裝 Kubernetes 之前設定您的 Ubuntu 系統
在 Ubuntu 機器上安裝 Kubernetes 之前,必須進行一些準備工作。首先,您必須為任何一般伺服器設定靜態 IP 位址和主機名稱。
設定靜態 IP 位址
至於其他類型的叢集,強烈建議在節點上使用靜態 IP 位址。
在設定 IP 位址之前,請先安裝 Linux 網路工具。
$ sudo apt-get install net-tools
類型 ifconfig 查看您的 Ubuntu 虛擬機器當前的 IP 位址。

您可以看到,IP 位址是透過 DHCP 自動取得的。請記住網路介面的名稱。在這個範例中,該名稱是 ens33. 第一個乙太網路介面的名稱通常是 eth0 適用於實體機器。
您需要一個文字編輯器來編輯設定檔。安裝 vim 作為文字編輯器。
$ sudo apt-get install vim
在最新的 Ubuntu 版本中,網路設定是透過 YAML 檔案進行設定的。請使用 vim 開啟網路設定的 YAML 檔案。
$ sudo vim /etc/netplan/01-network-manager-all.yaml
設定檔的預設檢視如下:

請依照以下說明編輯此網路設定檔的版本:
network:
version: 2
renderer: networkd
ethernets:
ens33:
dhcp4: no
addresses: [192.168.101.21/24]
gateway4: 192.168.101.2
nameservers:
addresses: [192.168.101.2,8.8.8.8]
儲存變更並退出。
:wq

$ sudo netplan try
按下 ENTER 鍵以接受新設定。
檢查您的網路設定是否已變更,並嘗試執行 ping 指令,例如: nakivo.com.
$ ifconfig
$ ping nakivo.com

設定主機名稱
請檢查您目前的主機名稱。
$ hostnamectl
如您所知,第一個虛擬機的主機名是 docker-nakivo21 已在安裝過程中完成設定。若要變更主機名稱,請執行以下操作(此步驟在克隆第二台和第三台虛擬機器後進行設定時會用到。這兩台虛擬機器將被設定為工作節點):
例如,若您需要將主機名稱變更為 docker-nakivo21 在第一台虛擬機器上,執行:
$ sudo hostnamectl set-hostname docker-nakivo21
確認新主機名已套用。
$ less /etc/hostname
編輯版本 主持人 檔案。
$ sudo vim /etc/hosts
主機檔案的內容應如下所示:
127.0.0.1 localhost
127.0.1.1 docker-nakivo21
重新啟動機器。
$ init 6
停用暫存檔
Kubernetes 不支援使用暫存檔(交換分割區),且若要在 Ubuntu 上成功安裝 Kubernetes,必須停用 swappiness。
停用暫存檔以防止 kubelet 造成高 CPU 使用率。
$ sudo swapoff -a
編輯 /etc/fstab 並使用 # 字元。
$ sudo vim /etc/fstab
#/swapfile none swap sw 0 0

您也可以使用 sed 只需輸入一個指令:
$ sudo sed -i '/ swap / s/^(.*)$/#1/g' /etc/fstab
停用交換空間 sysctl.conf
$ sudo echo "vm.swappiness=0" | sudo tee --append /etc/sysctl.conf
其中 0 代表 swap 比例。在此情況下,只有當 RAM 空間不足時才會使用 swap(預設情況下,當 RAM 佔用率超過 60% 時會使用 swap)。
套用設定變更而不重新開機。
$ sudo sysctl -p
註: 若未停用交換分割區,則 kswapd0 在 Ubuntu Linux 上運行 Kubernetes 的過程可能會消耗您電腦上的大量 CPU 資源,導致應用程式無回應,甚至使系統當機。這種情況通常發生在作業系統記憶體耗盡時,Linux 核心的系統程序會將舊的記憶體頁面移至交換區。由於某些難以解釋的原因,有時系統會出錯,進而形成一個消耗所有 CPU 資源的無限迴圈。在下方的螢幕截圖中,您可以看到由 kswapd0 在 Ubuntu 上安裝 Kubernetes 時的運作狀況。負載平均值過高。

如果 kswapd0 如果 CPU 仍然過載,請執行以下命令以清除所有記憶體快取並停止 kswapd0 (以 root 身分執行)。
# echo 1 > /proc/sys/vm/drop_caches
關閉虛擬機器。
$ init 0
這台部分設定好的虛擬機器(docker-nakivo21) 即將用作主節點。建立兩台機器作為工作節點。若使用實體機器,請手動重複前面的步驟(或使用 Ansible 等自動化工具,透過 SSH 同時配置多台 Linux 機器)。由於本範例使用虛擬機器,可透過克隆來節省在 Ubuntu 機器上準備 Kubernetes 安裝環境的時間。
複製虛擬機器
克隆您的第一台虛擬機器。如果您使用 VMware ESXi,可以利用其內建的克隆特點。您可閱讀我們的部落格文章,進一步了解相關內容: 使用虛擬機器範本複製虛擬機器. 如果您使用 VMware 工作站,也可以透過兩種方法(內建的複製工具,以及手動操作)來複製虛擬機器。您可以點擊 VM > Manage > Clone 建立連結複本。讓我們先建立第一台虛擬機器的完整複本,並手動複製虛擬機器的檔案。在此情況下,檔案將從 docker-nakivo21 目錄至 docker-nakivo31. 在複製虛擬機器檔案之前,必須先手動建立這些目錄。

請編輯 VMX 檔案,因為虛擬機器名稱和虛擬磁碟檔案的路徑已變更。
displayName = "docker-nakivo31"
scsi0:0.fileName = "C:VirtualKUBERNETESdocker-nakivo31docker-nakivo31.vmdk"
nvram = "docker-nakivo31.nvram"

將用作第一個工作節點的虛擬機器現已建立完成。請再次複製第一個虛擬機器,以準備 Kubernetes 叢集的第二個工作節點。
如同先前操作,編輯第三個虛擬機器(即第二個工作節點)的 VMX 檔案。
displayName = "docker-nakivo32"
scsi0:0.fileName = "C:VirtualKUBERNETESdocker-nakivo31docker-nakivo32.vmdk"
nvram = "docker-nakivo32.nvram"
在 VMware 工作站中開啟虛擬機器複本 (File> Open 並選取該虛擬機的 VMX 檔案),或直接雙擊該虛擬機的 VMX 檔案。啟動三台虛擬機(您的原始虛擬機和兩台虛擬機克隆)。點擊 我複製了, 當系統提示時。
註: 若您使用虛擬機器,請在虛擬機器克隆完成後,編輯每個虛擬機器克隆本的 IP 位址與主機名稱。若您使用實體機器,請根據每台機器的 IP 位址與主機名稱,依序執行前述所有步驟。
在虛擬機器上設定 IP 位址與主機名稱
在…上變更 IP 位址和主機名稱 docker-nakivo31 以及 docker-nakivo32 虛擬機器(如上圖所示)。
請重複前幾節所述的步驟,以設定靜態 IP 位址和主機名稱。
IP 位址必須為: 192.168.101.31 以及 192.168.101.32; 主機名稱必須是 docker-nakivo31 以及 docker-nakivo32 請在工作節點上進行相應設定。
所有機器都必須設定為能將節點的主機名稱解析為 IP 位址。您可以設定 DNS 伺服器,或手動編輯 主持人 每台機器上的檔案。現在來編輯 主持人.
將以下字串加入 主持人 每台機器上的檔案(docker-nakivo21, docker-nakivo31, docker-nakivo32).
$ sudo vim /etc/hosts
將這些行加入 主持人 檔案:
192.168.101.21 docker-nakivo21
192.168.101.31 docker-nakivo31
192.168.101.32 docker-nakivo32

從每台主機對其他主機進行 ping 測試,以確認主機名稱能否解析:
$ ping docker-nakivo21
$ ping docker-nakivo31
$ ping docker-nakivo32
在所有主機(虛擬機器)上設定 SSH 存取
在所有主機上設定 SSH 存取權限。請在每台機器上執行以下指令,安裝 OpenSSH 伺服器。
$ sudo apt-get install openssh-server
前往的根目錄 kubernetes-user 並產生 SSH 金鑰對(一套由私鑰和公鑰組成的加密金鑰)。SSH 金鑰對可用於透過 SSH 存取遠端 Linux 主機,無需使用密碼。公鑰可複製到您需要從其進行遠端連線的機器上,而私鑰則極為機密,必須儲存於您需要連線到的機器上。
$ ssh-keygen
生成金鑰時無需輸入密碼(密碼為選用項目)。
將金鑰複製到其他 Ubuntu 電腦上:
$ ssh-copy-id kubernetes-user@192.168.101.31
$ ssh-copy-id kubernetes-user@192.168.101.32
請輸入您的使用者密碼以確認複製金鑰。
嘗試連線至第二台機器 (docker-nakivo31) 作為 kubernetes-user (也就是一般使用者)。
$ ssh 'kubernetes-user@192.168.101.31'
接著測試與第三台電腦的連線(docker-nakivo32).
$ ssh 'kubernetes-user@192.168.101.32'
成功連線後,您將在主機的命令提示字元中看到遠端電腦的名稱。

按下 Ctrl+D 即可退出遠端主控台。
如何複製用於以 root使用者身分透過 SSH 連線的金鑰?
由於您在 Kubernetes 中需要 root 權限,讓我們建立用於設定 root 使用者 SSH 存取的金鑰。請在所有需要以 root使用者身分透過 SSH 存取的機器(docker-nakivo21、docker-nakivo31 和 docker-nakivo32)上執行以下指令:
$ sudo -i
編輯 SSH 伺服器設定檔。
# vim /etc/ssh/sshd_config
請在此檔案中新增或編輯以下字串。
PermitRootLogin yes

重新啟動 SSH 伺服器守護程序。
# /etc/init.d/ssh stop
# /etc/init.d/ssh start
設定 root 密碼(root使用者的密碼)。
# passwd
$ cd /home/kubernetes-user/
$ sudo ssh-keygen -t rsa
請複製公開金鑰,以便能透過 SSH 以 root 使用者身分遠端登入(由於前一個指令是從該目錄執行,因此金鑰儲存於一般使用者的家目錄中)。
$ sudo ssh-copy-id -i /home/kubernetes-user/.ssh/id_rsa.pub 127.0.0.1
如果您的金鑰儲存於 root使用者的家目錄中,請使用以下指令複製該金鑰:
# ssh-copy-id -i /root/.ssh/id_rsa.pub 127.0.0.1
請確認此操作並輸入您的密碼。
重複此操作,將各台機器上的金鑰複製到其他機器上。例如,在 docker-nakivo21 機器執行:
# ssh-copy-id -i /root/.ssh/id_rsa.pub 192.168.101.31
# ssh-copy-id -i /root/.ssh/id_rsa.pub 192.168.101.32
將公鑰授權。
# cat /root/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys
請確認您能否透過 SSH 以 root 身分登入本地端電腦。
$ sudo ssh root@127.0.0.1
嘗試在不輸入密碼的情況下,從遠端電腦連線至本機,或從本機連線至遠端電腦。
$ sudo ssh root@192.168.101.21
$ sudo ssh root@192.168.101.31
$ sudo ssh root@192.168.101.32
註: 以 root使用者身分連線可能不安全。若非必要,請勿以 root使用者身分連線——最好是以一般使用者身分透過 SSH 連線,並使用 sudo 指令。
Docker 安裝
Docker 是 Kubernetes 支援的最受歡迎的 Enterprise 應用程式容器平台。請在所有機器上安裝 Docker。請在 docker-nakivo21, docker-nakivo31, docker-nakivo32.
不過,不必急著進行。初步嘗試時,您可以直接使用以下常用指令安裝 Docker:
$ sudo apt-get install -y docker.io
不過,在此使用情境下,所使用的 Docker 版本可能並非最新版本。讓我們透過安裝最新版本的 Docker 來解決這個問題。
首先,安裝所需的套件。
$ sudo apt-get install apt-transport-https ca-certificates curl software-properties-common
Curl 是一款通用且精簡的工具,旨在透過支援的通訊協定(HTTP、HTTPS、FTP、FTPS、SFTP、LDAP、LDAPS、IMAP、IMAPS、POP3、POP3S、SCP、SMB、SMTP、TELNET 等)在無需使用者介入的情況下,將資料傳輸至或從主機傳輸。
將官方 Docker 儲存庫的 GPG 金鑰新增至您的 Ubuntu 系統:
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
主機輸出必須是 OK.
將官方 Docker 儲存庫新增至您的 apt 套件管理員:
$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable"
在使用前一個指令進行手動變更後,請更新套件管理器的資料庫。
$ sudo apt-get update
檢查官方儲存庫中可用的 Docker 套件版本。
$ apt-cache policy docker-ce
安裝 Docker。
$ sudo apt-get install docker-ce
安裝完成後,您可以檢查 Docker 的版本。
$ docker --version
在此情況下,輸出結果為: Docker 版本 18.09.6,編譯版本 481bc77.
啟動 Docker,並使其守護程序能在系統啟動時自動載入。
$ sudo systemctl start docker
$ sudo systemctl enable docker
在所有機器上安裝完 Docker 後,即可直接進入在 Ubuntu 上安裝 Kubernetes 的步驟。
在 Ubuntu 上安裝 Kubernetes 及叢集初始化
現在,您可以開始安裝 Kubernetes 的核心元件了。
請在所有將納入 Kubernetes 叢集的機器上,以 root 身分執行以下指令。
$ sudo -i
將官方 Docker 儲存庫的 GPG 金鑰新增至您的 Ubuntu 系統:
# curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
將官方 Kubernetes 儲存庫新增至 apt 套件管理員的可用套件儲存庫清單中。
# cat <
deb http://apt.kubernetes.io/ kubernetes-xenial main
EOF
此外,您也可以使用以下指令新增儲存庫:
# echo 'deb http://apt.kubernetes.io/ kubernetes-xenial main' | sudo tee /etc/apt/sources.list.d/kubernetes.list
在哪裡 T恤 這是一個讀取標準輸入,並將輸入資料寫入標準輸出及指定檔案的工具。
更新 Ubuntu 系統中可用儲存庫的套件清單。
# apt-get update

安裝 kubectl, kubeadm 以及 kubectl 在 Ubuntu 上安裝 Kubernetes 時,這一點至關重要。
# apt-get install -y kubelet kubeadm kubectl
安裝 keepalived。
# apt-get install keepalived
# systemctl enable keepalived && systemctl start keepalived
請確認該值是否為 1 以確保安裝在 Ubuntu 上的 Kubernetes 能正常運作。
# sysctl net.bridge.bridge-nf-call-iptables
若要將此值設定為 1 執行以下指令:
sysctl net.bridge.bridge-nf-call-iptables=1
編輯 kubeadm 設定檔。
# vim /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
請將該字串新增至現有的"環境"字串之後:
Environment=”cgroup-driver=systemd/cgroup-driver=cgroupfs”

Cgroups 是一組控制群組,用於隔離處理器、記憶體、磁碟輸入/輸出及網路等資源的使用。
在主節點上 (docker-nakivo21) 執行以下指令,在 Ubuntu 上初始化 Kubernetes 叢集。
# kubeadm init --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=192.168.101.21
在哪裡
–pod-network-cidr 這是 Flannel 驅動程式所必需的。CIDR(無類別域間路由)定義了您稍後將配置的覆蓋網路(例如 Flannel)的位址。網路遮罩同時也定義了每個節點上可執行的 Pod 數量。CIDR 網路位址與 Flannel 所使用的網路位址必須相同。
–apiserver-advertise-address=192.168.101.21 定義 Kubernetes 將作為其 API 伺服器進行廣播的 IP 位址。

請閱讀文字末尾顯示的輸出內容和儲存指令。這一點非常重要。生成的憑證是將工作節點加入 Kubernetes 叢集的必要條件。
請以曾執行過 kubeadm init. 在這種情況下,指令將以 root 身分執行。
# mkdir -p $HOME/.kube
# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
# sudo chown $(id -u):$(id -g) $HOME/.kube/config
若未執行這些指令,Kubernetes 將回傳錯誤訊息:連線至伺服器 localhost:8080 遭拒絕——您是否指定了正確的主機或埠號?
Kubernetes 不會複製此內容 設定 檔案會自動儲存至使用者目錄中。您應手動執行此操作。

檢查已加入叢集的節點
# kubectl get nodes

您可以看到一個主節點,該節點具有 尚未準備好 在正在安裝於 Ubuntu 上的 Kubernetes 叢集中的狀態。這是因為尚未設定覆蓋網路。請設定 Flannel 以解決此問題 尚未準備好 Kubernetes 主節點的狀態。建立目錄來存放 Docker 和 Kubernetes 的 YAML 檔案,例如 /home/kubernetes-user/kubernetes/
YAML(Yet Another Markup Language)能讓您在 Kubernetes 中建立 Pod 和部署時更加便利。您可以將所有必須部署的容器參數定義在 YAML 配置檔案中,而不必在 Linux 終端機上手動執行每個指令。在 Kubernetes 的語境中,YAML 檔案也被稱為清單檔案。
建立一個內容如下所示的 YAML 配置檔案:
執行指令 `
` # kubectl apply -f ./kube-flannel.yml
此外,您也可以在 GitHub 上找到現成的 Kubernetes YAML 部署配置範例。
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/a70459be0084506e4ec919aa1c114638878db11b/Documentation/kube-flannel.yml
檢查您在 Ubuntu 上部署的 Kubernetes 叢集中新增的節點:
# kubectl get nodes
主節點的狀態目前為"就緒"。

請確認已正確設定 Flannel:
# kubectl get pods --all-namespaces

您可以看到 Flannel Pod 正在運行。此 Pod 由兩個容器組成——Flannel 守護程序,以及用於將 CNI 配置部署到 Kubernetes 可讀位置的 initContainer。
有時在 Ubuntu 上安裝 Kubernetes 時,可能會發生以下錯誤:
無法連線至伺服器:net/http: TLS 握手超時。
如何解決此問題?請等待幾秒鐘後再試一次——通常這樣就足夠了。
命名空間是 Kubernetes 叢集中的邏輯實體,代表叢集資源,可視為虛擬叢集。一個實體叢集可以邏輯上劃分為多個虛擬叢集。Kubernetes 的預設命名空間是 預設, Kube-public,以及 Kube-system. 您可以取得命名空間清單:
# kubectl get namespaces
如您所知,Kubernetes 的基本部署單位是 Pod,它是一組共享網路和掛載命名空間的容器集合。Pod 中的所有容器都會被排程至同一台 Kubernetes 節點上。查看可用的 Pod:
# kubectl -n kube-system get pods

若要重置/停止叢集,請執行:
# kubeadm reset
主節點一切正常。這表示您現在可以繼續在 Ubuntu 上安裝 Kubernetes,並開始將工作節點加入叢集。
在工作節點上 (docker-nakivo31, docker-nakivo32) 執行以下指令:
# kubeadm join 192.168.101.21:6443 --token d8mbzb.uulxu01jbty8yh4z
--discovery-token-ca-cert-hash sha256:65ace7a4ff6fff795abf086f18d5f0d97da71d4639a0d0a6b93f42bea4948a79
在叢集初始化完成後,記錄了該代幣和雜湊值,並使用 kubeadm init 如您所知,請執行以下指令:
在主節點上,再次檢查叢集狀態:
# kubectl get nodes

現在,您可以在運行於 Ubuntu 機器的 Kubernetes 叢集中看到一個主節點和兩個工作節點。
您可以檢查 Kubernetes 設定:
# kubectl cluster-info

在 Kubernetes 中部署 Pod
現在,您可以在 Kubernetes 叢集中部署包含容器的 Pod。如您所知,在 Kubernetes 中,容器是 Pod 的組成部分。如果您使用 YAML 檔案,建議建立一個目錄來存放這些檔案,以方便管理。請進入該目錄,並執行以下命令: kubectl apply -f test.yaml
在設定 Flannel 時,此目錄已建立 – /home/kubernetes-user/kubernetes/
現在是時候部署一個新的 Pod 了。首先,您需要建立一個部署。部署是一種控制器概念,用於為 Pod 和複本集提供宣告式更新。您可以透過單一指令,或使用 YAML 檔案來建立部署。
範例 1 – 部署 MySQL
在此範例中,讓我們建立一個 YAML 檔案。檔案的名稱為 mysql-deployment.yaml
請參閱附件以查看設定。
# vim mysql-deployment.yaml
在管理資源方面,有兩種常見的方法: kubectl. 兩者有何不同? kubectl create 以及 kubectl apply? 使用時 kubectl create, 您需告知 Kubernetes 欲建立、替換或刪除的對象;此指令會覆寫所有變更。或者, kubectl apply 會進行增量變更,此指令可用於儲存對活體物件所做的變更。
建立部署:
# kubectl apply -f ./mysql-deployment.yaml

Kubernetes 可以顯示有關您部署的資訊。
# kubectl describe deployment mysql
查看莢果:
# kubectl get po
或
# kubectl get pods
或
# kubectl get pods -l app=mysql
若您發現 Pod 處於"待處理"狀態,這可能表示運算資源不足。請嘗試增加 CPU 和記憶體容量,以解決 Kubernetes 中 Pod 的"待處理"狀態。

如有需要,您可以刪除該服務:
# kubectl delete service
您也可以刪除一個 Pod:
# kubectl delete pod mysql-7b9b7999d8-nz5tm
範例 2 – 部署 nginx
讓我們使用另一種不需 YAML 檔案的方法來部署 Nginx。
建立部署。
# kubectl create deployment nginx --image=nginx
請確認部署已建立。
# kubectl get deployments
建立一個服務。
# kubectl create service nodeport nginx --tcp=80:80
可透過以下服務類型建立服務:ClusterIP、NodePort、LoadBalance 及 ExternalName。若使用 NodePort 類型,系統會從 30000 至 32767 的範圍內隨機分配一個端口,供存取所提供的服務。傳送至此端口的流量將被轉發至所需的服務。
確認服務已建立,並正在定義的端口上進行監聽。
# kubectl get svc

請記住端口號碼(此處為 31453)。
檢查您的服務是否已部署且可使用(此範例中,該指令在主節點上執行)。請使用節點的主機名稱以及您在上一步驟記下的端口號碼。
# curl docker-nakivo31:31453
您也可以檢查該服務是否可在任何節點的瀏覽器中存取。請在網頁瀏覽器的網址列中嘗試造訪以下頁面:
http:// 10.101.235.90
或
http://docker-nakivo31:31453
http://docker-nakivo32:31453
如果一切正常,您將會看到 nginx 的歡迎頁面。

此外,只要是能夠連接到 Kubernetes 節點所連接之網路的任何機器,皆可造訪 nginx 測試頁面——(192.168.101.0/24) 在這種情況下。例如,您可以使用瀏覽器造訪這些網頁:
http://192.168.101.21:31453/
http://192.168.101.31:31453/
http://192.168.101.32:31453/
設定用於監控 Kubernetes 的網頁介面
在 Ubuntu 上安裝 Kubernetes 的步驟已接近完成,但您也可以安裝 Kubernetes 儀表板以提升使用便利性。Kubernetes 儀表板是專用於管理與監控 Kubernetes 的網頁介面。若要安裝此儀表板,請建立 kubernetes-dashboard.yaml 檔案,就像您先前在執行指令前所做的那樣。
# kubectl create -f ./kubernetes-dashboard.yaml
# kubectl apply -f ./kubernetes-dashboard.yaml
檢查莢果。
# kubectl get pods -o wide --all-namespaces
啟動 Kubernetes API 伺服器的代理程式。
# kubectl proxy

若要在主控台輸入後續指令,請開啟另一個主控台視窗。否則,程序將會終止。
請在主節點的網頁瀏覽器中,前往以下頁面:
http://localhost:8001
您可以查看測試頁面。

請在網頁瀏覽器的網址列中輸入完整網址。
http://localhost:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/

請在新控制台視窗中執行以下指令,使用服務帳戶建立儀表板。
# kubectl create serviceaccount dashboard -n default
# kubectl create clusterrolebinding dashboard-admin -n default
--clusterrole=cluster-admin
--serviceaccount=default:dashboard
# kubectl get secret $(kubectl get serviceaccount dashboard -o jsonpath="{.secrets[0].name}") -o jsonpath="{.data.token}" | base64 –decode
現在您可以看到生成的代幣:

請複製生成的憑證,並將其貼上至網頁介面的憑證欄位,以登入儀表板。

在下方的螢幕截圖中,您可以看到 Kubernetes 儀表板的網頁介面。您可以查看節點、部署和 Pod 的狀態,並檢查角色、儲存類別及其他元件。

設定監控工具 Heapster
安裝 Heapster,透過新增 CPU、記憶體及其他監控參數,來擴充 Kubernetes 儀表板的監控選項。建立一個名為 heapster.yaml.
# vim heapster.yaml
下一步,部署 Heapster。
# kubectl create -f heapster.yaml
編輯 Heapster 的 RBAC(基於角色的存取控制)角色,並新增存取節點統計資料的權限。
# kubectl edit clusterrole system:heapster

請確認能否在主控台中測量 CPU 和記憶體指標。
# kubectl top node

現在您可以開啟 Kubernetes 儀表板的網頁介面,並會發現已新增了幾個區塊,包括 CPU 使用率與記憶體使用率的圖表。

您的 Kubernetes 叢集現已設定完成,並已準備就緒。
在 Ubuntu 上部署具有多個主節點的高可用性 Kubernetes 叢集
建置一個包含一個主節點和幾個工作節點的 Kubernetes 叢集是個不錯的選擇,但有時唯一的主節點可能會因硬體問題或斷電等原因而發生故障。為了提升部署在 Ubuntu 節點上的 Kubernetes 叢集的容錯能力,建議考慮部署具有多個主節點的高可用性 Kubernetes 叢集。採用這種 Kubernetes 叢集部署模式,可避免單點故障。 建議使用奇數個主節點,且能提供容錯能力的最小主節點數量為三個。若使用超過三個主節點且節點數量為偶數時,整個叢集的容錯能力並不會提升。 請參閱下表,了解 Kubernetes 叢集中主節點數量對容錯能力的影響。例如,若您擁有一個包含 5 個主節點的叢集,該叢集可承受 2 個主節點故障,因為仍有 3 個主節點持續運作(5 個中的 3 個超過 50%,且佔多數)。此處的叢集規模指的是叢集中的主節點數量。
| 叢集大小 | 多數 | 容錯能力 |
| 1 | 1 | 0 |
| 2 | 2 | 0 |
| 3 | 2 | 1 |
| 4 | 3 | 1 |
| 5 | 3 | 2 |
| 6 | 4 | 2 |
| 7 | 4 | 3 |
| 8 | 5 | 3 |
| 9 | 5 | 4 |
本篇部落格文章的這一節,將探討如何在部署 Kubernetes 高可用性叢集、HA 代理伺服器及若干工作節點的框架下,於 Ubuntu 節點上安裝 Kubernetes。在下表中,您可以查看本範例所述測試實驗室中,用於在 Ubuntu 節點上安裝高可用性 Kubernetes 叢集的主機之 IP 位址、主機名稱及角色。
| № | 節點角色 | IP 位址 | 主機名稱 |
| 1 | 大師 | 192.168.101.21 | docker-nakivo21 |
| 2 | 大師 | 192.168.101.22 | docker-nakivo22 |
| 3 | 大師 | 192.168.101.23 | docker-nakivo23 |
| 4 | HA Proxy | 192.168.101.19 | ha-proxy19 |
| 5 | 工人 | 192.168.101.31 | docker-nakivo31 |
| 6 | 工人 | 192.168.101.32 | docker-nakivo32 |
部分指令與在 Ubuntu 上採用單主節點模型安裝 Kubernetes 的操作相同。因此,某些指令的說明將不再重複。您可以向上捲動本頁以查看相關指令的說明。
請執行以下操作,為所有機器(HA 代理、主節點和工作節點)做好安裝 Kubernetes 的準備:
- 設定靜態 IP 位址。
- 設定主機名稱。所有主機的名稱都必須解析為 IP 位址。
- 必須啟用 SSH 存取,並透過憑證進行設定。
- 必須停用交換空間。
在每台機器上開始安裝 Docker 之前,必須先執行這些步驟,這與前一節中說明如何在 Ubuntu 上使用單一主節點安裝 Kubernetes 的內容非常相似。準備好所有機器後,請前往 (192.168.101.19).
設定 HA Proxy 負載平衡器
HA Proxy 負載平衡器用於在 Kubernetes 節點之間分配入站流量。該負載平衡器部署在主節點之前。開啟 ha-proxy19 機器,並執行以下所示的操作。
安裝 cfssl
Cfssl(Cloud Flare SSL)是一套用於產生各種憑證(包括 TLS/SSL 憑證鏈)的工具組。
請從官方儲存庫下載二進位檔。
# wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64
# wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64
將下載的二進位檔案設為可執行。
# chmod +x cfssl*
將這些二進位檔案移至 /usr/local/bin/
# mv cfssl_linux-amd64 /usr/local/bin/cfssl
# mv cfssljson_linux-amd64 /usr/local/bin/cfssljson
請檢查已安裝的 cfssl 版本,以確認安裝是否成功。
# cfssl version
更新儲存庫樹。
# apt-get update
安裝 HA Proxy。
# apt-get install haproxy
建立及編輯版本 haproxy.cfg 檔案。
# vim /etc/haproxy/haproxy.cfg
請將這些行新增至此設定檔的末尾。
frontend kubernetes
bind 192.168.101.19:6443
option tcplog
mode tcp
default_backend kubernetes-master-nodes
backend kubernetes-master-nodes
mode tcp
balance roundrobin
option tcp-check
server docker-nakivo21 192.168.101.21:6443 check fall 3 rise 2
server docker-nakivo22 192.168.101.22:6443 check fall 3 rise 2
server docker-nakivo23 192.168.101.23:6443 check fall 3 rise 2

重新啟動服務。
# systemctl restart haproxy
產生 TSL 憑證
您可以繼續使用 HA 代理伺服器的控制台。建立名為 ca-config.json.
# vim ca-config.json
請將以下內容加入此設定檔中:
{
"signing": {
"default": {
"expiry": "8760h"
},
"profiles": {
"kubernetes": {
"usages": ["signing", "key encipherment", "server auth", "client auth"],
"expiry": "8760h"
}
}
}
}
建立憑證授權單位簽署請求設定檔。
# vim ca-csr.json
請將以下內容新增至此檔案:
{
“CN”: “Kubernetes”,
“key”: {
“algo”: “rsa”,
“size”: 2048
},
“names”: [
{
“C”: “GB”,
“L”: “London”,
“O”: “Kubernetes”,
“OU”: “CA”,
“ST”: “Nakivo”
}
]
}
其中:
C – 國家,例如 GB(大不列顛)。
L – 位置(例如城市或城鎮)。
O – 組織。
OU – 組織單位(例如,被定義為金鑰持有者的部門)。
ST – 州或省。
現在產生公鑰和私鑰。
# cfssl gencert -initca ca-csr.json | cfssljson -bare ca
請確認 ca-key.pem 以及 ca.pem 已產生金鑰。
# ls -al
為 Etcd 叢集建立憑證
Etcd 透過客戶端憑證進行驗證,以支援伺服器間/叢集間的通訊。您應為其中一個叢集成員準備一份 CA 憑證及一組已簽署的金鑰對。
建立憑證簽署請求設定檔。
# vim kubernetes-csr.json
{
"CN": "kubernetes",
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "GB",
"L": "London",
"O": "Kubernetes",
"OU": "Kubernetes",
"ST": "Nakivo"
}
]
}
接著,產生憑證和私密金鑰。
# cfssl gencert
-ca=ca.pem
-ca-key=ca-key.pem
-config=ca-config.json
-hostname=192.168.101.21,192.168.101.22,192.168.101.23,192.168.101.19,127.0.0.1,kubernetes.default
-profile=kubernetes kubernetes-csr.json |
cfssljson -bare kubernetes

請列出目錄中的檔案,以確認該 kubernetes-key.pem 以及 kubernetes.pem 檔案已生成。
# ls -al
將建立的憑證複製到每個節點。
# scp ca.pem kubernetes.pem kubernetes-key.pem kubernetes-user@192.168.101.21:~
# scp ca.pem kubernetes.pem kubernetes-key.pem kubernetes-user@192.168.101.22:~
# scp ca.pem kubernetes.pem kubernetes-key.pem kubernetes-user@192.168.101.23:~
# scp ca.pem kubernetes.pem kubernetes-key.pem kubernetes-user@192.168.101.31:~
# scp ca.pem kubernetes.pem kubernetes-key.pem kubernetes-user@192.168.101.32:~
# scp ca.pem kubernetes.pem kubernetes-key.pem kubernetes-user@192.168.101.33:~
在哪裡 ~ 是的根目錄 kubernetes-user 在 Ubuntu 主機上。

為安裝 Kubernetes 做好 Ubuntu 節點的準備
請在所有主節點和工作節點上執行本節所示的指令。在將納入 Kubernetes 叢集的 Ubuntu 機器上安裝 Docker,然後安裝 Kubernetes。讓我們從準備 192.168.101.21 主節點。
安裝 Docker。
# apt-get install apt-transport-https ca-certificates curl software-properties-common
# curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
# add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable"
# apt-get update
# apt-get install docker-ce
Docker 已安裝完成。kubeadm、kublet 和 kubectl 是於 Ubuntu 上安裝 Kubernetes 所必需的 Kubernetes 組件。
安裝 Kubernetes 組件 – kubeadm、kublet 和 kubectl。
# curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
# echo 'deb http://apt.kubernetes.io/ kubernetes-xenial main' | sudo tee /etc/apt/sources.list.d/kubernetes.list
# apt-get update
# apt-get install -y kubelet kubeadm kubectl
在準備好所有節點並安裝 Docker、kubelet、kubeadm 和 kubectl 之後,您必須在主節點上安裝並設定 etcd。
在 Ubuntu 主節點上安裝並設定 etcd
Etcd 是一個具備一致性與高可用性的儲存系統,旨在用於儲存金鑰以及備份所有叢集資料。在配置具有多個主節點的高可用性 Kubernetes 叢集之前,必須先設定 etcd 叢集。讓我們從配置 192.168.101.21 主節點。
Installing and configuring etcd on the 192.168.101.21 machine.
建立 etcd 的配置目錄。
# mkdir /etc/etcd /var/lib/etcd
前往已複製憑證的目錄。此處為 kubernetes 使用者的家目錄,在本例中為 – /home/kubernetes-user/
將憑證複製到 etcd 配置目錄中。
# cp ca.pem kubernetes.pem kubernetes-key.pem /etc/etcd
請確認檔案已成功複製。
# ls -al /etc/etcd
返回上一層目錄
# cd -
從儲存庫下載 etcd 二進位檔。
# wget https://github.com/coreos/etcd/releases/download/v3.3.9/etcd-v3.3.9-linux-amd64.tar.gz
解壓縮 etcd 壓縮檔。
# tar xvzf etcd-v3.3.9-linux-amd64.tar.gz
現在將 etcd 二進位檔案移動到 /usr/local/bin/
# mv etcd-v3.3.9-linux-amd64/etcd* /usr/local/bin/
建立一個 etcd systemd 單元檔案。
# vim /etc/systemd/system/etcd.service
請將以下字串加入此檔案中。
[Unit]
Description=etcd
Documentation=https://github.com/coreos
[Service]
ExecStart=/usr/local/bin/etcd
--name 192.168.101.21
--cert-file=/etc/etcd/kubernetes.pem
--key-file=/etc/etcd/kubernetes-key.pem
--peer-cert-file=/etc/etcd/kubernetes.pem
--peer-key-file=/etc/etcd/kubernetes-key.pem
--trusted-ca-file=/etc/etcd/ca.pem
--peer-trusted-ca-file=/etc/etcd/ca.pem
--peer-client-cert-auth
--client-cert-auth
--initial-advertise-peer-urls https://192.168.101.21:2380
--listen-peer-urls https://192.168.101.21:2380
--listen-client-urls https://192.168.101.21:2379,http://127.0.0.1:2379
--advertise-client-urls https://192.168.101.21:2379
--initial-cluster-token etcd-cluster-0
--initial-cluster 192.168.101.21=https://192.168.101.21:2380,192.168.101.22=https://192.168.101.22:2380,192.168.101.23=https://192.168.101.23:2380
--initial-cluster-state new
--data-dir=/var/lib/etcd
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
重新載入 systemd 管理員的設定,以從檔案系統載入已變更的設定並重新產生依賴關係樹。
# systemctl daemon-reload
讓 etcd 在開機時啟動。
# systemctl enable etcd
啟動 etcd。
# systemctl start etcd
在第二個主節點上執行相同的操作(docker-nakivo22 – 192.168.101.21 以及 docker-nakivo23 – 192.168.101.22). 這些主節點所需操作的唯一差異在於編輯版本 etcd.service 設定檔。為每個其他主節點定義正確的 IP 位址。例如,該 etcd.service 第二個主節點的設定檔必須如下所示(192.168.101.22) 當前的 Kubernetes 測試實驗室。
[Unit]
Description=etcd
Documentation=https://github.com/coreos
[Service]
ExecStart=/usr/local/bin/etcd
--name 192.168.101.22
--cert-file=/etc/etcd/kubernetes.pem
--key-file=/etc/etcd/kubernetes-key.pem
--peer-cert-file=/etc/etcd/kubernetes.pem
--peer-key-file=/etc/etcd/kubernetes-key.pem
--trusted-ca-file=/etc/etcd/ca.pem
--peer-trusted-ca-file=/etc/etcd/ca.pem
--peer-client-cert-auth
--client-cert-auth
--initial-advertise-peer-urls https://192.168.101.22:2380
--listen-peer-urls https://192.168.101.22:2380
--listen-client-urls https://192.168.101.22:2379,http://127.0.0.1:2379
--advertise-client-urls https://192.168.101.22:2379
--initial-cluster-token etcd-cluster-0
--initial-cluster 192.168.101.21=https://192.168.101.21:2380,192.168.101.22=https://192.168.101.22:2380,192.168.101.23=https://192.168.101.23:2380
--initial-cluster-state new
--data-dir=/var/lib/etcd
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
初始化 Kubernetes 高可用性叢集中的主節點
現在,您可以初始化安裝於 Ubuntu 機器上的 Kubernetes 高可用性 (HA) 叢集中的主節點。
正在初始化主節點 192.168.101.21
在第一個主節點上,執行以下所述的操作。
建立 kubeadm 的 YAML 配置檔。
# vim config.yaml
請將配置參數新增至此檔案:
apiVersion: kubeadm.k8s.io/v1alpha3
kind: ClusterConfiguration
kubernetesVersion: stable
apiServerCertSANs:
- 192.168.101.19
controlPlaneEndpoint: "192.168.101.19:6443"
etcd:
external:
endpoints:
- https://192.168.101.21:2379
- https://192.168.101.22:2379
- https://192.168.101.23:2379
caFile: /etc/etcd/ca.pem
certFile: /etc/etcd/kubernetes.pem
keyFile: /etc/etcd/kubernetes-key.pem
networking:
podSubnet: 10.244.0.0/16
apiServerExtraArgs:
apiserver-count: "3"
定義為 podSubnet(10.244.0.0/16)的網路必須與 kube-flannel.yml 檔案。
將 Ubuntu 機器初始化為主節點。
# kubeadm init --config=config.yaml
有時您可能會看到關於舊版配置檔案的警告:
您的配置檔案使用了已廢棄的 API 規範:"kubeadm.k8s.io/v1alpha3"。請使用 ‘kubeadm config migrate –old-config old.yaml –new-config new.yaml’,此指令會採用較新的 API 版本,生成新的、相似的規範。
使用以下指令更新配置檔案的版本:
# kubeadm config migrate --old-config config.yaml --new-config config1.yaml

若 etcd 未在運行狀態下,當您初始化多主節點 Kubernetes 叢集的節點時,可能會發生另一種錯誤:
[ERROR ExternalEtcdVersion]: 取得 https://192.168.101.21:2379/版本:撥號 tcp 192.168.101.21:2379:連線:連線遭拒

請檢查您的 etcd 正在執行。您可以執行 etcd 手動:
# systemctl start etcd
在 Ubuntu 系統上運行的 Kubernetes 叢集中,主節點初始化成功後,您會看到如螢幕截圖所示的以下訊息。

成功執行此指令後的輸出內容包含如何開始使用您的叢集的提示,以及包含將節點加入叢集所需憑證和憑證雜湊值的指令。請將這些重要字串儲存起來,因為您很快就會用到它們。這些字串在螢幕截圖中以黃色標示,並複製於下方。
現在您可以透過複製憑證授權單位,將任意數量的控制平面節點加入系統
並在每個節點上設定服務帳戶金鑰,然後以 root 身分執行以下指令:
kubeadm join 192.168.101.19:6443 --token sxm34y.p4rn4328vne0iihf
--discovery-token-ca-cert-hash sha256:bf3887f1565fcd48ff696da98a761ac1b70c6d38ba0ba3e4b1bf573000a302ca
--experimental-control-plane
接著,您可以透過在每個工作節點上以 root 身分執行以下指令,將任意數量的節點加入系統:
kubeadm join 192.168.101.19:6443 --token sxm34y.p4rn4328vne0iihf
--discovery-token-ca-cert-hash sha256:bf3887f1565fcd48ff696da98a761ac1b70c6d38ba0ba3e4b1bf573000a302ca
執行以下指令,開始在叢集中使用已初始化的節點。
# mkdir -p $HOME/.kube
# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
# sudo chown $(id -u):$(id -g) $HOME/.kube/config
檢查已加入叢集的節點。
# kubectl get nodes

將憑證複製到另外兩個主節點
# scp -r /etc/kubernetes/pki kubernetes-user@192.168.101.22:~
# scp -r /etc/kubernetes/pki kubernetes-user@192.168.101.23:~
正在初始化主節點 192.168.101.22
在第二個主節點(192.168.101.22)上執行以下指令:
移除 apiserver.crt 以及 apiserver.key 位於主目錄中的(~) 的 kubernetes-user.
$ rm ~/pki/apiserver.*
將儲存於家目錄中的憑證移至 /etc/kubernetes/ 目錄。
$ sudo mv ~/pki /etc/kubernetes/
建立 kubeadm 的配置 YAML 檔案。
# vim config.yaml
此 YAML 檔案的內容與第一個主節點相同(192.168.101.21)。請參閱上方的第一個主節點初始化設定。您可以複製已在您 Ubuntu 機器上安裝的 Kubernetes HA 叢集的第一個主節點所使用的已建立檔案。
初始化第二個主節點。
# kubeadm config migrate --old-config config.yaml --new-config config1.yaml
# kubeadm init --config=config1.yaml
輸出內容與 Kubernetes 高可用性叢集中的第一個主節點初始化完成後所顯示的輸出內容相同:

同樣地,執行以下指令以開始在叢集中使用已初始化的節點。
# mkdir -p $HOME/.kube
# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
# sudo chown $(id -u):$(id -g) $HOME/.kube/config
檢查已加入叢集的節點。
# kubectl get nodes

三台主節點中有兩台已加入叢集。尚有一台主節點待加入。
正在初始化第三個(192.168.101.23)主節點
請重複您用於初始化叢集中的第二個節點(192.168.101.22)的相同步驟。
請務必記下主節點初始化完成後顯示的、用於將節點加入叢集的包含憑證和雜湊值的指令。
確認所有三個主節點均已成功加入叢集。
# kubectl get nodes
安裝 Flannel 以解決 Kubernetes 中主節點的"NotReady"狀態
現在來安裝 Flannel。與第一個範例不同,該範例教您如何在 Ubuntu 上安裝 Kubernetes 以建立單主節點叢集;在此範例中,我們將透過 YAML 檔案來安裝 Flannel。
執行此指令以安裝 Flannel 並修正 尚未準備好 由於尚未配置覆蓋網路,因此顯示的節點狀態。建立 kube-flannel.yaml 例如,在第一個主節點上使用 vim 文字編輯器編輯檔案。
# kubectl apply -f kube-flannel.yml
請記住在 config.yaml 檔案。網路位址必須與 kube-flannel.yaml 檔案。
檢查您的節點及其狀態。
# kubectl get nodes

現在所有主節點都運作正常。
將工作節點新增至叢集
初始化所有主節點後,即可將工作節點新增至您的 Kubernetes 叢集。現在讓我們新增第一個工作節點(192.168.101.31) 加入部署於 Ubuntu 機器上的 HA Kubernetes 叢集。請使用主節點初始化完成後顯示的指令(即包含 token 和 hash 的指令),讓工作節點加入叢集。在 192.168.101.31 機器。
# kubeadm join 192.168.101.19:6443 --token kxl1gf.6ddalutd60n0ez45
--discovery-token-ca-cert-hash sha256:bf3887f1565fcd48ff696da98a761ac1b70c6d38ba0ba3e4b1bf573000a302ca
檢查 Kubernetes HA 叢集的節點,以確認工作節點已成功加入。現在您也可以在節點清單中看到 HA Proxy 機器。
# kubectl get nodes

同樣地,請將其他工作節點新增至安裝於 Ubuntu 機器上的 Kubernetes 高可用性叢集。您可以根據需求隨時新增更多工作節點。至此,今天的教學就結束了。
結論
在 Ubuntu 上安裝 Kubernetes 並不像乍看之下那樣困難。雖然部署 Kubernetes 叢集需要花費一些功夫,但最終您將獲得許多優勢,例如更簡便的集中式管理、高度可擴展性以及負載平衡。 最簡單的 Kubernetes 部署類型是單主節點部署——您應在包含主節點和工作節點的 Ubuntu 節點上安裝 Kubernetes。
若您需要更可靠的基础架構來執行容器化應用程式,請考慮部署多主節點 Kubernetes,即所謂的 Kubernetes 高可用性叢集。此類 Kubernetes 部署可消除單點故障,即使部分主節點發生故障,您的叢集仍能持續運作。
無論採用何種部署類型,您都必須設定 SSH 存取權限、設定靜態 IP 位址與主機名稱、安裝 Docker、停用交換分割區,最後安裝 Kubernetes 組件(例如 kubeadm、kubectl、kubelet),並為覆蓋網路設定 Flannel。若要部署高可用性 Kubernetes 叢集,您還需在獨立機器上設定 HA Proxy、產生憑證,並設定 etcd 叢集。 配置 Kubernetes、建立部署以及執行 Pod 的大部分步驟,可透過兩種方法完成:手動執行命令列介面提供的指令,或使用 YAML 配置檔案。使用 YAML 檔案可建立更複雜的結構,並使管理流程更加便利。
您可以在 Ubuntu 上安裝 Kubernetes,無論是實體機器或虛擬機器皆可。若您的 Kubernetes 安裝於 vSphere 環境中的虛擬機器上,您可以透過以下方式進行額外防護: VMware 高可用性叢集 並具有容錯特點。本文探討的 Kubernetes 部署邏輯,同樣適用於在其他 Linux 發行版上安裝 Kubernetes。