Kubernetes(k8s) 憑藉着其優良的架構,靈活的擴展能力,豐富的應用編排模型,成爲了容器編排領域的事實標準。愈來愈多的企業擁抱這一趨勢,選擇 k8s 做爲容器化應用的基礎設施,逐漸將本身的核心服務遷移到 k8s 之上。html
可用性對基礎設施而言相當重要。各大雲計算廠商紛紛推出了高可用、可擴展的 k8s 託管服務,其中比較有表明性的有 Amazon EKS、Azure Kubernetes Service (AKS)、Google Kubernetes Engine、阿里雲容器服務 Kubernetes 版等。node
雖然公有云託管的 k8s 服務百花齊放,但不少企業仍有自建集羣的需求。正是這樣的緣由,促進了一大批出色的 k8s 集羣部署方案的誕生,他們的特色以下表所示。nginx
部署方案 | 特色 |
---|---|
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
。git
首先須要瞭解高可用 k8s 集羣的架構特色,下圖是官方推薦的高可用集羣架構圖。github
其核心思想是讓 k8s master 節點中的各種組件具有高可用性,消除單點故障。docker
此外,構建集羣的時還須要注意下列問題。api
構建集羣的第一步是將擁有的服務器按節點功能進行劃分,下表展現了筆者環境下的節點規劃狀況。服務器
IP | 角色 |
---|---|
192.168.0.10 | 部署節點 |
192.168.0.11 | k8s master - api-server, etcd, scheduler, controller-manager |
192.168.0.12 | k8s master - api-server, etcd, scheduler, controller-manager |
192.168.0.13 | k8s master - api-server, etcd, scheduler, controller-manager |
192.168.0.14 | k8s worker - kubelet, kube-proxy |
192.168.0.15 | k8s worker - kubelet, kube-proxy |
192.168.0.16 | k8s worker - kubelet, kube-proxy |
192.168.0.17 | k8s worker - kubelet, kube-proxy |
規劃說明:網絡
192.168.0.10
做爲部署節點。若是機器數很少,能夠將部署節點加入到 k8s 集羣中。在完成節點規劃後,須要進行環境準備工做,主要包含如下內容:架構
rancher/hyperkube
啓動 k8s 組件,所以須要在 k8s 集羣的各個節點(192.168.0.11 ~ 192.168.0.17 這 7 臺機器)上安裝 docker。在完成環境準備後,須要經過 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 設置以下:
在此場景下,節點可分配的 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。
當 cluster.yml 文件配置完成後,能夠經過命令rke up
完成集羣的部署任務。下圖展現了經過 RKE 部署的 k8s 集羣架構圖。
該架構有以下特色:
always
。這樣當他們出現故障意外退出後,能被自動拉起。/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 集羣需求的企業是一個不錯的選擇。
原文連接 本文爲雲棲社區原創內容,未經容許不得轉載。