Kubernetes 使用kubeadm創(chuàng)建集群

2022-05-31 11:23 更新

使用 kubeadm 創(chuàng)建集群

使用 ?kubeadm?,你能創(chuàng)建一個符合最佳實踐的最小化 Kubernetes 集群。 事實上,你可以使用 ?kubeadm ?配置一個通過 Kubernetes 一致性測試的集群。 ?kubeadm ?還支持其他集群生命周期功能, 例如啟動引導令牌和集群升級。

kubeadm 工具很棒,如果你需要:

  • 一個嘗試 Kubernetes 的簡單方法。
  • 一個現(xiàn)有用戶可以自動設置集群并測試其應用程序的途徑。
  • 其他具有更大范圍的生態(tài)系統(tǒng)和/或安裝工具中的構(gòu)建模塊。

你可以在各種機器上安裝和使用 ?kubeadm?:筆記本電腦, 一組云服務器,Raspberry Pi 等。無論是部署到云還是本地, 你都可以將 ?kubeadm ?集成到預配置系統(tǒng)中,例如 Ansible 或 Terraform。

在開始之前

要遵循本指南,你需要:

  • 一臺或多臺運行兼容 deb/rpm 的 Linux 操作系統(tǒng)的計算機;例如:Ubuntu 或 CentOS。
  • 每臺機器 2 GB 以上的內(nèi)存,內(nèi)存不足時應用會受限制。
  • 用作控制平面節(jié)點的計算機上至少有2個 CPU。
  • 集群中所有計算機之間具有完全的網(wǎng)絡連接。你可以使用公共網(wǎng)絡或?qū)S镁W(wǎng)絡。

你還需要使用可以在新集群中部署特定 Kubernetes 版本對應的 ?kubeadm?。

Kubernetes 版本及版本偏差策略適用于 ?kubeadm ?以及整個 Kubernetes。 查閱該策略以了解支持哪些版本的 Kubernetes 和 ?kubeadm?。 該頁面是為 Kubernetes v1.24 編寫的。

?kubeadm ?工具的整體功能狀態(tài)為一般可用性(GA)。一些子功能仍在積極開發(fā)中。 隨著工具的發(fā)展,創(chuàng)建集群的實現(xiàn)可能會略有變化,但總體實現(xiàn)應相當穩(wěn)定。

Note: 根據(jù)定義,在 ?kubeadm alpha? 下的所有命令均在 alpha 級別上受支持。

目標

  • 安裝單個控制平面的 Kubernetes 集群
  • 在集群上安裝 Pod 網(wǎng)絡,以便你的 Pod 可以相互連通

操作指南

主機準備

在所有主機上安裝 容器運行時 和 kubeadm。

Note:
如果你已經(jīng)安裝了kubeadm,執(zhí)行 ?apt-get update && apt-get upgrade? 或 ?yum update? 以獲取 kubeadm 的最新版本。
升級時,kubelet 每隔幾秒鐘重新啟動一次, 在 crashloop 狀態(tài)中等待 kubeadm 發(fā)布指令。crashloop 狀態(tài)是正?,F(xiàn)象。 初始化控制平面后,kubelet 將正常運行。

準備所需的容器鏡像 

這個步驟是可選的,只適用于你希望 ?kubeadm init? 和 ?kubeadm join? 不去下載存放在 ?k8s.gcr.io? 上的默認的容器鏡像的情況。

當你在離線的節(jié)點上創(chuàng)建一個集群的時候,Kubeadm 有一些命令可以幫助你預拉取所需的鏡像。

Kubeadm 允許你給所需要的鏡像指定一個自定義的鏡像倉庫。

初始化控制平面節(jié)點

控制平面節(jié)點是運行控制平面組件的機器, 包括 etcd (集群數(shù)據(jù)庫) 和 API Server (命令行工具 kubectl 與之通信)。

  1. (推薦)如果計劃將單個控制平面 kubeadm 集群升級成高可用, 你應該指定 ?--control-plane-endpoint? 為所有控制平面節(jié)點設置共享端點。 端點可以是負載均衡器的 DNS 名稱或 IP 地址。
  2. 選擇一個 Pod 網(wǎng)絡插件,并驗證是否需要為 ?kubeadm init? 傳遞參數(shù)。 根據(jù)你選擇的第三方網(wǎng)絡插件,你可能需要設置 ?--pod-network-cidr? 的值。 
  3. (可選)?kubeadm ?試圖通過使用已知的端點列表來檢測容器運行時。 使用不同的容器運行時或在預配置的節(jié)點上安裝了多個容器運行時,請為 ?kubeadm init? 指定 ?--cri-socket? 參數(shù)。
  4. (可選)除非另有說明,否則 ?kubeadm ?使用與默認網(wǎng)關關聯(lián)的網(wǎng)絡接口來設置此控制平面節(jié)點 API server 的廣播地址。 要使用其他網(wǎng)絡接口,請為 ?kubeadm init? 設置 ?--apiserver-advertise-address=<ip-address>? 參數(shù)。 要部署使用 IPv6 地址的 Kubernetes 集群, 必須指定一個 IPv6 地址,例如 ?--apiserver-advertise-address=fd00::101?

要初始化控制平面節(jié)點,請運行:

kubeadm init <args>

關于 apiserver-advertise-address 和 ControlPlaneEndpoint 的注意事項 

?--apiserver-advertise-address? 可用于為控制平面節(jié)點的 API server 設置廣播地址, ?--control-plane-endpoint? 可用于為所有控制平面節(jié)點設置共享端點。

?--control-plane-endpoint? 允許 IP 地址和可以映射到 IP 地址的 DNS 名稱。 請與你的網(wǎng)絡管理員聯(lián)系,以評估有關此類映射的可能解決方案。

這是一個示例映射:

192.168.0.102 cluster-endpoint

其中 ?192.168.0.102? 是此節(jié)點的 IP 地址,?cluster-endpoint? 是映射到該 IP 的自定義 DNS 名稱。 這將允許你將 ?--control-plane-endpoint=cluster-endpoint? 傳遞給 ?kubeadm init?,并將相同的 DNS 名稱傳遞給 ?kubeadm join?。 稍后你可以修改 ?cluster-endpoint? 以指向高可用性方案中的負載均衡器的地址。

kubeadm 不支持將沒有 ?--control-plane-endpoint? 參數(shù)的單個控制平面集群轉(zhuǎn)換為高可用性集群。

更多信息

要再次運行 ?kubeadm init?,你必須首先卸載集群。

如果將具有不同架構(gòu)的節(jié)點加入集群, 請確保已部署的 DaemonSet 對這種體系結(jié)構(gòu)具有容器鏡像支持。

?kubeadm init? 首先運行一系列預檢查以確保機器 準備運行 Kubernetes。這些預檢查會顯示警告并在錯誤時退出。然后 ?kubeadm init? 下載并安裝集群控制平面組件。這可能會需要幾分鐘。 完成之后你應該看到:

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

You should now deploy a Pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  /docs/concepts/cluster-administration/addons/

You can now join any number of machines by running the following on each node
as root:

  kubeadm join <control-plane-host>:<control-plane-port> --token <token> --discovery-token-ca-cert-hash sha256:<hash>

要使非 root 用戶可以運行 kubectl,請運行以下命令, 它們也是 ?kubeadm init? 輸出的一部分:

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

或者,如果你是 ?root ?用戶,則可以運行:

export KUBECONFIG=/etc/kubernetes/admin.conf
Warning:
kubeadm 對 ?admin.conf? 中的證書進行簽名時,將其配置為 ?Subject: O = system:masters, CN = kubernetes-admin?。 ?system:masters? 是一個例外的、超級用戶組,可以繞過鑒權(quán)層(例如 RBAC)。 不要將 ?admin.conf? 文件與任何人共享,應該使用 ?kubeadm kubeconfig user? 命令為其他用戶生成 kubeconfig 文件,完成對他們的定制授權(quán)。

記錄 ?kubeadm init? 輸出的 ?kubeadm join? 命令。 你需要此命令將節(jié)點加入集群。

令牌用于控制平面節(jié)點和加入節(jié)點之間的相互身份驗證。 這里包含的令牌是密鑰。確保它的安全, 因為擁有此令牌的任何人都可以將經(jīng)過身份驗證的節(jié)點添加到你的集群中。 可以使用 ?kubeadm token? 命令列出,創(chuàng)建和刪除這些令牌。

安裝 Pod 網(wǎng)絡附加組件 

Caution:
本節(jié)包含有關網(wǎng)絡設置和部署順序的重要信息。 在繼續(xù)之前,請仔細閱讀所有建議。
你必須部署一個基于 Pod 網(wǎng)絡插件的 容器網(wǎng)絡接口 (CNI),以便你的 Pod 可以相互通信。 在安裝網(wǎng)絡之前,集群 DNS (CoreDNS) 將不會啟動。
  • 注意你的 Pod 網(wǎng)絡不得與任何主機網(wǎng)絡重疊: 如果有重疊,你很可能會遇到問題。 (如果你發(fā)現(xiàn)網(wǎng)絡插件的首選 Pod 網(wǎng)絡與某些主機網(wǎng)絡之間存在沖突, 則應考慮使用一個合適的 CIDR 塊來代替, 然后在執(zhí)行 ?kubeadm init? 時使用 ?--pod-network-cidr? 參數(shù)并在你的網(wǎng)絡插件的 YAML 中替換它)。
  • 默認情況下,?kubeadm ?將集群設置為使用和強制使用 RBAC(基于角色的訪問控制)。 確保你的 Pod 網(wǎng)絡插件支持 RBAC,以及用于部署它的 manifests 也是如此。
  • 如果要為集群使用 IPv6(雙協(xié)議棧或僅單協(xié)議棧 IPv6 網(wǎng)絡), 請確保你的 Pod 網(wǎng)絡插件支持 IPv6。 IPv6 支持已在 CNI v0.6.0 版本中添加。
Note: kubeadm 應該是與 CNI 無關的,對 CNI 驅(qū)動進行驗證目前不在我們的端到端測試范疇之內(nèi)。 如果你發(fā)現(xiàn)與 CNI 插件相關的問題,應在其各自的問題跟蹤器中記錄而不是在 kubeadm 或 kubernetes 問題跟蹤器中記錄。

一些外部項目為 Kubernetes 提供使用 CNI 的 Pod 網(wǎng)絡,其中一些還支持網(wǎng)絡策略。

你可以使用以下命令在控制平面節(jié)點或具有 kubeconfig 憑據(jù)的節(jié)點上安裝 Pod 網(wǎng)絡附加組件:

kubectl apply -f <add-on.yaml>

每個集群只能安裝一個 Pod 網(wǎng)絡。

安裝 Pod 網(wǎng)絡后,你可以通過在 ?kubectl get pods --all-namespaces? 輸出中檢查 CoreDNS Pod 是否 ?Running ?來確認其是否正常運行。 一旦 CoreDNS Pod 啟用并運行,你就可以繼續(xù)加入節(jié)點。

如果你的網(wǎng)絡無法正常工作或 CoreDNS 不在“運行中”狀態(tài),請查看 ?kubeadm ?的 故障排除指南。

托管節(jié)點標簽 

默認情況下,kubeadm 啟用 NodeRestriction 準入控制器來限制 kubelets 在節(jié)點注冊時可以應用哪些標簽。準入控制器文檔描述 kubelet ?--node-labels? 選項允許使用哪些標簽。 其中 ?node-role.kubernetes.io/control-plane? 標簽就是這樣一個受限制的標簽, kubeadm 在節(jié)點創(chuàng)建后使用特權(quán)客戶端手動應用此標簽。 你可以使用一個有特權(quán)的 kubeconfig,比如由 kubeadm 管理的 ?/etc/kubernetes/admin.conf?, 通過執(zhí)行 ?kubectl label? 來手動完成操作。

控制平面節(jié)點隔離

默認情況下,出于安全原因,你的集群不會在控制平面節(jié)點上調(diào)度 Pod。 如果你希望能夠在控制平面節(jié)點上調(diào)度 Pod,例如單機 Kubernetes 集群,請運行:

kubectl taint nodes --all node-role.kubernetes.io/control-plane- node-role.kubernetes.io/master-

輸出看起來像:

node "test-01" untainted

這將從任何擁有 ?node-role.kubernetes.io/control-plane? 和 ?node-role.kubernetes.io/master? 污點的節(jié)點上移除該污點。

包括控制平面節(jié)點,這意味著調(diào)度程序?qū)⒛軌蛟谌魏蔚胤秸{(diào)度 Pods。

Note: ?node-role.kubernetes.io/master? 污點已被廢棄,kubeadm 將在 1.25 版本中停止使用它。

加入節(jié)點

節(jié)點是你的工作負載(容器和 Pod 等)運行的地方。要將新節(jié)點添加到集群,請對每臺計算機執(zhí)行以下操作:

  • SSH 到機器
  • 成為 root (例如 ?sudo su -?)
  • 運行 ?kubeadm init? 輸出的命令,例如:
  • kubeadm join --token <token> <control-plane-host>:<control-plane-port> --discovery-token-ca-cert-hash sha256:<hash>
    

如果沒有令牌,可以通過在控制平面節(jié)點上運行以下命令來獲取令牌:

kubeadm token list

輸出類似于以下內(nèi)容:

TOKEN                    TTL  EXPIRES              USAGES           DESCRIPTION            EXTRA GROUPS
8ewj1p.9r9hcjoqgajrj4gi  23h  2018-06-12T02:51:28Z authentication,  The default bootstrap  system:
                                                   signing          token generated by     bootstrappers:
                                                                    'kubeadm init'.        kubeadm:
                                                                                           default-node-token

默認情況下,令牌會在 24 小時后過期。如果要在當前令牌過期后將節(jié)點加入集群, 則可以通過在控制平面節(jié)點上運行以下命令來創(chuàng)建新令牌:

kubeadm token create

輸出類似于以下內(nèi)容:

5didvk.d09sbcov8ph2amjw

如果你沒有 ?--discovery-token-ca-cert-hash? 的值,則可以通過在控制平面節(jié)點上執(zhí)行以下命令鏈來獲取它:

openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | \
   openssl dgst -sha256 -hex | sed 's/^.* //'

輸出類似于以下內(nèi)容:

8cb2de97839780a412b93877f8507ad6c94f73add17d5d7058e91741c9d5ec78

Note: 要為 ?<control-plane-host>:<control-plane-port>? 指定 IPv6 元組,必須將 IPv6 地址括在方括號中,例如:?[fd00::101]:2073?

輸出應類似于:

[preflight] Running pre-flight checks

... (log output of join workflow) ...

Node join complete:
* Certificate signing request sent to control-plane and response
  received.
* Kubelet informed of new secure connection details.

Run 'kubectl get nodes' on control-plane to see this machine join.

幾秒鐘后,當你在控制平面節(jié)點上執(zhí)行 ?kubectl get nodes?,你會注意到該節(jié)點出現(xiàn)在輸出中。

Note: 由于集群節(jié)點通常是按順序初始化的,CoreDNS Pods 很可能都運行在第一個控制面節(jié)點上。 為了提供更高的可用性,請在加入至少一個新節(jié)點后 使用 ?kubectl -n kube-system rollout restart deployment coredns? 命令,重新平衡 CoreDNS Pods。

(可選)從控制平面節(jié)點以外的計算機控制集群

為了使 kubectl 在其他計算機(例如筆記本電腦)上與你的集群通信, 你需要將管理員 kubeconfig 文件從控制平面節(jié)點復制到工作站,如下所示:

scp root@<control-plane-host>:/etc/kubernetes/admin.conf .
kubectl --kubeconfig ./admin.conf get nodes
Note:
上面的示例假定為 root 用戶啟用了 SSH 訪問。如果不是這種情況, 你可以使用 ?scp? 將 ?admin.conf? 文件復制給其他允許訪問的用戶。
admin.conf 文件為用戶提供了對集群的超級用戶特權(quán)。 該文件應謹慎使用。對于普通用戶,建議生成一個你為其授予特權(quán)的唯一證書。 你可以使用 ?kubeadm alpha kubeconfig user --client-name <CN>? 命令執(zhí)行此操作。 該命令會將 KubeConfig 文件打印到 STDOUT,你應該將其保存到文件并分發(fā)給用戶。 之后,使用 ?kubectl create (cluster)rolebinding? 授予特權(quán)。

(可選)將 API 服務器代理到本地主機

如果要從集群外部連接到 API 服務器,則可以使用 ?kubectl proxy?:

scp root@<control-plane-host>:/etc/kubernetes/admin.conf .
kubectl --kubeconfig ./admin.conf proxy

你現(xiàn)在可以在本地訪問 API 服務器 ?http://localhost:8001/api/v1?。

清理

如果你在集群中使用了一次性服務器進行測試,則可以關閉這些服務器,而無需進一步清理。你可以使用 ?kubectl config delete-cluster? 刪除對集群的本地引用。

但是,如果要更干凈地取消配置集群, 則應首先清空節(jié)點并確保該節(jié)點為空, 然后取消配置該節(jié)點。

刪除節(jié)點

使用適當?shù)膽{證與控制平面節(jié)點通信,運行:

kubectl drain <node name> --delete-emptydir-data --force --ignore-daemonsets

在刪除節(jié)點之前,請重置 ?kubeadm ?安裝的狀態(tài):

kubeadm reset

重置過程不會重置或清除 iptables 規(guī)則或 IPVS 表。如果你希望重置 iptables,則必須手動進行:

iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X

如果要重置 IPVS 表,則必須運行以下命令:

ipvsadm -C

現(xiàn)在刪除節(jié)點:

kubectl delete node <node name>

如果你想重新開始,只需運行 ?kubeadm init? 或 ?kubeadm join? 并加上適當?shù)膮?shù)。

清理控制平面

你可以在控制平面主機上使用 ?kubeadm reset? 來觸發(fā)盡力而為的清理。

版本偏差策略

雖然 kubeadm 允許所管理的組件有一定程度的版本偏差, 但是建議你將 kubeadm 的版本與控制平面組件、kube-proxy 和 kubelet 的版本相匹配。

kubeadm 中的 Kubernetes 版本偏差

kubeadm 可以與 Kubernetes 組件一起使用,這些組件的版本與 kubeadm 相同,或者比它大一個版本。 Kubernetes 版本可以通過使用 ?--kubeadm init? 的 ?--kubernetes-version? 標志或使用 ?--config? 時的 ?ClusterConfiguration.kubernetesVersion? 字段指定給 kubeadm。 這個選項將控制 kube-apiserver、kube-controller-manager、kube-scheduler 和 kube-proxy 的版本。

例如:

  • kubeadm 的版本為 1.24。
  • ?kubernetesVersion ?必須為 1.24 或者 1.23。

kubeadm 中 kubelet 的版本偏差

與 Kubernetes 版本類似,kubeadm 可以使用與 kubeadm 相同版本的 kubelet, 或者比 kubeadm 老一個版本的 kubelet。

例如:

  • kubeadm 的版本為 1.24
  • 主機上的 kubelet 版本必須為 1.24 或者 1.23

kubeadm 支持的 kubeadm 的版本偏差

kubeadm 命令在現(xiàn)有節(jié)點或由 kubeadm 管理的整個集群上的操作有一定限制。

如果新的節(jié)點加入到集群中,用于 ?kubeadm join? 的 kubeadm 二進制文件必須與用 ?kubeadm init? 創(chuàng)建集群或用 ?kubeadm upgrade? 升級同一節(jié)點時所用的 kubeadm 版本一致。 類似的規(guī)則適用于除了 ?kubeadm upgrade? 以外的其他 kubeadm 命令。

?kubeadm join? 的例子:

  • 使用 ?kubeadm init? 創(chuàng)建集群時使用版本為 1.24 的 kubeadm。
  • 加入的節(jié)點必須使用版本為 1.24 的 kubeadm 二進制文件。

對于正在升級的節(jié)點,所使用的的 kubeadm 必須與管理該節(jié)點的 kubeadm 具有相同的 MINOR 版本或比后者新一個 MINOR 版本。

?kubeadm upgrade? 的例子:

  • 用于創(chuàng)建或升級節(jié)點的 kubeadm 版本為 1.23。
  • 用于升級節(jié)點的 kubeadm 版本必須為 1.23 或 1.24。

局限性

集群彈性

此處創(chuàng)建的集群具有單個控制平面節(jié)點,運行單個 etcd 數(shù)據(jù)庫。 這意味著如果控制平面節(jié)點發(fā)生故障,你的集群可能會丟失數(shù)據(jù)并且可能需要從頭開始重新創(chuàng)建。

解決方法:

  • 定期備份 etcd。 kubeadm 配置的 etcd 數(shù)據(jù)目錄位于控制平面節(jié)點上的 ?/var/lib/etcd? 中。
  • 使用多個控制平面節(jié)點。你可以閱讀 可選的高可用性拓撲選擇集群拓撲提供的 高可用性。

平臺兼容性

kubeadm deb/rpm 軟件包和二進制文件是為 amd64、arm (32-bit)、arm64、ppc64le 和 s390x 構(gòu)建的遵循多平臺提案

從 v1.12 開始還支持用于控制平面和附加組件的多平臺容器鏡像。

只有一些網(wǎng)絡提供商為所有平臺提供解決方案。請查閱上方的網(wǎng)絡提供商清單或每個提供商的文檔以確定提供商是否支持你選擇的平臺。

Note:要為<control-plane-host>:<control-plane-port>指定IPv6元組,必須將IPv6地址括在方括號中,例如:[fd00::101]:2073


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號