1. 配置基礎設施和私有鏡像倉庫
從 Rancher v2.5 開始,Rancher 可以安裝在任何 Kubernetes 集群上。
1.1 RKE 高可用集群
在 RKE 集群中安裝 Rancher 高可用,我們建議為高可用安裝配置以下基礎設施:
- 3 個 Linux 節點,通常是虛擬機,您可以自行選擇的基礎設施提供商,例如 Amazon EC2、阿里雲、騰訊雲或者 vShpere。
- 1 個負載均衡器,用於將流量轉發到這三個節點。
- 1 條 DNS 記錄,用於將 URL 指向負載均衡器。這將成為 Rancher Server 的 URL,下游集群需要可以訪問到這個地址。
- 私有 Docker 鏡像倉庫,用於為您的節點分發 Docker 鏡像。
你可以將這些服務器放在不同的可用區里,但這些節點必須位於相同的區域/數據中心。
為什么要三個節點?
在 RKE 集群中,Rancher Server 數據存儲在 etcd 中。這個 etcd 數據庫在所有三個節點上運行。
etcd 數據庫需要奇數個節點,因此它始終可以選舉出被大多數 etcd 節點認可的集群的領導者。如果 etcd 數據庫無法選出領導者,則 etcd 可能會遭受腦裂的困擾,這時將需要從備份中恢復集群。如果三個 etcd 節點之一發生故障,則其余兩個節點可以選擇一個領導者,因為它們占 etcd 節點總數的大部分。
1.1.1 配置 Linux 節點
這些主機可以與 Internet 斷開連接,但需要能夠與你的私有鏡像倉庫連接。
確保你的節點滿足 操作系統、容器運行時、硬件和網絡的常規安裝要求。
1.1.1.1 操作系統和容器運行時要求
Rancher 可以兼容當前任何流行的 Linux 發行版。
對於將運行 RKE Kubernetes 集群的節點需要安裝 Docker。對於 RancherD 安裝 和 RKE2 安裝來說,Docker 不是必需的。
所有受支持的操作系統都是 64-bit x86。
為了防止在客戶端和服務器之間因為時鍾不同步而發生證書驗證錯誤,建議您安裝 ntp (Network Time Protocol)。
某些 Linux 發行版可能有默認的防火牆規則,阻止與 Helm 的通信。我們建議禁用 firewalld。對於 Kubernetes 1.19 和 1.20,Firewalld 必須被關閉。
- RKE 要求
RKE 可以兼容當前的所有 Docker 版本。
請注意,必須應用以下 sysctl 設置:
net.bridge.bridge-nf-call-iptables=1
- 安裝 Docker
您可以按照Docker 官方文檔中的步驟安裝 Docker。Rancher 也提供了使用命令安裝 Docker 的腳本( https://docs.rancher.cn/docs/rancher2.5/installation/requirements/installing-docker/_index )。RancherD 安裝 Rancher 不需要 Docker。
1.1.1.2 硬件要求
- CPU 和 內存
硬件要求根據您的 Rancher 部署規模而定。請根據要求配置每個單獨的節點。這些要求具體取決於您是通過單節點容器安裝 Rancher,還是在 Kubernetes 集群上安裝 Rancher。
- RKE 和托管 Kubernetes
這些 CPU 和內存要求適用於安裝 Rancher Server 的 Kubernetes 集群中的每個主機。
這些要求適用於 RKE Kubernetes 集群以及托管的 Kubernetes 集群,例如 EKS。
1.1.1.3 Ingress
Rancher 安裝的 Kubernetes 集群中的每個節點都應該運行一個 Ingress。
Ingress 應被部署為 DaemonSet,以確保你的負載均衡器能夠成功地將流量路由到所有節點。
對於 RKE、K3s 和 RancherD 的安裝,你不需要手動安裝 Ingress,因為它是默認安裝的。
對於托管的 Kubernetes 集群(EKS、GKE、AKS)和 RKE2 Kubernetes 安裝,你將需要設置 Ingress。
1.1.1.4 磁盤
Rancher 的性能取決於 etcd 在集群中的性能。為了確保最佳速度,我們建議使用 SSD 磁盤來支持 Rancher 管里面的 Kubernetes 集群。在雲提供商上,您還需要使用允許最大 IOPS 的最小大小。在較大的集群中,請考慮使用專用存儲設備存儲 etcd 數據和 wal 目錄。
1.1.1.5 網絡要求
- 節點 IP 地址
無論您是在單個節點上還是在 Kubernetes 集群上安裝 Rancher,每個節點都應配置一個靜態 IP。如果使用 DHCP,則每個節點應具有 DHCP 預留,以確保該節點分配的相同 IP 地址。
- 端口要求
為了正常運行,Rancher 需要在 Rancher 節點和下游 Kubernetes 集群節點上開放一些端口。端口需求列出了不同集群類型的 Rancher 和下游集群的所有必要端口。詳情請參考端口要求( https://docs.rancher.cn/docs/rancher2.5/installation/requirements/ports/_index )
1.1.2 配置負載均衡器
你還需要設置一個負載均衡器,以將流量定向到全部節點上的 Rancher 副本。這樣可以在某個節點不可用時,繼續保障與 Rancher 管理服務器的連接。
在后續步驟中配置 Kubernetes 時,RKE 工具將部署 NGINX Ingress 控制器。該控制器將偵聽 worker 節點的 80 端口和 443 端口,以響應發送給特定主機名的流量。
在安裝 Rancher 時(也是在后續步驟中),Rancher 系統將創建一個 Ingress 資源。該 Ingress 通知 NGINX Ingress 控制器偵聽發往 Rancher 主機名的流量。NGINX Ingress 控制器在收到發往 Rancher 主機名的流量時,會將其轉發到集群中正在運行的 Rancher Server Pod。
對於實現,請考慮是否要使用 4 層或 7 層負載均衡器:
-
4 層負載均衡器 是一種相對簡單的負載均衡,它將 TCP 流量轉發到你到節點。我們建議使用 4 層負載均衡器,將流量從 TCP / 80 端口和 TCP / 443 端口轉發到 Rancher 管理服務器的集群節點上。集群上的 Ingress 控制器會將 HTTP 流量重定向到 HTTPS,並在 TCP / 443 端口上終止 SSL / TLS。Ingress 控制器會將流量轉發到 Rancher Server Pod 的 TCP / 443 端口。
-
7 層負載均衡器 是一種相對復雜的負載均衡,但功能更加全面。例如,與 Rancher 本身進行 TLS 終止相反,7 層負載均衡器能夠在負載均衡器處處理 TLS 終止。如果要在基礎設施中進行 TLS 終止,7 層負載均衡可能會很有用。7 層負載均衡還可以為你的負載均衡器提供基於 HTTP 屬性(例如 cookie 等)做出決策的能力,而 4 層負載均衡器不提供這種功能。如果決定在 7 層負載均衡器上終止 SSL / TLS 流量,則在安裝 Rancher 時(后續步驟)需要使用--set tls=external選項。有關更多信息,請參閱Rancher Helm Chart 選項。
有關如何設置 NGINX 負載均衡器的示例,請參考本頁( https://www.cnblogs.com/varden/p/15018587.html )。
重要提示:安裝后,請勿使用 local 集群的 Ingress 對 Rancher 以外的應用進行負載均衡。與其他應用共享此 Ingress 可能會在其他應用的 Ingress 配置重新加載后,導致 Rancher 出現 websocket 錯誤。我們強烈建議將 local 集群專用於 Rancher,而不應在 local 集群內部署任何其他應用。
1.1.3 配置 DNS 記錄
配置完負載均衡器后,你將需要創建 DNS 記錄,以將流量發送到該負載均衡器。
根據你的環境,DNS 記錄可以是指向負載均衡器 IP 的 A 記錄,也可以是指向負載均衡器主機名的 CNAME。無論哪種情況,請確保該記錄是你要 Rancher 進行響應的主機名。
在安裝 Rancher 時(后續步驟),你需要指定此主機名,並且在以后也無法更改它。確保你的決定是最終決定。
1.1.4 配置私有 Docker 鏡像倉庫
Rancher 支持使用私有鏡像倉庫進行離線安裝。你必須有自己的私有鏡像倉庫或使用其他方式將 Docker 鏡像分發到節點。
如果你需要有關創建私有 Docker 鏡像倉庫的幫助,請參閱 官方 Docker 文檔( https://docs.docker.com/registry/deploying/#run-an-externally-accessible-registry )。
2. 同步鏡像到私有鏡像倉庫
默認情況下,Rancher 中所有用於創建 Kubernetes 集群或啟動 Rancher 中任何工具(如監控和日志)的鏡像都來自 Docker Hub。在 Rancher 的離線安裝中,你將需要一個私有鏡像倉庫,該鏡像倉庫位於你的 Rancher Server 可訪問的某個位置。然后,你將在鏡像倉庫中加載所有的鏡像。
對於創建僅有 Linux 節點的集群的 Rancher Server,請按以下步驟推送鏡像到私有鏡像庫。
- 查找您用的 Rancher 版本所需要的資源 https://github.com/rancher/rancher/releases
- 搜集 cert-manager 鏡像
- 將鏡像保存到您的工作站中
- 推送鏡像到私有鏡像庫
2.1 查找你用的 Rancher 版本所需要的資源
-
瀏覽我們的版本發布頁面( https://github.com/rancher/rancher/releases ),查找你想安裝的 Rancher v2.x.x 版本。不要下載標記為 rc 或 Pre-release 的版本,因為它們在生產環境下是不穩定的。
-
從發行版 Assets 部分下載以下文件,這些文件是離線環境下安裝 Rancher 所必需的:
rancher-images.txt 此文件包含安裝 Rancher、創建集群和運行 Rancher 工具所需的鏡像列表。
rancher-save-images.sh 這個腳本會從 DockerHub 中拉取在文件rancher-images.txt中描述的所有鏡像,並將它們保存為文件rancher-images.tar.gz。
rancher-load-images.sh 這個腳本會載入文件rancher-images.tar.gz中的鏡像,並將它們推送到您自己的私有鏡像庫。
2.2 收集 cert-manager 鏡像
如果你使用自己的證書,或者要在外部負載均衡器上終止 TLS,請跳過此步驟。
在安裝高可用過程中,如果選擇使用 Rancher 默認的自簽名 TLS 證書,則還必須將 cert-manager 鏡像添加到 rancher-images.txt 文件中。如果使用自己的證書,則跳過此步驟。
- 獲取最新的cert-manager Helm chart,解析模板並獲取鏡像詳細信息:
helm repo add jetstack https://charts.jetstack.io
helm repo update
helm fetch jetstack/cert-manager --version v1.5.1
helm template ./cert-manager-<version>.tgz | awk '$1 ~ /image:/ {print $2}' | sed s/\"//g >> ./rancher-images.txt
- 對鏡像列表進行排序和唯一化,去除重復的鏡像源:
sort -u rancher-images.txt -o rancher-images.txt
2.3 將鏡像保存到你的工作站中
- 為rancher-save-images.sh 文件添加可執行權限:
chmod +x rancher-save-images.sh
- 執行腳本rancher-save-images.sh並以--image-list ./rancher-images.txt 作為參數,創建所有需要鏡像的壓縮包:
./rancher-save-images.sh --image-list ./rancher-images.txt
提示:國內用戶,可以從 http://mirror.rancher.cn --> rancher --> [rancher 版本] 下載 rancher-save-images.sh,該腳本支持通過參數 --from-aliyun true 來指定從阿里雲鏡像倉庫拉去 rancher 鏡像(從 rancher/rancher release 下載的 rancher-save-images.sh 不支持該參數),例如:
./rancher-save-images.sh --image-list ./rancher-images.txt --from-aliyun true
Image pull success: registry.cn-hangzhou.aliyuncs.com/rancher/busybox
Image pull success: registry.cn-hangzhou.aliyuncs.com/rancher/backup-restore-operator:v1.0.4-rc4
...
結果: Docker 會開始拉取用於離線安裝所需的鏡像。這個過程會花費幾分鍾時間。完成時,你的當前目錄會輸出名為rancher-images.tar.gz的壓縮包。請確認輸出文件是否存在。
2.4 推送鏡像到私有鏡像庫
下一步,你將使用腳本將文件 rancher-images.tar.gz 中的鏡像上傳到你自己的私有鏡像庫。
文件 rancher-images.txt 和 rancher-images.tar.gz 應該位於工作站中運行 rancher-load-images.sh 腳本的同一目錄下。
- 登錄私有鏡像庫:
docker login <REGISTRY.YOURDOMAIN.COM:PORT>
- 為 rancher-load-images.sh 添加可執行權限:
chmod +x rancher-load-images.sh
- 使用腳本 rancher-load-images.sh提取rancher-images.tar.gz文件中的鏡像,根據文件rancher-images.txt中的鏡像列表對提取的鏡像文件重新打 tag 並推送到你的私有鏡像庫:
./rancher-load-images.sh --image-list ./rancher-images.txt --registry <REGISTRY.YOURDOMAIN.COM:PORT>`
3. 部署 Kubernetes 集群(RKE)
從 Rancher v2.5 開始,Rancher 可以安裝在任何 Kubernetes 集群上,包括托管的 Kubernetes。
我們將使用 Rancher Kubernetes Engine (RKE) 創建一個 Kubernetes 集群。在啟動 Kubernetes 集群之前,你需要安裝 RKE 並創建 RKE 配置文件。
3.1 安裝 RKE
參考:https://www.cnblogs.com/varden/p/15988581.html
3.2 創建 RKE 配置文件
在可以訪問你的 Linux 節點上的 22/tcp 端口和 6443/tcp 端口的系統上,使用以下示例創建一個名為 rancher-cluster.yml 的新文件。
該文件是 RKE 配置文件,其中包括了你將要部署的集群的配置。
使用你創建的 3 個節點的 IP 地址或 DNS 名稱,替換下面的代碼示例中的值。
提示:有關可用選項的更多詳細信息,請參見 RKE 配置選項( https://www.cnblogs.com/varden/p/15992425.html )。
nodes:
- address: 10.10.3.187 # 離線環境節點 IP
internal_address: 172.31.7.22 # 節點內網 IP
user: rancher
role: ["controlplane", "etcd", "worker"]
ssh_key_path: /home/user/.ssh/id_rsa
- address: 10.10.3.254 # 離線環境節點 IP
internal_address: 172.31.13.132 # 節點內網 IP
user: rancher
role: ["controlplane", "etcd", "worker"]
ssh_key_path: /home/user/.ssh/id_rsa
- address: 10.10.3.89 # 離線環境節點 IP
internal_address: 172.31.3.216 # 節點內網 IP
user: rancher
role: ["controlplane", "etcd", "worker"]
ssh_key_path: /home/user/.ssh/id_rsa
private_registries:
- url: <REGISTRY.YOURDOMAIN.COM:PORT> # 私有鏡像庫地址
user: rancher
password: "*********"
is_default: true
3.3 執行 RKE
配置完rancher-cluster.yml之后,啟動你的 Kubernetes 集群:
rke up --config ./rancher-cluster.yml
3.4 保存你的文件
重要: 以下文件需要保存好,可以用來故障排查和升級集群。
將以下文件的副本保存在安全的位置:
- rancher-cluster.yml:RKE 配置文件
- kube_config_cluster.yml:集群的 Kubeconfig 文件,該文件包含對集群的完全訪問權限的憑據。
- rancher-cluster.rkestate:Kubernetes 集群狀態文件,該文件包含集群的當前狀態,包括 RKE 配置和證書。
Kubernetes 集群狀態文件僅在使用 RKE v0.2.0 或更高版本時創建。
后兩個文件名的 rancher-cluster 部分取決於你如何命名 RKE 集群配置文件。
4. 高可用安裝 Rancher
本節介紹如何在 Kubernetes 集群上安裝高可用 Rancher,它可能處於防火牆之后或在代理之后。
開啟特權模式
當 Rancher server 部署在 Docker 容器中時,容器內會安裝一個本地 Kubernetes 集群供 Rancher 使用。因為 Rancher 的很多功能都是以 deployments 的方式運行的,而在容器內運行容器是需要特權模式的,所以你需要在安裝 Rancher 時添加--privileged標簽,開啟特權模式。
4.1 添加 Helm Chart 倉庫
從可以訪問 Internet 的系統中,獲取最新的 Rancher Helm Chart,然后將內容復制到可以訪問 Rancher Server 集群的系統中。
-
如果您還沒有在可以訪問互聯網的系統上安裝 helm,請參考 Helm 版本要求來選擇一個 Helm 版本來安裝 Rancher。
-
使用 helm repo add 來添加倉庫,不同的地址適應不同的 Rancher 版本,請替換命令中的<CHART_REPO>,替換為latest,stable或alpha。更多信息請參考如何選擇 Rancher 版本。
- latest: 最新版,建議在嘗試新功能時使用。
- stable:穩定版,建議生產環境中使用。
- alpha:預覽版, 未來版本的實驗性預覽。
helm repo add rancher-<CHART_REPO> https://releases.rancher.com/server-charts/<CHART_REPO>
- 獲取最新的 Rancher Chart,您會看到對應的 tgz 文件下載到本地。
helm fetch rancher-<CHART_REPO>/rancher
如果需要下載特定版本 Rancher 的,你可以用--version參數指定版本,例如,以下代碼示例通過--version=v2.4.8,指定下載 Rancher 的版本為 v2.4.8:
helm fetch rancher-stable/rancher --version=v2.4.8
4.2 選擇您的 SSL 配置
Rancher Server 在默認情況下被設計為安全的,並且需要 SSL/TLS 配置。
當在離線環境的 Kubernetes 中安裝 Rancher 時,推薦兩種證書生成方式。
注意:如果要在外部終止 SSL/TLS,請參閱在外部負載均衡器上終止 TLS。
重要: Rancher 中國技術支持團隊建議您使用 “已有的證書” ingress.tls.source=secret 這種方式,從而減少對 cert-manager 的運維成本。
4.3 離線環境可用的 Helm Chart 選項
4.4 渲染您的 Rancher Helm 模板
根據您在選擇您的 SSL 配置做出的選擇,完成以下步驟之一。
選項 A - 使用 Rancher 默認的自簽名證書
默認情況下,Rancher 會生成一個 CA 並使用 cert-manager 頒發證書以訪問 Rancher Server 界面。
注意: 由於 cert-manager 最近的改動,您需要進行升級。如果您要升級 Rancher 並在使用版本低於 v0.11.0 的 cert-manager,請參閱我們的升級 cert-manager 文檔( https://docs.rancher.cn/docs/rancher2.5/installation/resources/upgrading-cert-manager/_index )。
- 在可以連接互聯網的系統中,添加 cert-manager 倉庫。
helm repo add jetstack https://charts.jetstack.io
helm repo update
- 從 Helm Chart 倉庫 中獲取最新的 cert-manager Chart。
helm fetch jetstack/cert-manager --version v1.5.1
- 使用您期望的參數渲染 chart 模板,需要設置 image.repository 從私有鏡像倉庫中拉取 Chart。這將生成一個包含相關 YAML 的名為 cert-manager 的目錄。
helm template cert-manager ./cert-manager-v1.5.1.tgz --output-dir . \
--namespace cert-manager \
--set image.repository=<REGISTRY.YOURDOMAIN.COM:PORT>/quay.io/jetstack/cert-manager-controller \
--set webhook.image.repository=<REGISTRY.YOURDOMAIN.COM:PORT>/quay.io/jetstack/cert-manager-webhook \
--set cainjector.image.repository=<REGISTRY.YOURDOMAIN.COM:PORT>/quay.io/jetstack/cert-manager-cainjector \
--set startupapicheck.image.repository=<REGISTRY.YOURDOMAIN.COM:PORT>/quay.io/jetstack/cert-manager-ctl
- 下載 cert-manager 所需的 CRD 文件。
curl -L -o cert-manager/cert-manager-crd.yaml https://github.com/jetstack/cert-manager/releases/download/v1.5.1/cert-manager.crds.yaml
- 渲染 Rancher 模板,聲明您選擇的選項。使用下面的參考表替換每個占位符。需要將 Rancher 配置為在由 Rancher 啟動 Kubernetes 集群或 Rancher 工具時,使用私有鏡像庫。
- RANCHER V2.5.8+
helm template rancher ./rancher-<VERSION>.tgz --output-dir . \
--no-hooks \ # prevent files for Helm hooks from being generated
--namespace cattle-system \
--set hostname=<RANCHER.YOURDOMAIN.COM> \
--set certmanager.version=<CERTMANAGER_VERSION> \
--set rancherImage=<REGISTRY.YOURDOMAIN.COM:PORT>/rancher/rancher \
--set systemDefaultRegistry=<REGISTRY.YOURDOMAIN.COM:PORT> \ # Set a default private registry to be used in Rancher
--set useBundledSystemChart=true # Use the packaged Rancher system charts
可選:要安裝特定的 Rancher 版本,請設置 rancherImageTag 值,例如:--set rancherImageTag=v2.5.6
選項 B - 使用已有的證書
-
根據您已有的證書創建 Kubernetes 密文來提供 Rancher 使用。證書的 common name 需要與以下命令中的 hostname 選項匹配,否則 ingress controller 將無法為 Rancher 設置站點。
-
渲染 Rancher 模板,聲明您選擇的選項。使用下面表中的參考選項替換每個占位符。Rancher 需要配置為使用私有鏡像庫,以便配置任何 Rancher 啟動的 Kubernetes 集群或 Rancher 工具。
- RANCHER V2.5.8+
helm template rancher ./rancher-<VERSION>.tgz --output-dir . \
--no-hooks \ # prevent files for Helm hooks from being generated
--namespace cattle-system \
--set hostname=<RANCHER.YOURDOMAIN.COM> \
--set rancherImage=<REGISTRY.YOURDOMAIN.COM:PORT>/rancher/rancher \
--set ingress.tls.source=secret \
--set systemDefaultRegistry=<REGISTRY.YOURDOMAIN.COM:PORT> \ # Set a default private registry to be used in Rancher
--set useBundledSystemChart=true # Use the packaged Rancher system charts
如果您使用的是由私有 CA 簽名的證書,則在 --set ingress.tls.source=secret 之后添加 --set privateCA=true:
helm template rancher ./rancher-<VERSION>.tgz --output-dir . \
--no-hooks \ # prevent files for Helm hooks from being generated
--namespace cattle-system \
--set hostname=<RANCHER.YOURDOMAIN.COM> \
--set rancherImage=<REGISTRY.YOURDOMAIN.COM:PORT>/rancher/rancher \
--set ingress.tls.source=secret \
--set privateCA=true \
--set systemDefaultRegistry=<REGISTRY.YOURDOMAIN.COM:PORT> \ # Set a default private registry to be used in Rancher
--set useBundledSystemChart=true # Use the packaged Rancher system charts
可選:要安裝指定的 Rancher 版本,請設置rancherImageTag的值,例如:--set rancherImageTag = v2.3.6
然后請參考添加 TLS 密文發布證書文件,以便 Rancher 和 ingress controller 可以使用它們。
4.5 安裝 Rancher
將以上配置完畢的內容復制到可以訪問 Rancher Server 集群的系統中,准備妥當,完成最后的安裝。
使用kubectl創建命名空間並安裝配置好的 YAML。
如果您在選擇您的 SSL 配置選擇了使用 Rancher 默認的自簽名證書,則安裝 cert-manager。
安裝 Cert-manager(僅限使用 Rancher 默認自簽名證書)
如果您使用的是 Rancher 默認的自簽名證書,請安裝 cert-manager:
- 為 cert-manager 創建 namespace。
kubectl create namespace cert-manager
- 創建 cert-manager CRD。
kubectl apply -f cert-manager/cert-manager-crd.yaml
注意: 如果您在使用 Kubernetes v1.15 或更低的版本,您需要在kubectl apply命令中添加--validate=false。否則您將看到一個關於 cert-manager 的 CRD 資源中的x-kubernetes-preserve-unknown-fields字段的校驗錯誤。這是由於 kubectl 執行資源驗證的方式改變產生的良性錯誤。
- 啟動 cert-manager。
kubectl apply -R -f ./cert-manager
4.6 使用 kubectl 安裝 Rancher
kubectl create namespace cattle-system
kubectl -n cattle-system apply -R -f ./rancher
說明: 如果您不打算發送遙測數據,請在初始登錄時選擇退出遙測。如果在離線安裝的環境中讓這個功能處於 active 狀態,會導致無法成功打開 socket 的問題。