Sealos 私有化部署完全指南

2023-07-26 15:00:54

Sealos 用了五年的時間從一個 K8s 一鍵安裝工具蛻變成了一個真正的雲作業系統,將產品體驗提升到了極致,也收穫了 10w+ 的社群使用者。

一個多月前,Sealos 正式釋出了公有云託管版本,社群使用者狂喜,紛紛尋找私有化部署教學。現在教學來了,本文將會手把手教你如何私有化部署 Sealos 桌面環境。

準備工作

1. 伺服器設定要求

  • 推薦使用奇數臺 Master 節點和若干 Node 節點
  • 作業系統 :Ubuntu 22.04 LTS
  • 核心版本 :5.4 及以上
  • 設定推薦 :CPU 4 核 , 記憶體 8GB, 儲存空間 100GB 以上
  • 最小設定 :CPU 2 核 , 記憶體 4GB, 儲存空間 60GB

2. 網路要求

  • 所有節點之間網路互通
  • Master 節點可以通過 SSH 免密登陸到其他節點
  • 所有節點可以通過 Ping 通訊

3. 域名要求

  • 需要一個域名用於存取 Sealos 及相關服務
  • 沒有域名可以使用 nip.io 免費域名服務

線上部署

部署 Kubernetes 叢集

得益於 Sealos CLI 強大的 Kubernetes 生命週期管理,Kubernetes 叢集部署變得非常簡單:

# 注意:helm 版本需要在 3.12.0 及以上!
$ sealos gen labring/kubernetes:v1.25.6 \
    labring/helm:v3.12.0 \
    labring/calico:v3.24.1 \
    labring/cert-manager:v1.8.0 \
    labring/openebs:v3.4.0 \
    --masters 10.140.0.16 \
    --nodes 10.140.0.54 > Clusterfile

# 請修改 Clusterfile 中的 PodSubnet 及 ServiceSubnet
# 預設的 PodSubnet: 100.64.0.0/10
# 預設的 ServiceSubnet: 10.96.0.0/22

$ sealos apply -f Clusterfile

等待叢集就緒後 , 使用 kubectl get pods -A 檢視叢集狀態:

在所有 Pod 均為 Ready 狀態後,即可進行下一步操作。如果您需要部署其他版本的 Kubernetes 叢集,可以在 Sealos 檔案 中檢視支援的版本。

部署 Sealos 依賴元件

使用下面的指令碼即可一鍵安裝 Sealos 所有的依賴元件:

#!/bin/bash
set -e

cat << EOF > ingress-nginx-config.yaml
apiVersion: apps.sealos.io/v1beta1
kind: Config
metadata:
  creationTimestamp: null
  name: ingress-nginx-config
spec:
  data: |
    controller:
      hostNetwork: true
      kind: DaemonSet
      service:
        type: NodePort
  match: docker.io/labring/ingress-nginx:v1.5.1
  path: charts/ingress-nginx/values.yaml
  strategy: merge
EOF

sealos run docker.io/labring/kubernetes-reflector:v7.0.151\
    docker.io/labring/ingress-nginx:v1.5.1\
    docker.io/labring/zot:v1.4.3\
    docker.io/labring/kubeblocks:v0.5.3\
    --env policy=anonymousPolicy\
    --config-file ingress-nginx-config.yaml

echo "patch ingress-nginx-controller tolerations to allow run on master node, if you don't want to run on master node, please ignore this step"
kubectl -n ingress-nginx patch ds ingress-nginx-controller -p '{"spec":{"template":{"spec":{"tolerations":[{"key":"node-role.kubernetes.io/control-plane","operator":"Exists","effect":"NoSchedule"}]}}}}'

echo "waitting for kubeblocks crd created, this may take a while"
while ! kubectl get clusterdefinitions.apps.kubeblocks.io redis >/dev/null 2>&1; do
  sleep 5
done

echo "start patch redis clusterdefinition"
kubectl patch clusterdefinitions.apps.kubeblocks.io redis --type='json' -p '[{"op": "add", "path": "/spec/componentDefs/0/podSpec/containers/1/resources/limits", "value": {"cpu":"100m", "memory":"100Mi"}}]'
echo "patch redis success"

echo "wait for all pod to be ready then install Sealos"
kubectl get po -A

過程可能稍長,等待所有 Pod 均為 Ready 狀態後,即可進行下一步。

部署 Sealos

只需一條命令即可一鍵部署 Sealos:

$ sealos run docker.io/labring/sealos-cloud:latest\
    --env cloudDomain="34.81.60.57.nip.io"

等待所有 Pod 均為 Ready 狀態後,即可存取 Sealos,最終叢集 Pod 如下:

瀏覽器存取 https://34.81.60.57.nip.io 即可進入 Sealos,由於是自簽名證書,瀏覽器會顯示不安全,無法開啟 App,可參考下文 Q&A 中的解決方案

關於 Sealos 的使用,可以參考 Sealos 官方檔案中的案例

自定義設定

  • 如果你需要使用自己的域名,可以將 cloudDomain 引數修改為你的域名,例如: cloudDomain="sealos.cloud"

  • 如果你需要使用自己的證書,你可以使用下面的指令碼(注意需要修改證書位置及 yaml_content 中的 match image)生成 tls-secret.yaml 檔案,然後在 sealos run sealos-cloud 時使用 --config-file 引數指定該檔案:

#!/bin/bash
# 讀取原始證書和金鑰檔案
tls_crt_file="tls.cer"
tls_key_file="tls.key"
# 使用 base64 轉換
tls_crt_base64=$(cat $tls_crt_file | base64 | tr -d '\n')
tls_key_base64=$(cat $tls_key_file | base64 | tr -d '\n')
# 定義 YAML 檔案內容
yaml_content="
apiVersion: apps.sealos.io/v1beta1
kind: Config
metadata:
  name: secret
spec:
  path: manifests/tls-secret.yaml
  # please change the match image to your own image
  match: docker.io/labring/sealos-cloud:latest
  strategy: merge
  data: |
    data:
      tls.crt: $tls_crt_base64
      tls.key: $tls_key_base64
"
# 建立新的 cloud-config.yaml 檔案
echo "$yaml_content" > tls-secret.yaml
  
sealos run docker.io/labring/sealos-cloud:latest\
--env cloudDomain="34.81.60.57.nip.io"\
--config-file tls-secret.yaml

離線部署

映象準備

離線部署依賴於 Sealos 強大的離線交付能力,離線部署步驟也非常簡單,需要在公網環境下需要提前使用 sealos pull/save 儲存映象:

#!/bin/bash
# pull_images.sh
set -ex
mkdir -p tars
images=(
  docker.io/labring/kubernetes:v1.25.6
  docker.io/labring/helm:v3.12.0
  docker.io/labring/calico:v3.24.1
  docker.io/labring/cert-manager:v1.8.0
  docker.io/labring/openebs:v3.4.0
  docker.io/labring/kubernetes-reflector:v7.0.151
  docker.io/labring/ingress-nginx:v1.5.1
  docker.io/labring/zot:v1.4.3
  docker.io/labring/kubeblocks:v0.5.3
  docker.io/labring/sealos-cloud:latest
)

for image in "${images[@]}"; do
  sealos pull "$image"
  filename=$(echo "$image" | cut -d':' -f1 | tr / -)
  sealos save -o "tars/${filename}.tar" "$image"
done

執行完這個指令碼後,會在當前目錄下生成一個 tars 目錄,裡面包含了所有的映象檔案。

然後將映象拷貝到內網環境下,使用 sealos load 命令載入映象:

#!/bin/bash
# load_images.sh
set -ex
for file in tars/*.tar; do
  sealos load -i "$file"
done

注意:在內網環境下如果缺少 Docker 映象,還需要您自己操作匯入 Docker 映象。當然,Sealos CLI 同樣也可以。

Q&A

安裝過程中出現問題怎麼辦?

如果您在安裝過程中遇到任何問題,可以在 Sealos 開發者社群 或者 Sealos issues 中提出,我們將盡快回復並幫助您解決問題。或者您也可以加入我們的微信交流群,與與開發者和其他使用者進行親切友好的交流