如何在 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 代表”swapiness”的百分比。在此情況下,只有當 RAM 空間用盡時才會使用交換空間(預設情況下,當 RAM 佔用率超過 60% 時會使用交換空間)。
套用設定變更而不需重新開機。
$ 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 <<EOF >/etc/apt/sources.list.d/kubernetes.list
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”字串之後:
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 了。首先,您需要建立一個部署。部署(Deployment)是一種控制器概念,用於對 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 <service_name>
您也可以刪除一個 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
檢查 Pod。
# 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 時相同。因此,某些指令的說明將不再重複。您可以向上捲動本頁以查閱相關指令的說明。
請執行以下步驟,為所有機器(高可用性代理伺服器、主節點及工作節點)做好安裝 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 高可用性(HA)叢集中的第一個主節點初始化完成後所顯示的輸出內容相同:

同樣地,執行以下指令,即可開始在叢集中使用已初始化的節點。
# 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。