天天看點

高可用 kubernetes 叢集部署實踐前言高可用 k8s 叢集架構使用 RKE 建構高可用 k8s 叢集總結參考資料

前言

Kubernetes(k8s) 憑借着其優良的架構,靈活的擴充能力,豐富的應用編排模型,成為了容器編排領域的事實标準。越來越多的企業擁抱這一趨勢,選擇 k8s 作為容器化應用的基礎設施,逐漸将自己的核心服務遷移到 k8s 之上。

可用性對基礎設施而言至關重要。各大雲計算廠商紛紛推出了高可用、可擴充的 k8s 托管服務,其中比較有代表性的有

Amazon EKS

Azure Kubernetes Service (AKS) Google Kubernetes Engine 阿裡雲容器服務 Kubernetes 版

等。

雖然公有雲托管的 k8s 服務百花齊放,但很多企業仍有自建叢集的需求。正是這樣的原因,促進了一大批出色的 k8s 叢集部署方案的誕生,他們的特點如下表所示。

部署方案 特點
Kubeadm

1. 官方出品的部署工具,提供了 k8s 叢集生命周期管理的領域知識。

2. 旨在成為更進階别工具的可組合建構塊。

Kubespray

1. 支援在裸機和 AWS、GCE、Azure 等衆多雲平台上部署 k8s。

2. 基于 Ansible Playbook 定義 k8s 叢集部署任務。

3. 支援大部分流行的 Linux 發行版。

Kops

1. 僅支援在 AWS、GCE 等少數雲平台上部署 k8s。

2. 建立在狀态同步模型上,用于 dry-run 和自動幂等性。

3. 能夠自動生成 Terraform 配置。

Rancher Kubernetes Engine(RKE) 1. 著名的開源企業級容器管理平台 Rancher

提供的輕量級 k8s 安裝工具。

2. 支援在裸機、虛拟機、公有雲上部署和管理 k8s 叢集。

上述方案中,RKE 在易用性和靈活性上占有優勢。本文接下來将介紹如何通過 RKE 部署一套高可用 k8s 叢集,文中使用的 RKE 版本為

v0.2.2

高可用 k8s 叢集架構

首先需要了解高可用 k8s 叢集的架構特點,下圖是官方推薦的高可用叢集架構圖。

高可用 kubernetes 叢集部署實踐前言高可用 k8s 叢集架構使用 RKE 建構高可用 k8s 叢集總結參考資料

其核心思想是讓 k8s master 節點中的各類元件具備高可用性,消除單點故障。

  • kube-apiserver - 對外暴露了 k8s API,是整個叢集的通路入口。由于 apiserver 本身無狀态,可以通過啟動多個執行個體并結合負載均衡器實作高可用。
  • etcd - 用于存儲 k8s 叢集的網絡配置和對象的狀态資訊,是整個叢集的資料中心。可以通過啟動奇數個 etcd 執行個體建立一個備援的,可靠的資料存儲層。
  • kube-scheduler - 為新建立的 pod 選擇一個供他們運作的節點。一個叢集隻能有一個活躍的 kube-scheduler 執行個體,可以同時啟動多個 kube-scheduler 并利用上司者選舉功能實作高可用。
  • kube-controller-manager - 叢集内部的管理控制中心。一個叢集隻能有一個活躍的 kube-controller-manager 執行個體,可以同時啟動多個 kube-controller-manager 并利用上司者選舉功能實作高可用。

此外,建構叢集的時還需要注意下列問題。

  • 節點上 k8s 程序的可靠性。需要讓 kubelet、kube-scheduler、kube-controller-manager 等程序在出現故障後能自動重新開機。
  • 為 worker node 中的非 pod 程序預留資源,防止他們将與 pod 争奪資源導緻節點資源短缺。

使用 RKE 建構高可用 k8s 叢集

節點規劃

建構叢集的第一步是将擁有的伺服器按節點功能進行劃分,下表展示了筆者環境下的節點規劃情況。

IP 角色
192.168.0.10 部署節點
192.168.0.11 k8s master - api-server, etcd, scheduler, controller-manager
192.168.0.12
192.168.0.13
192.168.0.14 k8s worker - kubelet, kube-proxy
192.168.0.15
192.168.0.16
192.168.0.17

規劃說明:

  1. 單獨選擇了一台機器

    192.168.0.10

    作為部署節點。如果機器數不多,可以将部署節點加入到 k8s 叢集中。
  2. 為了保證可用性,擇了三台機器部署 k8s master 元件。如果有條件,可以将 etcd 和 master 中的其他元件分開部署,這樣可以根據需要更靈活地控制執行個體個數。例如,在通路壓力不大但對資料可靠性要求比較高的情況下,可以專門選擇 5 台機器部署 etcd,另外選擇 3 台機器部署 master 中的其他元件。
  3. 剩餘四台機器作為 k8s worker 節點。節點個數需要根據實際情況動态調整。當有 pod 因資源不足一直處于 pending 狀态時,可以對 worker 進行擴容。當 node 的資源使用率較低時,且此 node 上存在的 pod 都能被重新排程到其他 node 上運作時,可以對 worker 進行縮容。

環境準備

在完成節點規劃後,需要進行環境準備工作,主要包含以下内容:

  1. 安裝 RKE - 需要在部署節點(192.168.0.10)上安裝 RKE 二進制包,具體安裝方法可參考 download-the-rke-binary
  2. 配置 SSH 免密登入 - 由于 RKE 通過 SSH tunnel 安裝部署 k8s 叢集,需要配置 RKE 所在節點到 k8s 各節點的 SSH 免密登入。如果 RKE 所在節點也需要加入到 k8s 叢集中,需要配置到本機的 SSH 免密登入。
  3. 安裝 docker - 由于 RKE 通過 docker 鏡像

    rancher/hyperkube

    啟動 k8s 元件,是以需要在 k8s 叢集的各個節點(192.168.0.11 ~ 192.168.0.17 這 7 台機器)上安裝 docker。
  4. 關閉 swap - k8s 1.8 開始要求關閉系統的 swap,如果不關閉,預設配置下 kubelet 将無法啟動。這裡需要關閉所有 k8s worker 節點的 swap。

配置 cluster.yml

在完成環境準備後,需要通過 cluster.yml 描述叢集的組成和 k8s 的部署方式。

配置叢集組成

配置檔案 cluster.yml 中的 nodes 配置項用于描述叢集的組成。根據節點規劃,對于 k8s master 節點,指定其角色為

controlplane

etcd

。對于 k8s worker 節點,指定其角色為

worker

nodes:
  - address: 192.168.0.1
    user: admin
    role:
      - controlplane
      - etcd
  ...
  - address: 192.168.0.7
    user: admin
    role:
      - worker           

設定資源預留

K8s 的 worker node 除了運作 pod 類程序外,還會運作很多其他的重要程序,包括 k8s 管理程序,如 kubelet、dockerd,以及系統程序,如 systemd。這些程序對整個叢集的穩定性至關重要,是以需要為他們專門預留一定的資源。

筆者環境中的 worker 設定如下:

  • 節點擁有 32 核 CPU,64Gi 記憶體和 100Gi 存儲。
  • 為 k8s 管理程序預留了 1 核 CPU,2Gi 記憶體和 1Gi 存儲。
  • 為系統程序預留了 1 核 CPU,1Gi 記憶體和 1Gi 存儲。
  • 為記憶體資源設定了 500Mi 的驅逐門檻值,為磁盤資源設定了 10% 的驅逐門檻值。

在此場景下,節點可配置設定的 CPU 資源是 29 核,可配置設定的記憶體資源是 60.5Gi,可配置設定的磁盤資源是 88Gi。對于不可壓縮資源,當 pod 的記憶體使用總量超過 60.5Gi 或者磁盤使用總量超過 88Gi 時,QoS 較低的 pod 将被優先驅逐。對于可壓縮資源,如果節點上的所有程序都盡可能多的使用 CPU,則 pod 類程序加起來不會使用超過 29 核的 CPU 資源。

上述資源預留設定在 cluster.yml 中具體形式如下。

services:
  kubelet:
    extra_args:
      cgroups-per-qos: True
      cgroup-driver: cgroupfs
      kube-reserved: cpu=1,memory=2Gi,ephemeral-storage=1Gi
      kube-reserved-cgroup: /runtime.service
      system-reserved: cpu=1,memory=1Gi,ephemeral-storage=1Gi
      system-reserved-cgroup: /system.slice
      enforce-node-allocatable: pods,kube-reserved,system-reserved
      eviction-hard: memory.available<500Mi,nodefs.available<10%           

關于資源預留更詳細的内容可參考文章

Reserve Compute Resources for System Daemons

部署 k8s 叢集

當 cluster.yml 檔案配置完成後,可以通過指令

rke up

完成叢集的部署任務。下圖展示了通過 RKE 部署的 k8s 叢集架構圖。

高可用 kubernetes 叢集部署實踐前言高可用 k8s 叢集架構使用 RKE 建構高可用 k8s 叢集總結參考資料

該架構有如下特點:

  1. 叢集中的各個元件均通過容器方式啟動,并且設定重新開機政策為

    always

    。這樣當他們出現故障意外退出後,能被自動拉起。
  2. Master 節點上的 kube-scheduler、kube-controller-manager 直接和本機的 API server 通信。
  3. Worker 節點上的 nginx-proxy 擁有 API server 的位址清單,負責代理 kubelet、kube-proxy 發往 API server 的請求。
  4. 為了讓叢集具有災備能力,master 節點上的 etcd-rolling-snapshots 會定期儲存 etcd 的快照至本地目錄

    /opt/rke/etcd-snapshots

    中。

配置負載均衡器

在完成了叢集部署後,可以通過 API server 通路 k8s。由于環境中啟動了多個 kube-apiserver 執行個體以實作高可用,需要為這些執行個體架設一個負載均衡器。這裡在

192.168.0.10

上部署了一台 nginx 實作了負載均衡的功能,nginx.conf 的具體配置如下。

...
stream {
    upstream apiserver {
        server 192.168.0.11:6443 weight=5 max_fails=3 fail_timeout=60s;
        server 192.168.0.12:6443 weight=5 max_fails=3 fail_timeout=60s;
        server 192.168.0.13:6443 weight=5 max_fails=3 fail_timeout=60s;
    }

    server {
        listen 6443;
        proxy_connect_timeout 1s;
        proxy_timeout 10s;
        proxy_pass apiserver;
    }
}
...           

這時,通過負載均衡器提供的端口通路 API server 會出現異常

Unable to connect to the server: x509: certificate is valid for xxx, not 192.168.0.10

。這裡需要将負載均衡器的 IP 位址或域名加入到 API server 的 PKI 證書中,可以通過 cluster.yml 中的 authentication 配置項完成此功能。

authentication:
  strategy: x509
  sans:
    - "192.168.0.10"           

修改完 cluster.yml 後,運作指令

rke cert-rotate

驗證

在完成上述所有步驟後,可以通過指令

kubectl get nodes

檢視節點狀态。如果所有節點的狀态均為 Ready,則表示叢集部署成功。

NAME            STATUS    ROLES              AGE    VERSION
192.168.0.11    Ready     controlplane,etcd  1d     v1.13.5
192.168.0.12    Ready     controlplane,etcd  1d     v1.13.5
192.168.0.13    Ready     controlplane,etcd  1d     v1.13.5
192.168.0.14    Ready     worker             1d     v1.13.5
192.168.0.15    Ready     worker             1d     v1.13.5
192.168.0.16    Ready     worker             1d     v1.13.5
192.168.0.17    Ready     worker             1d     v1.13.5           

總結

Rancher Kubernetes Engine(RKE)為使用者屏蔽了建立 k8s 叢集的複雜細節,簡化了部署步驟,降低了建構門檻。對于那些有自建 k8s 叢集需求的企業是一個不錯的選擇。

參考資料