一 Rancher概述1.1 什麼是RancherRancher 是為使用容器的公司打造的容器管理平臺。Rancher 簡化了使用 Kubernetes 的流程,方便開發者可以隨處運行 Kubernetes(Run Kubernetes Everywhere),以便於滿足 IT 需求規範,賦能 De ...
一 Rancher概述
1.1 什麼是Rancher
Rancher 是為使用容器的公司打造的容器管理平臺。Rancher 簡化了使用 Kubernetes 的流程,方便開發者可以隨處運行 Kubernetes(Run Kubernetes Everywhere),以便於滿足 IT 需求規範,賦能 DevOps 團隊。
當然 Rancher 2.x 已經完全轉向了 Kubernetes。Rancher 2.x 可以部署和管理在任何地方運行的 Kubernetes 集群。
Rancher 可以創建來自 Kubernetes 托管服務提供商的集群,自動創建節點並安裝 Kubernetes 集群,或者導入任何已經存在的 Kubernetes 集群。
Rancher 通過支持集群的身份驗證和基於角色的訪問控制(RBAC),使系統管理員能夠從一個位置控制全部集群的訪問。Rancher 可以對集群及其資源進行詳細的監控和併在需要時發送告警,也可以將容器日誌發送給外部日誌系統,並通過應用商店與 Helm 集成。
若具有外部 CI/CD 流水線系統,則可以將其與 Rancher 對接,如果沒有,Rancher 也提供了簡單易用的流水線實現自動部署和升級工作負載。除此之外,Rancher 還有很多開箱即用的功能用於更好的管理集群和業務應用,例如多集群應用,全局 DNS,服務網格,安全掃描,集群模版和基於 OPA 的策略管理等功能。
綜上所述,Rancher 是一個全棧式的 Kubernetes 容器管理平臺,也是一個可以在任何地方都能成功運行 Kubernetes 的工具。
參考:https://docs.rancher.cn/rancher2x/#_1-what-s-rancher?
https://rancher2.docs.rancher.cn/docs/overview/_index
1.2 Rancher Server功能
Rancher API Server 是基於嵌入式 Kubernetes API Server 和 ETCD 資料庫建立的,它提供了以下功能:
- 授權和角色許可權控制
- 用戶管理: Rancher API server 除了管理用戶在公司內部的使用的認證信息之外,還管理用戶訪問外部服務所需的認證信息,如登錄活動目錄或 GitHub 所需的賬號密碼。
- 授權: Rancher API server 負責管理許可權控制策略 和 安全策略。
- 基於Rancher使用 Kubernetes 的功能
- 運行 Kubernetes 集群: Rancher API server 可以在已有節點上運行 Kubernetes 集群 ,或對 Kubernetes 進行版本升級。
- 應用商店管理: Rancher 可以使用Helm Charts 應用商店重覆部署應用。
- 項目管理: 項目,是 Rancher 中的一個概念,Kubernetes 中並沒有這個概念。項目由一個集群內的多個命名空間和多個訪問控制策略組成,允許用戶以組為單位,一次管理多個命名空間,對其進行 Kubernetes 相關操作。Rancher 用戶界面提供了 項目管理 和 項目內應用管理 兩個功能。
- 流水線: 流水線 可以幫助開發者快速高效地上線新軟體。Rancher 支持給每一個項目單獨配置流水線。
- Istio: Rancher 與 Istio 集成,管理員或集群所有者可以將 Istio 交給開發者,然後開發者使用 Istio 執行安全策略,排查問題,或為快速發佈、灰度發佈和 A/B 測試進行流量控制。
- 配置雲端基礎信息
- 同步節點信息: Rancher API server 可以同步集群內所有節點的信息。
- 配置雲端基礎信息: 當 Rancher 與雲服務提供商配置完了之後,可以在雲端動態配置新節點和持久化存儲。
- 查看集群信息
- 日誌: Rancher 可以跟多種主流日誌工具集成,可以設置 集群日誌 或 項目日誌。
- 監控: 使用 Rancher,可以通過 Prometheus 監控集群節點、Kubernetes 組件、軟體部署的狀態和進度。可以設置 集群監控 或 項目監控。
- 告警信息: 需要隨時知道集群和項目的計劃和非計劃事件,才可以提高公司的運行效率。可以設置集群告警 或 項目告警。
1.3 Rancher架構設計
Rancher Server 由認證代理(Authentication Proxy)、Rancher API Server、集群控制器(Cluster Controller)、etcd 節點和集群 Agent(Cluster Agent) 組成。除了集群 Agent 以外,其他組件都部署在 Rancher Server 中。
如上圖所示用戶通過 Rancher Server 管控 Rancher 部署的 Kubernetes 集群(RKE 集群)和托管的 Kubernetes 集群的(EKS)集群的流程。以用戶下髮指令為例,指令的流動路徑如下:
- 首先,用戶通過 Rancher UI(即 Rancher 控制台)、Rancher API 介面、Rancher 命令行工具(Rancher CLI)輸入指令;
- 用戶通過 Rancher 的代理認證後,指令會進一步下發到 Rancher Server;
- 與此同時,Rancher Server 也會執行容災備份,將數據備份到 etcd 節點;
- 然後 Rancher Server 把指令傳遞給集群控制器。集群控制器把指令傳遞到下游集群的 Agent,最終通過 Agent 把指令下發到指定的集群中。
如果 Rancher Server 出現問題,我們也提供了備用方案,可以通過授權集群端點管理集群。
提示:考慮到性能和安全因素,通常建議使用兩個 Kubernetes 集群,分開用於部署 Rancher Server 和生產環境。部署 Rancher Server 後,可以創建或導入集群,然後使用Rancher Server創建用於生產的 Kubernetes 集群。
提示:可以在單個節點或高可用的 Kubernetes 集群上安裝 Rancher。由於單節點安裝只適用於開發和測試環境,而且單節點和高可用集群之間無法進行數據遷移,所以建議從一開始就使用高可用的 Kubernetes 集群來部署 Rancher Server,而且需要分開部署運行 Rancher Server 的集群和運行業務的生產 Kubernetes 集群。
參考:https://docs.rancher.cn/rancher2x/infrastructure/
https://rancher2.docs.rancher.cn/docs/overview/architecture/_index
1.4 Rancher和下游集群交互
如下圖示例,通過兩個用戶 Bob 和 Alice,理解 Rancher 啟動和管理下游集群的具體過程,以及每個 Rancher 組件的作用。
該示例涉及集群控制器、集群 Agent 和 Node Agent等組件。
- 認證代理
如上視圖中 Bob 的用戶希望查看下游集群“User Cluster 1”裡面正在運行的 pod。Bob 發起的請求會首先經過認證代理,通過認證之後,Rancher 的 認證代理才會把 API 調用命令轉發到下游集群。
認證代理集成了多種認證方式,如本地認證、活動目錄認證、GitHub 認證等。在發起每一個 Kubernetes API 調用請求的時候,認證代理會去確認請求方的身份,在轉發調用命令前,請設置正確的 Kubernetes impersonation 的消息頭。
Rancher 使用 Service Account (Service Accout 提供了一種方便的認證機制)和 Kubernetes 進行交互。
預設狀態下,Rancher 生成一個包含認證信息的kubeconfig文件,為 Rancher Server 和下游集群的 Kubernetes API Server 之間的通信提供認證。該文件包含了訪問集群的所有許可權。
- 集群控制器和集群 Agent
每一個下游集群都有一個集群 Agent 保持下游集群的集群控制器與 Rancher Server 之間的信息暢通。
集群控制器具有以下功能:
- 檢測下游集群的資源變化,如記憶體使用率、CPU 使用率等;
- 把下游集群從“當前”狀態變更到“目標”狀態;
- 配置集群和項目的訪問控制策略;
- 通過調用 Docker Machine 和 Kubernetes Engine,如 RKE 和 GKE,創建集群。
提示:預設狀態下,集群控制器連接 Agent,Rancher 才可以與下游集群通信。如果集群 Agent 不可用,集群控制器可以連接到Node Agent,通過Node Agent 實現用戶和集群之間的通信。
集群 Agent,也叫做“cattle-cluster-agent”,是在下游集群中運行的組件,它具有以下功能:
- 連接使用 Rancher 部署的 Kubernetes 集群(RKE 集群)中的 Kubernetes API;
- 管理集群內的工作負載,pod 創建和部署;
- 根據每個集群的設置,配置 Role 和 RoleBindings;
- 實現集群和 Rancher Server 之間的消息傳輸,包括事件,指標,健康狀況和節點信息等。
- 節點 Agents
如果集群 Agent 不可用,下游集群中的其中一個節點 Agent 會創建一個通信管道,由節點 Agent 連接到集群控制器,實現下游集群和 Rancher 之間的通信。
部署節點 Agent 的方式有很多,通常建議使用DaemonSet部署節點 Agent ,這種方式可以確保下游集群內每個節點都成功運行節點 Agent。執行集群操作時,可以使用這種方式將指令下發到下游集群。集群操作包括:升級 Kubernetes 版本、創建 etcd 節點備份和恢復 etcd 節點。
- 授權集群端點
Rancher Server 和下游集群之間有明顯的延遲,或 Rancher Server 不可用時,用戶可以通過授權集群端點連接下游集群,實現 Rancher Server 和集群之間的通信,降低網路延遲。
需要註意的是,只有 Rancher 部署的 Kubernetes 集群(RKE 集群)可以使用授權集群端點這個功能。其他類型的集群,如導入的集群、托管的集群等,並不能夠使用此功能。
kube-api-auth 微服務向授權集群端點提供了用戶認證功能。使用 kubectl 訪問下游集群時,集群的 Kubernetes API Server 通過 kube-api-auth 對用戶進行認證。
與授權集群端點類似, kube-api-auth 認證功能只在 Rancher 部署的 Kubernetes 集群(RKE 集群)中有效。
使用場景舉例:假設 Rancher Server 位於美國,用戶“Alice”和她管理的下游集群“User Cluster 1”位於澳大利亞。雖然 Alice 可以使用 Rancher 控制台管理 User Cluster 1 中的資源,但是她發出的請求要從澳大利亞發送到美國的 Server 端,然後再由 Server 代理回澳大利亞的集群端,澳大利亞集群端處理完請求後,再返回給美國的 Server 端,最後才能返回給澳大利亞的“Alice”。因為美澳之間的距離非常遙遠,所以發送的請求和返回的請求結果都會存在顯著的延遲。Alice 可以使用授權集群端點,降低延遲,更好地掌控她的下游集群。
為下游集群開啟授權集群端點後,Rancher 會在“kubeconfig”文件中額外生成一段 Kubernetes context,來允許用戶直接連接到集群。kubeconfig 這個文件中含有 kubectl 和 helm 的認證信息。
如果 Rancher 出現問題,無法連接,需要使用 kubeconfig 中的 context 幫助訪問集群。因此,建議導出一份 kubeconfig 文件副本,保存到本地,以備不時之需。
1.5 Rancher相關文件
- rancher-cluster.yml :RKE 集群配置文件。
- kube_config_rancher-cluster.yml :集群的 kubeconfig 文件,它包含了訪問集群的全部許可權。如果 Rancher 出現故障,無法運行,可以使用這個文件連接通過 Rancher 部署的 Kubernetes 集群(RKE 集群)。
- rancher-cluster.rkestate :Kubernetes 集群狀態文件,該文件含有訪問集群的所有許可權。只有使用 RKE 0.2.0 或以上版本時,才會創建該文件。
註意:後兩個文件名的“rancher-cluster”部分取決於如何命名 RKE 集群的配置文件。
1.6 Rancher創建的Kubernetes類型
Rancher通常可以創建如下幾種類型的下游 Kubernetes 集群:
- Rancher自動創建節點並部署Kubernetes集群:Rancher 可以動態創建位於雲上的節點(Node),如 Amazon EC2、Azure 和 vSphere等,然後在節點上安裝 Kubernetes。Rancher 使用 RKE 和 docker-machine創建這種集群。
- Rancher通過已有的節點並部署Kubernetes集群:配置這種集群時,Rancher 可以在已有的虛擬機、物理機或雲主機上安裝 Kubernetes。這種集群叫自定義集群。Rancher 使用RKE創建這種集群。
- Rancher管理雲服務商托管的Kubernetes集群:配置這種集群時,Kubernetes 由雲服務供應商安裝,如 GKE、ECS 和 AKS。Rancher 使用kontainer-engine來調用雲廠商的 API 來創建集群。
- Rancher導入已有的Kubernetes集群:這種情況下,Rancher 只需要連接到已經配置好 Kubernetes 的集群。因此,Rancher 只設置 Rancher Agent 與集群通信,不直接創建集群。
二 基礎環境配置
2.1 安裝介紹
Rancher Server:用於管理和配置 Kubernetes 集群。可以通過 Rancher Server 的 UI 與下游 Kubernetes 集群進行交互。
RKE(Rancher Kubernetes Engine):是經過認證的 Kubernetes 發行版,它擁有對應的 CLI 工具可用於創建和管理 Kubernetes 集群。在 Rancher UI 中創建集群時,它將調用 RKE 來配置 Rancher 所創建的 Kubernetes 集群。
K3s (輕量級 Kubernetes): 和 RKE 類似,也是經過認證的 Kubernetes 發行版。它比 RKE 更新,更易用且更輕量化,全部組件都在一個小於 100 MB 的二進位文件中。從 Rancher v2.4 開始,Rancher 可以安裝在 K3s 集群上。
2.2 架構選擇
高可用 Kubernetes 安裝: 建議使用 Kubernetes 程式包管理器 Helm 在專用的 Kubernetes 集群上安裝 Rancher。在 RKE 集群中,需要使用三個節點以實現高可用性。在 K3s 集群中,僅需要兩個節點即可。
單節點 Kubernetes 安裝: 另一個選擇是在 Kubernetes 集群上使用 Helm 安裝 Rancher,僅在集群中使用單個節點。雖然在這種情況下的 Rancher Server 不具有高可用性,但是這種架構既節省了資源,又保留了可擴展性。如果想在短期內通過使用單個節點來節省資源,同時又保留高可用性遷移路徑,最合適的架構就是單節點 Kubernetes 安裝。
單節點 Docker 安裝: 將 Rancher 與 Docker 一起安裝在單個節點上。這種安裝方式的優點是開箱即用,建議在測試和演示環境中使用這種架構。它的缺點也非常明顯,單節點 Docker 安裝和高可用集群安裝之間不能進行數據遷移,所以推薦從一開始就使用高可用集群安裝的方式安裝 Rancher。
提示:本實驗基於高可用集群——K3S高可用Kubernetes集群(參考附018.K3S-ETCD高可用部署),同時使用helm來部署Rancher。
本實驗架構:
- Rancher 的 DNS 解析為 4 層負載均衡器
- 負載均衡器應將埠 TCP/80 和 TCP/443 流量轉發到 Kubernetes 集群中的所有 3 個節點。
- Ingress 控制器會將 HTTP 重定向到 HTTPS,併在埠 TCP/443 上終止 SSL/TLS。
- Ingress 控制器會將流量轉發到 Rancher deployment 中 Pod 上的埠 TCP/80。
2.3 資源需求
本實驗 Rancher Server 安裝在高可用的 Kubernetes 集群(K3S)上。通常安裝 Rancher Server 節點的軟體,硬體和網路有如下最低要求。
- 操作系統要求
Rancher 應用可以相容當前任何流行的 Linux 發行版和流行的 Docker 版本。
Rancher 官方支持並且已在如下操作系統中測試了 Rancher 和 RKE,它們包括 Ubuntu,CentOS,Oracle Linux,RancherOS 和 RedHat Enterprise Linux
本實驗的 K3S 幾乎可以在任何 Linux 版本上運行。K3S 在以下操作系統及其這些版本後續的非主要版本中進行了測試:
Ubuntu 16.04 (amd64)
Ubuntu 18.04 (amd64)
Raspbian Buster (armhf)
所有受支持的操作系統都是 64-bit x86。
同時建議安裝 ntp (Network Time Protocol),這樣可以防止在客戶端和伺服器之間因為時鐘不同步而發生證書驗證錯誤。
- 硬體要求
硬體要求根據 Rancher 部署規模而定,官方對於高可用集群安裝的建議如下:
- 網路要求
單個節點或 Kubernetes 集群上安裝 Rancher,每個節點都應配置一個靜態 IP。
- 埠要求(K3S高可用環境)
- 用於與下游集群通信的埠
為了與下游集群通信,Rancher 要求開放不同的埠,通常Rancher 管理面的埠要求如下圖所示:
下表細分了入站和出站流量的埠要求:
Rancher 節點的入站規則
Rancher 節點的出站規則
- K3s 集群中節點的其他埠要求
為了安裝 Rancher 高可用,K3S Server 需要開放 6443 埠供節點訪問。
使用 Flannel VXLAN 時,這些節點需要能夠通過 UDP 埠 8472 訪問其他節點。
如果要使用指標伺服器(Metrics Server),則需要在每個節點上打開埠 10250。
Rancher Server 節點的入站規則
通常情況下,可以允許全部的出站流量。
提示:本手冊基於實驗目的,直接關閉所有防火牆。
更多的環境需求參考:https://rancher2.docs.rancher.cn/docs/installation/requirements/_index。
2.4 ingress安裝
本實驗使用helm部署rancher,配套需要提前部署ingress,參考《附020.Nginx-ingress部署及使用》。
三 Rancher安裝
3.1 安裝Docker
任何運行 Rancher Server 的節點上都需要安裝 Docker。
有兩種安裝 Docker 的選擇。一種選擇是參考官方 Docker 文檔來瞭解如何在 Linux 上安裝 Docker。
另一種選擇是使用 Rancher 提供的 Docker 安裝腳本,該腳本可用於安裝較新的 Docker 版本。
例如,此命令可用於在 Ubuntu 上安裝 Docker 18.09:
1 curl https://releases.rancher.com/install-docker/18.09.sh | sh
提示:https://github.com/rancher/install-docker描述所有可快速安裝Docker的腳本。本實驗基於已有的高可用K3S集群,所有Docker均已安裝完成。
3.2 K3S集群安裝
1 [root@master01 ~]# k3s kubectl get nodes
提示:本實驗基於高可用集群——K3S高可用Kubernetes集群(參考附018.K3S-ETCD高可用部署),同時使用helm來部署Rancher。
3.3 安裝CLI
hlem安裝:參考《053.集群管理-Helm工具》。
kubectl安裝:參考https://kubernetes.io/docs/tasks/tools/install-kubectl/#install-kubectl。
3.4 添加helm chart倉庫
1 [root@master01 ~]# helm repo add rancher-stable https://releases.rancher.com/server-charts/stable
提示:Rancher不同的倉庫版本參考:https://rancher2.docs.rancher.cn/docs/installation/options/server-tags/_ind