Kubernetes 利用kubeadm創(chuàng)建高可用集群

2022-06-08 09:06 更新

利用 kubeadm 創(chuàng)建高可用集群

本文講述了使用 kubeadm 設(shè)置一個(gè)高可用的 Kubernetes 集群的兩種不同方式:

  • 使用具有堆疊的控制平面節(jié)點(diǎn)。這種方法所需基礎(chǔ)設(shè)施較少。etcd 成員和控制平面節(jié)點(diǎn)位于同一位置。
  • 使用外部集群。這種方法所需基礎(chǔ)設(shè)施較多??刂破矫娴墓?jié)點(diǎn)和 etcd 成員是分開(kāi)的。

如果你在安裝 HA 集群時(shí)遇到問(wèn)題,請(qǐng)?jiān)?nbsp;kubeadm 問(wèn)題跟蹤里向我們提供反饋。

Caution: 這篇文檔沒(méi)有講述在云提供商上運(yùn)行集群的問(wèn)題。在云環(huán)境中,此處記錄的方法不適用于類(lèi)型為 LoadBalancer 的服務(wù)對(duì)象,或者具有動(dòng)態(tài)的 PersistentVolumes。

在開(kāi)始之前

根據(jù)集群控制平面所選擇的拓?fù)浣Y(jié)構(gòu)不同,準(zhǔn)備工作也有所差異:

  • 堆疊(Stacked) etcd 拓?fù)?/li>

    需要準(zhǔn)備:

    • 配置滿(mǎn)足 kubeadm 的最低要求 的三臺(tái)機(jī)器作為控制面節(jié)點(diǎn)。奇數(shù)臺(tái)控制平面節(jié)點(diǎn)有利于機(jī)器故障或者網(wǎng)絡(luò)分區(qū)時(shí)進(jìn)行重新選主。
      • 機(jī)器已經(jīng)安裝好容器運(yùn)行時(shí),并正常運(yùn)行
    • 配置滿(mǎn)足 kubeadm 的最低要求 的三臺(tái)機(jī)器作為工作節(jié)點(diǎn)
      • 機(jī)器已經(jīng)安裝好容器運(yùn)行時(shí),并正常運(yùn)行
    • 在集群中,確保所有計(jì)算機(jī)之間存在全網(wǎng)絡(luò)連接(公網(wǎng)或私網(wǎng))
    • 在所有機(jī)器上具有 sudo 權(quán)限
      • 可以使用其他工具;本教程以 ?sudo ?舉例
    • 從某臺(tái)設(shè)備通過(guò) SSH 訪(fǎng)問(wèn)系統(tǒng)中所有節(jié)點(diǎn)的能力
    • 所有機(jī)器上已經(jīng)安裝 ?kubeadm ?和 ?kubelet?
  • 外部 etcd 拓?fù)?/li>

    需要準(zhǔn)備:

    • 配置滿(mǎn)足 kubeadm 的最低要求 的三臺(tái)機(jī)器作為控制面節(jié)點(diǎn)。奇數(shù)臺(tái)控制平面節(jié)點(diǎn)有利于機(jī)器故障或者網(wǎng)絡(luò)分區(qū)時(shí)進(jìn)行重新選主。
      • 機(jī)器已經(jīng)安裝好容器運(yùn)行時(shí),并正常運(yùn)行
    • 配置滿(mǎn)足 kubeadm 的最低要求 的三臺(tái)機(jī)器作為工作節(jié)點(diǎn)
      • 機(jī)器已經(jīng)安裝好容器運(yùn)行時(shí),并正常運(yùn)行
    • 在集群中,確保所有計(jì)算機(jī)之間存在全網(wǎng)絡(luò)連接(公網(wǎng)或私網(wǎng))
    • 在所有機(jī)器上具有 sudo 權(quán)限
      • 可以使用其他工具;本教程以 ?sudo ?舉例
    • 從某臺(tái)設(shè)備通過(guò) SSH 訪(fǎng)問(wèn)系統(tǒng)中所有節(jié)點(diǎn)的能力
    • 所有機(jī)器上已經(jīng)安裝 ?kubeadm ?和 ?kubelet ?

    還需要準(zhǔn)備:

    • 給 etcd 集群使用的另外三臺(tái)及以上機(jī)器。為了分布式一致性算法達(dá)到更好的投票效果,集群必須由奇數(shù)個(gè)節(jié)點(diǎn)組成。
      • 機(jī)器上已經(jīng)安裝 ?kubeadm ?和 ?kubelet?。
      • 機(jī)器上同樣需要安裝好容器運(yùn)行時(shí),并能正常運(yùn)行。

容器鏡像

每臺(tái)主機(jī)需要能夠從 Kubernetes 容器鏡像倉(cāng)庫(kù)( ?k8s.gcr.io? )讀取和拉取鏡像。 想要在無(wú)法拉取 Kubernetes 倉(cāng)庫(kù)鏡像的機(jī)器上部署高可用集群也是可行的。通過(guò)其他的手段保證主機(jī)上已經(jīng)有對(duì)應(yīng)的容器鏡像即可。

命令行 

一旦集群創(chuàng)建成功,需要在 PC 上安裝 kubectl 用于管理 Kubernetes。為了方便故障排查,也可以在每個(gè)控制平面節(jié)點(diǎn)上安裝 ?kubectl?。

這兩種方法的第一步

為 kube-apiserver 創(chuàng)建負(fù)載均衡器

Note: 使用負(fù)載均衡器需要許多配置。你的集群搭建可能需要不同的配置。 下面的例子只是其中的一方面配置。

  1. 創(chuàng)建一個(gè)名為 kube-apiserver 的負(fù)載均衡器解析 DNS。
    • 在云環(huán)境中,應(yīng)該將控制平面節(jié)點(diǎn)放置在 TCP 轉(zhuǎn)發(fā)負(fù)載平衡后面。 該負(fù)載均衡器將流量分配給目標(biāo)列表中所有運(yùn)行狀況良好的控制平面節(jié)點(diǎn)。 API 服務(wù)器的健康檢查是在 kube-apiserver 的監(jiān)聽(tīng)端口(默認(rèn)值 ?:6443?) 上進(jìn)行的一個(gè) TCP 檢查。
    • 不建議在云環(huán)境中直接使用 IP 地址。
    • 負(fù)載均衡器必須能夠在 API 服務(wù)器端口上與所有控制平面節(jié)點(diǎn)通信。 它還必須允許其監(jiān)聽(tīng)端口的入站流量。
    • 確保負(fù)載均衡器的地址始終匹配 kubeadm 的 ?ControlPlaneEndpoint ?地址。
    • 閱讀軟件負(fù)載平衡選項(xiàng)指南 以獲取更多詳細(xì)信息。
  2. 添加第一個(gè)控制平面節(jié)點(diǎn)到負(fù)載均衡器并測(cè)試連接:
  3. nc -v LOAD_BALANCER_IP PORT
    

    由于 apiserver 尚未運(yùn)行,預(yù)期會(huì)出現(xiàn)一個(gè)連接拒絕錯(cuò)誤。 然而超時(shí)意味著負(fù)載均衡器不能和控制平面節(jié)點(diǎn)通信。 如果發(fā)生超時(shí),請(qǐng)重新配置負(fù)載均衡器與控制平面節(jié)點(diǎn)進(jìn)行通信。

  4. 將其余控制平面節(jié)點(diǎn)添加到負(fù)載均衡器目標(biāo)組。

使用堆控制平面和 etcd 節(jié)點(diǎn)

控制平面節(jié)點(diǎn)的第一步

  1. 初始化控制平面:
  2. sudo kubeadm init --control-plane-endpoint "LOAD_BALANCER_DNS:LOAD_BALANCER_PORT" --upload-certs
    
    • 你可以使用 ?--kubernetes-version? 標(biāo)志來(lái)設(shè)置要使用的 Kubernetes 版本。 建議將 kubeadm、kebelet、kubectl 和 Kubernetes 的版本匹配。
    • 這個(gè) ?--control-plane-endpoint? 標(biāo)志應(yīng)該被設(shè)置成負(fù)載均衡器的地址或 DNS 和端口。
    • 這個(gè) ?--upload-certs? 標(biāo)志用來(lái)將在所有控制平面實(shí)例之間的共享證書(shū)上傳到集群。
    Note: 標(biāo)志 ?kubeadm init?、?--config? 和 ?--certificate-key? 不能混合使用, 因此如果你要使用 kubeadm 配置,你必須在相應(yīng)的配置結(jié)構(gòu) (位于 ?InitConfiguration ?和 ?JoinConfiguration: controlPlane?)添加 ?certificateKey ?字段。
    Note: 一些 CNI 網(wǎng)絡(luò)插件如 Calico 需要 CIDR 例如 ?192.168.0.0/16? 和一些像 Weave 沒(méi)有。通過(guò)傳遞 ?--pod-network-cidr? 標(biāo)志添加 pod CIDR,或者你可以使用 kubeadm 配置文件,在 ?ClusterConfiguration ?的 ?networking ?對(duì)象下設(shè)置 ?podSubnet ?字段。
    • 輸出類(lèi)似于:
    • ...
      You can now join any number of control-plane node by running the following command on each as a root:
      kubeadm join 192.168.0.200:6443 --token 9vr73a.a8uxyaju799qwdjv --discovery-token-ca-cert-hash sha256:7c2e69131a36ae2a042a339b33381c6d0d43887e2de83720eff5359e26aec866 --control-plane --certificate-key f8902e114ef118304e561c3ecd4d0b543adc226b7a07f675f56564185ffe0c07
      
      Please note that the certificate-key gives access to cluster sensitive data, keep it secret!
      As a safeguard, uploaded-certs will be deleted in two hours; If necessary, you can use kubeadm init phase upload-certs to reload certs afterward.
      
      Then you can join any number of worker nodes by running the following on each as root:
        kubeadm join 192.168.0.200:6443 --token 9vr73a.a8uxyaju799qwdjv --discovery-token-ca-cert-hash sha256:7c2e69131a36ae2a042a339b33381c6d0d43887e2de83720eff5359e26aec866
    • 將此輸出復(fù)制到文本文件。 稍后你將需要它來(lái)將控制平面節(jié)點(diǎn)和工作節(jié)點(diǎn)加入集群。
    • 當(dāng)使用 ?--upload-certs? 調(diào)用 ?kubeadm init? 時(shí),主控制平面的證書(shū)被加密并上傳到 ?kubeadm-certs? Secret 中。
    • 要重新上傳證書(shū)并生成新的解密密鑰,請(qǐng)?jiān)谝鸭尤爰汗?jié)點(diǎn)的控制平面上使用以下命令:
    • sudo kubeadm init phase upload-certs --upload-certs
      
    • 你還可以在 ?init ?期間指定自定義的 ?--certificate-key?,以后可以由 ?join ?使用。 要生成這樣的密鑰,可以使用以下命令:
    • kubeadm certs certificate-key
      

    Note: ?kubeadm-certs? Secret 和解密密鑰會(huì)在兩個(gè)小時(shí)后失效。

    Caution: 正如命令輸出中所述,證書(shū)密鑰可訪(fǎng)問(wèn)集群敏感數(shù)據(jù)。請(qǐng)妥善保管!

  3. 應(yīng)用你所選擇的 CNI 插件:安裝 CNI 驅(qū)動(dòng)。如果適用,請(qǐng)確保配置與 kubeadm 配置文件中指定的 Pod CIDR 相對(duì)應(yīng)。
  4. Note: 在進(jìn)行下一步之前,必須選擇并部署合適的網(wǎng)絡(luò)插件。 否則集群不會(huì)正常運(yùn)行。

  5. 輸入以下內(nèi)容,并查看控制平面組件的 Pods 啟動(dòng):
  6. kubectl get pod -n kube-system -w
    

其余控制平面節(jié)點(diǎn)的步驟 

Note: 從 kubeadm 1.15 版本開(kāi)始,你可以并行加入多個(gè)控制平面節(jié)點(diǎn)。 在此版本之前,你必須在第一個(gè)節(jié)點(diǎn)初始化后才能依序的增加新的控制平面節(jié)點(diǎn)。

對(duì)于每個(gè)其他控制平面節(jié)點(diǎn),你應(yīng)該:

  • 執(zhí)行先前由第一個(gè)節(jié)點(diǎn)上的 ?kubeadm init? 輸出提供給你的 join 命令。 它看起來(lái)應(yīng)該像這樣:
  • sudo kubeadm join 192.168.0.200:6443 --token 9vr73a.a8uxyaju799qwdjv --discovery-token-ca-cert-hash sha256:7c2e69131a36ae2a042a339b33381c6d0d43887e2de83720eff5359e26aec866 --control-plane --certificate-key f8902e114ef118304e561c3ecd4d0b543adc226b7a07f675f56564185ffe0c07
    
    • 這個(gè) ?--control-plane? 標(biāo)志通知 ?kubeadm join? 創(chuàng)建一個(gè)新的控制平面。
    • ?--certificate-key ...? 將導(dǎo)致從集群中的 ?kubeadm-certs? Secret 下載控制平面證書(shū)并使用給定的密鑰進(jìn)行解密。

外部 etcd 節(jié)點(diǎn)

使用外部 etcd 節(jié)點(diǎn)設(shè)置集群類(lèi)似于用于堆疊 etcd 的過(guò)程, 不同之處在于你應(yīng)該首先設(shè)置 etcd,并在 kubeadm 配置文件中傳遞 etcd 信息。

設(shè)置 ectd 集群

  1. 按照下文 去設(shè)置 etcd 集群。
  2. 根據(jù)本章-手動(dòng)證書(shū)分發(fā) 的描述配置 SSH。
  3. 將以下文件從集群中的任何 etcd 節(jié)點(diǎn)復(fù)制到第一個(gè)控制平面節(jié)點(diǎn):
  4. export CONTROL_PLANE="ubuntu@10.0.0.7"
    scp /etc/kubernetes/pki/etcd/ca.crt "${CONTROL_PLANE}":
    scp /etc/kubernetes/pki/apiserver-etcd-client.crt "${CONTROL_PLANE}":
    scp /etc/kubernetes/pki/apiserver-etcd-client.key "${CONTROL_PLANE}":
    • 用第一臺(tái)控制平面機(jī)的 ?user@host? 替換 ?CONTROL_PLANE ?的值。

設(shè)置第一個(gè)控制平面節(jié)點(diǎn) 

  • 用以下內(nèi)容創(chuàng)建一個(gè)名為 ?kubeadm-config.yaml? 的文件:
  • ---
    apiVersion: kubeadm.k8s.io/v1beta3
    kind: ClusterConfiguration
    kubernetesVersion: stable
    controlPlaneEndpoint: "LOAD_BALANCER_DNS:LOAD_BALANCER_PORT" # change this (see below)
    etcd:
      external:
        endpoints:
          - https://ETCD_0_IP:2379 # change ETCD_0_IP appropriately
          - https://ETCD_1_IP:2379 # change ETCD_1_IP appropriately
          - https://ETCD_2_IP:2379 # change ETCD_2_IP appropriately
        caFile: /etc/kubernetes/pki/etcd/ca.crt
        certFile: /etc/kubernetes/pki/apiserver-etcd-client.crt
        keyFile: /etc/kubernetes/pki/apiserver-etcd-client.key

    Note: 這里的堆疊(stacked)etcd 和外部 etcd 之前的區(qū)別在于設(shè)置外部 etcd 需要一個(gè) ?etcd ?的 ?external ?對(duì)象下帶有 etcd 端點(diǎn)的配置文件。 如果是內(nèi)部 etcd,是自動(dòng)管理的。

  • 在你的集群中,將配置模板中的以下變量替換為適當(dāng)值:
    • ?LOAD_BALANCER_DNS?
    • ?LOAD_BALANCER_PORT?
    • ?ETCD_0_IP?
    • ?ETCD_1_IP?
    • ?ETCD_2_IP?

以下的步驟與設(shè)置內(nèi)置 etcd 的集群是相似的:

  1. 在節(jié)點(diǎn)上運(yùn)行 ?sudo kubeadm init --config kubeadm-config.yaml --upload-certs? 命令。
  2. 記下輸出的 join 命令,這些命令將在以后使用。
  3. 應(yīng)用你選擇的 CNI 插件。
  4. Note: 在進(jìn)行下一步之前,必須選擇并部署合適的網(wǎng)絡(luò)插件。 否則集群不會(huì)正常運(yùn)行。

其他控制平面節(jié)點(diǎn)的步驟

步驟與設(shè)置內(nèi)置 etcd 相同:

  • 確保第一個(gè)控制平面節(jié)點(diǎn)已完全初始化。
  • 使用保存到文本文件的 join 命令將每個(gè)控制平面節(jié)點(diǎn)連接在一起。 建議一次加入一個(gè)控制平面節(jié)點(diǎn)。
  • 不要忘記默認(rèn)情況下,?--certificate-key? 中的解密秘鑰會(huì)在兩個(gè)小時(shí)后過(guò)期。

列舉控制平面之后的常見(jiàn)任務(wù)

安裝工作節(jié)點(diǎn)

你可以使用之前存儲(chǔ)的 ?kubeadm init? 命令的輸出將工作節(jié)點(diǎn)加入集群中:

sudo kubeadm join 192.168.0.200:6443 --token 9vr73a.a8uxyaju799qwdjv --discovery-token-ca-cert-hash sha256:7c2e69131a36ae2a042a339b33381c6d0d43887e2de83720eff5359e26aec866

手動(dòng)證書(shū)分發(fā) 

如果你選擇不將 ?kubeadm init? 與 ?--upload-certs? 命令一起使用, 則意味著你將必須手動(dòng)將證書(shū)從主控制平面節(jié)點(diǎn)復(fù)制到 將要加入的控制平面節(jié)點(diǎn)上。

有許多方法可以實(shí)現(xiàn)這種操作。在下面的例子中我們使用 ?ssh ?和 ?scp?:

如果要在單獨(dú)的一臺(tái)計(jì)算機(jī)控制所有節(jié)點(diǎn),則需要 SSH。

  1. 在你的主設(shè)備上啟用 ssh-agent,要求該設(shè)備能訪(fǎng)問(wèn)系統(tǒng)中的所有其他節(jié)點(diǎn):
  2. eval $(ssh-agent)
    
  3. 將 SSH 身份添加到會(huì)話(huà)中:
  4. ssh-add ~/.ssh/path_to_private_key
    
  5. 檢查節(jié)點(diǎn)間的 SSH 以確保連接是正常運(yùn)行的
    • SSH 到任何節(jié)點(diǎn)時(shí),請(qǐng)確保添加 ?-A? 標(biāo)志:
    • ssh -A 10.0.0.7
      
    • 當(dāng)在任何節(jié)點(diǎn)上使用 sudo 時(shí),請(qǐng)確保保持環(huán)境變量設(shè)置,以便 SSH 轉(zhuǎn)發(fā)能夠正常工作:
    • sudo -E -s
      
  6. 在所有節(jié)點(diǎn)上配置 SSH 之后,你應(yīng)該在運(yùn)行過(guò) ?kubeadm init? 命令的第一個(gè) 控制平面節(jié)點(diǎn)上運(yùn)行以下腳本。 該腳本會(huì)將證書(shū)從第一個(gè)控制平面節(jié)點(diǎn)復(fù)制到另一個(gè)控制平面節(jié)點(diǎn):
  7. 在以下示例中,用其他控制平面節(jié)點(diǎn)的 IP 地址替換 ?CONTROL_PLANE_IPS?。

    USER=ubuntu # 可定制
    CONTROL_PLANE_IPS="10.0.0.7 10.0.0.8"
    for host in ${CONTROL_PLANE_IPS}; do
        scp /etc/kubernetes/pki/ca.crt "${USER}"@$host:
        scp /etc/kubernetes/pki/ca.key "${USER}"@$host:
        scp /etc/kubernetes/pki/sa.key "${USER}"@$host:
        scp /etc/kubernetes/pki/sa.pub "${USER}"@$host:
        scp /etc/kubernetes/pki/front-proxy-ca.crt "${USER}"@$host:
        scp /etc/kubernetes/pki/front-proxy-ca.key "${USER}"@$host:
        scp /etc/kubernetes/pki/etcd/ca.crt "${USER}"@$host:etcd-ca.crt
        scp /etc/kubernetes/pki/etcd/ca.key "${USER}"@$host:etcd-ca.key
    done

    Caution: 只需要復(fù)制上面列表中的證書(shū)。kubeadm 將負(fù)責(zé)生成其余證書(shū)以及加入控制平面實(shí)例所需的 SAN。 如果你錯(cuò)誤地復(fù)制了所有證書(shū),由于缺少所需的 SAN,創(chuàng)建其他節(jié)點(diǎn)可能會(huì)失敗。

  8. 然后,在每個(gè)即將加入集群的控制平面節(jié)點(diǎn)上,你必須先運(yùn)行以下腳本,然后 再運(yùn)行 ?kubeadm join?。 該腳本會(huì)將先前復(fù)制的證書(shū)從主目錄移動(dòng)到 ?/etc/kubernetes/pki?:
  9. USER=ubuntu # 可定制
    mkdir -p /etc/kubernetes/pki/etcd
    mv /home/${USER}/ca.crt /etc/kubernetes/pki/
    mv /home/${USER}/ca.key /etc/kubernetes/pki/
    mv /home/${USER}/sa.pub /etc/kubernetes/pki/
    mv /home/${USER}/sa.key /etc/kubernetes/pki/
    mv /home/${USER}/front-proxy-ca.crt /etc/kubernetes/pki/
    mv /home/${USER}/front-proxy-ca.key /etc/kubernetes/pki/
    mv /home/${USER}/etcd-ca.crt /etc/kubernetes/pki/etcd/ca.crt
    mv /home/${USER}/etcd-ca.key /etc/kubernetes/pki/etcd/ca.key


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

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)