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

2022-06-08 09:06 更新

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

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

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

如果你在安裝 HA 集群時遇到問題,請在 kubeadm 問題跟蹤里向我們提供反饋。

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

在開始之前

根據(jù)集群控制平面所選擇的拓撲結(jié)構(gòu)不同,準備工作也有所差異:

  • 堆疊(Stacked) etcd 拓撲
  • 需要準備:

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

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

    還需要準備:

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

容器鏡像

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

命令行 

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

這兩種方法的第一步

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

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

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

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

  4. 將其余控制平面節(jié)點添加到負載均衡器目標組。

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

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

  1. 初始化控制平面:
  2. sudo kubeadm init --control-plane-endpoint "LOAD_BALANCER_DNS:LOAD_BALANCER_PORT" --upload-certs
    
    • 你可以使用 ?--kubernetes-version? 標志來設(shè)置要使用的 Kubernetes 版本。 建議將 kubeadm、kebelet、kubectl 和 Kubernetes 的版本匹配。
    • 這個 ?--control-plane-endpoint? 標志應(yīng)該被設(shè)置成負載均衡器的地址或 DNS 和端口。
    • 這個 ?--upload-certs? 標志用來將在所有控制平面實例之間的共享證書上傳到集群。
    Note: 標志 ?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 沒有。通過傳遞 ?--pod-network-cidr? 標志添加 pod CIDR,或者你可以使用 kubeadm 配置文件,在 ?ClusterConfiguration ?的 ?networking ?對象下設(shè)置 ?podSubnet ?字段。
    • 輸出類似于:
    • ...
      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ù)制到文本文件。 稍后你將需要它來將控制平面節(jié)點和工作節(jié)點加入集群。
    • 當(dāng)使用 ?--upload-certs? 調(diào)用 ?kubeadm init? 時,主控制平面的證書被加密并上傳到 ?kubeadm-certs? Secret 中。
    • 要重新上傳證書并生成新的解密密鑰,請在已加入集群節(jié)點的控制平面上使用以下命令:
    • sudo kubeadm init phase upload-certs --upload-certs
      
    • 你還可以在 ?init ?期間指定自定義的 ?--certificate-key?,以后可以由 ?join ?使用。 要生成這樣的密鑰,可以使用以下命令:
    • kubeadm certs certificate-key
      

    Note: ?kubeadm-certs? Secret 和解密密鑰會在兩個小時后失效。

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

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

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

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

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

對于每個其他控制平面節(jié)點,你應(yīng)該:

  • 執(zhí)行先前由第一個節(jié)點上的 ?kubeadm init? 輸出提供給你的 join 命令。 它看起來應(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
    
    • 這個 ?--control-plane? 標志通知 ?kubeadm join? 創(chuàng)建一個新的控制平面。
    • ?--certificate-key ...? 將導(dǎo)致從集群中的 ?kubeadm-certs? Secret 下載控制平面證書并使用給定的密鑰進行解密。

外部 etcd 節(jié)點

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

設(shè)置 ectd 集群

  1. 按照下文 去設(shè)置 etcd 集群。
  2. 根據(jù)本章-手動證書分發(fā) 的描述配置 SSH。
  3. 將以下文件從集群中的任何 etcd 節(jié)點復(fù)制到第一個控制平面節(jié)點:
  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}":
    • 用第一臺控制平面機的 ?user@host? 替換 ?CONTROL_PLANE ?的值。

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

  • 用以下內(nèi)容創(chuàng)建一個名為 ?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 需要一個 ?etcd ?的 ?external ?對象下帶有 etcd 端點的配置文件。 如果是內(nèi)部 etcd,是自動管理的。

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

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

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

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

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

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

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

安裝工作節(jié)點

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

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

手動證書分發(fā) 

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

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

如果要在單獨的一臺計算機控制所有節(jié)點,則需要 SSH。

  1. 在你的主設(shè)備上啟用 ssh-agent,要求該設(shè)備能訪問系統(tǒng)中的所有其他節(jié)點:
  2. eval $(ssh-agent)
    
  3. 將 SSH 身份添加到會話中:
  4. ssh-add ~/.ssh/path_to_private_key
    
  5. 檢查節(jié)點間的 SSH 以確保連接是正常運行的
    • SSH 到任何節(jié)點時,請確保添加 ?-A? 標志:
    • ssh -A 10.0.0.7
      
    • 當(dāng)在任何節(jié)點上使用 sudo 時,請確保保持環(huán)境變量設(shè)置,以便 SSH 轉(zhuǎn)發(fā)能夠正常工作:
    • sudo -E -s
      
  6. 在所有節(jié)點上配置 SSH 之后,你應(yīng)該在運行過 ?kubeadm init? 命令的第一個 控制平面節(jié)點上運行以下腳本。 該腳本會將證書從第一個控制平面節(jié)點復(fù)制到另一個控制平面節(jié)點:
  7. 在以下示例中,用其他控制平面節(jié)點的 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ù)制上面列表中的證書。kubeadm 將負責(zé)生成其余證書以及加入控制平面實例所需的 SAN。 如果你錯誤地復(fù)制了所有證書,由于缺少所需的 SAN,創(chuàng)建其他節(jié)點可能會失敗。

  8. 然后,在每個即將加入集群的控制平面節(jié)點上,你必須先運行以下腳本,然后 再運行 ?kubeadm join?。 該腳本會將先前復(fù)制的證書從主目錄移動到 ?/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)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號