跳至內容

antony@notes:~/rancher$ cat "RKE2-Rancher-Prime-Installation.md"

RKE2 & Rancher Prime Installation

2026-03-31· Rancher / RKE2 ·SUSE Rancher 2.6

Preface

本篇文章會主要會介紹,如何安裝 Rancher Kubernetes Engine 2 或 K3S,並在 Kubernetes 之中部署 Rancher Prime

可以透過點擊以下目錄,選擇想看的內容,跳轉至特定章節

Install RKE2 v1.34.4

一、 安裝前環境檢查

  • 請確保你的環境符合要求
    • RKE2 Requirements
    • 如果你的主機上安裝並啟用了 NetworkManager,確保它被配置為忽略 CNI 管理的接口。
  • 對於 1.21 及以上版本的 RKE2,如果主機核心支持 AppArmor,那麼在安裝 RKE2 之前還必須有 AppArmor 工具(通常通過 apparmor-parser 軟件包獲得)。
  • RKE2 的安裝過程必須以 root 用戶或通過 sudo 運行。

Hardware

Linux/Windows

  • RAM: 4GB Minimum (we recommend at least 8GB)
  • CPU: 2 Minimum (we recommend at least 4CPU)
  • Disks: SSD

RKE2 Hardware

二、Server Node Installation

1. Config RKE2 Basic Parameters

1-1. 下載 RKE2 的安裝腳本,並賦予執行權限

在 Server node 的機器上執行以下命令

curl -sfL https://get.rke2.io --output install.sh && chmod +x install.sh

RKE2 提供了一個安裝腳本,在 systemd 的系統上將其作為一個服務來安裝。

1-2. 編輯 Server Node 設定檔

  • advertise-address, node-iptls-san 的 IP 需要依據不同的環境來設定。
# 定義 K8s 要跑在哪張網卡上(以下指令預設會去找 default gateway 的網卡)
NIC="$(ip route show default | cut -d' ' -f5)"
IP=$(ip -4 -o addr show ${NIC} | awk '{print $4}' | cut -d/ -f1)

# 定義節點名稱
NODE_NAME="$(hostname -f 2>/dev/null)"
NODE_NAME="${NODE_NAME:-$(hostname)}"
sudo mkdir -p /etc/rancher/rke2/ && \
cat <<EOF | sudo tee /etc/rancher/rke2/config.yaml
write-kubeconfig-mode: "0644"
debug: false

# =============================================
# 每台節點不同的設定
# =============================================

# 本機對外廣播的 IP(其他節點透過此 IP 連線)
advertise-address: "${IP}"
# 本機 IP
node-ip: "${IP}"
# 節點名稱(每台不同)
node-name: "${NODE_NAME}"

# TLS 憑證允許的 SAN(第一台 server 需完整設定)
tls-san:
  - "${NODE_NAME}"
  - "${IP}"
  - "127.0.0.1"

# 第二台以後需加入此行,指向第一台 server(第一台不需要)
# server: "https://<第一台IP>:9345"

# =============================================
# 所有 Server Node 必須相同的設定
# =============================================

# 叢集加入金鑰
token: "hehe"

# 各元件時區設定
etcd-extra-env:
  - "TZ=Asia/Taipei"
kube-apiserver-extra-env:
  - "TZ=Asia/Taipei"
kube-controller-manager-extra-env:
  - "TZ=Asia/Taipei"
kube-scheduler-extra-env:
  - "TZ=Asia/Taipei"
cloud-controller-manager-extra-env:
  - "TZ=Asia/Taipei"

# kubelet 參數
kubelet-arg:
  - "container-log-max-files=5"           # 最多保留 5 個 log 檔
  - "container-log-max-size=10Mi"         # 每個 log 檔最大 10Mi
  - "config=/etc/kubernetes/kubeletconfig.yml"
  - "eviction-hard=memory.available<1000Mi,imagefs.available<5%,nodefs.available<5%"  # 資源不足時驅逐 Pod 的閾值

# 停用內建 cloud controller
disable-cloud-controller: true
# 停用 kube-proxy,改由 Cilium 接管
disable-kube-proxy: true

# 停用不需要的內建元件
disable:
  - rke2-canal       # 停用預設 CNI Canal
  - rke2-kube-proxy  # 停用內建 kube-proxy

# 使用 Cilium 作為 CNI
cni:
  - "cilium"

# 啟用 CIS security profile
#profile: "cis"

# API Server 額外參數
#kube-apiserver-arg:
#  - "service-account-extend-token-expiration=false"

EOF

1-3. 編輯 cilium 設定檔

sudo mkdir -p /var/lib/rancher/rke2/server/manifests && \
cat <<EOF | sudo tee /var/lib/rancher/rke2/server/manifests/rke2-cilium-config.yaml
apiVersion: helm.cattle.io/v1
kind: HelmChartConfig
metadata:
  name: rke2-cilium
  namespace: kube-system
spec:
  valuesContent: |-
    operator:
      replicas: 1
    podAnnotations:
      container.apparmor.security.beta.kubernetes.io/cilium-agent: "unconfined"
      container.apparmor.security.beta.kubernetes.io/clean-cilium-state: "unconfined"
      container.apparmor.security.beta.kubernetes.io/mount-cgroup: "unconfined"
      container.apparmor.security.beta.kubernetes.io/apply-sysctl-overwrites: "unconfined"
    devices: "$NIC"
    nodePort:
      directRoutingDevice: "$NIC"
    autoDirectNodeRoutes: true
    hubble:
      enabled: false
      relay:
        enabled: false
      ui:
        enabled: false
        frontend:
          server:
            ipv6:
              enabled: false
      service:
        type: NodePort
    enableLBIPAM: false
    ipv4NativeRoutingCIDR: 10.42.0.0/16
    k8sServiceHost: 127.0.0.1
    k8sServicePort: 6443
    kubeProxyReplacement: true
    routingMode: native
    l2announcements:
      enabled: true
EOF

1-4. 編輯 kubelet 設定檔

sudo mkdir -p /etc/kubernetes && \
cat <<EOF | sudo tee /etc/kubernetes/kubeletconfig.yml
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
systemReserved:
  memory: "1Gi"
kubeReserved:
  memory: "2Gi"
EOF
  1. evictionHard
    • 用途:設定強制驅逐的值,當系統資源(如記憶體)低於此設定值時,kubelet 會立即終止部分 Pod,以釋放資源,確保系統穩定運行。
    • 預設值: 預設打開,Memory 是 100MiB, Ephemeral-Storage 是 10% (開源的 K8s), rke2 預設值是 imagefs 和 nodefs = 5%
    • 範例memory.available: "500Mi" 表示當可用記憶體少於 500MiB 時,kubelet 會觸發驅逐機制。
  2. evictionMinimumReclaim
    • 用途:設定在驅逐 Pod 時,kubelet 希望至少回收的資源量。這有助於避免頻繁的驅逐操作,確保每次驅逐能有效釋放足夠的資源。
    • 範例memory.available: "10Mi" 表示每次驅逐操作至少要回收 10MiB 的記憶體。
  3. systemReserved
    • 用途:為系統背景程序(如 sshd、networking 等非 Kubernetes 組件)預留資源,確保這些系統服務在資源緊張時仍能正常運行。
    • 範例memory: "1Gi" 表示為系統服務預留 1GiB 的記憶體。
  4. kubeReserved
    • 用途:為 Kubernetes 系統的背景程序(如 kubelet、container runtime 時等)預留資源,確保這些組件在資源緊張時的穩定性。
    • 範例memory: "2Gi" 表示為 Kubernetes 系統的背景程序預留 2GiB 的記憶體。

2. Install RKE2 with v1.34.4 version

2-1. 執行以下安裝命令

sudo INSTALL_RKE2_CHANNEL=v1.34.4+rke2r1 ./install.sh
  • INSTALL_RKE2_CHANNEL
    • 指定要下載 RKE2 URL 的 Channel,預設是 latest
[INFO]  finding release for channel v1.34.4+rke2r1
[INFO]  using v1.34.4+rke2r1 as release
[INFO]  downloading checksums at https://github.com/rancher/rke2/releases/download/v1.34.4%2Brke2r1/sha256sum-amd64.txt
[INFO]  downloading tarball at https://github.com/rancher/rke2/releases/download/v1.34.4%2Brke2r1/rke2.linux-amd64.tar.gz
[INFO]  verifying tarball
[INFO]  unpacking tarball file to /usr/local

3. enable rke2 and setup kubeconfig

3-1. 將 rke2-server 的服務設為開機自動啟動,並立即啟動服務

sudo systemctl enable rke2-server --now

以上命令執行後的螢幕輸出

Created symlink /etc/systemd/system/multi-user.target.wants/rke2-server.service → /etc/systemd/system/rke2-server.service.

3-2. Setup kubeconfig and crictl

{
  # 1. 建立目錄並設定 Kubeconfig
  mkdir -p $HOME/.kube && \
  sudo cp /etc/rancher/rke2/rke2.yaml $HOME/.kube/config && \
  sudo chown $(id -u):$(id -g) $HOME/.kube/config && \
  
  # 2. 搬移執行檔
  sudo cp /var/lib/rancher/rke2/bin/* /usr/local/bin/ && \
  
  # 3. 寫入 crictl 設定 (使用 printf 保持單行邏輯)
  printf "runtime-endpoint: unix:///run/k3s/containerd/containerd.sock\nimage-endpoint: unix:///run/k3s/containerd/containerd.sock\ntimeout: 10\n" | sudo tee /etc/crictl.yaml > /dev/null && \
  
  # 4. 設定 Bash Alias 與補全
  printf "\nsource <(kubectl completion bash)\nalias k=kubectl\ncomplete -o default -F __start_kubectl k\n" >> ~/.bashrc && \
  
  # 5. 立即生效
  source ~/.bashrc
}

4. check pod status

kubectl get po -A

螢幕輸出 :

NAMESPACE     NAME                                                    READY   STATUS      RESTARTS   AGE
kube-system   cilium-j7jf2                                            1/1     Running     0          2m12s
kube-system   cilium-operator-6fb6d5b896-jj2nx                        1/1     Running     0          2m12s
kube-system   etcd-rms-1.kubeantony.com                               1/1     Running     0          2m31s
kube-system   helm-install-rke2-cilium-qhdsl                          0/1     Completed   0          2m24s
kube-system   helm-install-rke2-coredns-hwsqp                         0/1     Completed   0          2m24s
kube-system   helm-install-rke2-ingress-nginx-bxt7n                   0/1     Completed   0          2m24s
kube-system   helm-install-rke2-metrics-server-qln6s                  0/1     Completed   0          2m24s
kube-system   helm-install-rke2-runtimeclasses-5kj6v                  0/1     Completed   0          2m23s
kube-system   helm-install-rke2-snapshot-controller-crd-vsbjv         0/1     Completed   0          2m23s
kube-system   helm-install-rke2-snapshot-controller-z9kfv             0/1     Completed   1          2m23s
kube-system   kube-apiserver-rms-1.kubeantony.com                     1/1     Running     0          2m31s
kube-system   kube-controller-manager-rms-1.kubeantony.com            1/1     Running     0          2m31s
kube-system   kube-scheduler-rms-1.kubeantony.com                     1/1     Running     0          2m31s
kube-system   rke2-coredns-rke2-coredns-77f54456d4-kqbtc              1/1     Running     0          2m12s
kube-system   rke2-coredns-rke2-coredns-autoscaler-6c58bf4677-wj7gp   1/1     Running     0          2m12s
kube-system   rke2-ingress-nginx-controller-bhf7h                     1/1     Running     0          62s
kube-system   rke2-metrics-server-69f4f95bf7-tb6rc                    1/1     Running     0          76s
kube-system   rke2-snapshot-controller-bc4c494bf-cqj7t                1/1     Running     0          76s

三、Join Additional Server Nodes

1. Config RKE2 Basic Parameters

1-1. 下載 RKE2 的安裝腳本,並賦予執行權限

以下命令請在 Additional Server node 上執行

curl -sfL https://get.rke2.io --output install.sh && chmod +x install.sh

RKE2 提供了一個安裝腳本,在 systemd 的系統上將其作為一個服務來安裝。

1-2. 編輯 RKE2 Additional Server Node 設定檔

# 定義 K8s 要跑在哪張網卡上(以下指令預設會去找 default gateway 的網卡)
NIC="$(ip route show default | cut -d' ' -f5)"
IP=$(ip -4 -o addr show ${NIC} | awk '{print $4}' | cut -d/ -f1)

# 定義節點名稱
NODE_NAME="$(hostname -f 2>/dev/null)"
NODE_NAME="${NODE_NAME:-$(hostname)}"

# 定義第一台 Control-plane node 的 ip
ServerIP="192.168.11.161"
sudo mkdir -p /etc/rancher/rke2/ && \
cat <<EOF | sudo tee /etc/rancher/rke2/config.yaml
write-kubeconfig-mode: "0644"
debug: false

# =============================================
# 每台節點不同的設定
# =============================================

# 本機對外廣播的 IP(其他節點透過此 IP 連線)
advertise-address: "${IP}"
# 本機 IP
node-ip: "${IP}"
# 節點名稱(每台不同)
node-name: "${NODE_NAME}"

# TLS 憑證允許的 SAN(第一台 server 需完整設定)
tls-san:
  - "${NODE_NAME}"
  - "${IP}"
  - "127.0.0.1"

# 第二台以後需加入此行,指向第一台 server(第一台不需要)
server: "https://${ServerIP}:9345"

# =============================================
# 所有 Server Node 必須相同的設定
# =============================================

# 叢集加入金鑰
token: "hehe"

# 各元件時區設定
etcd-extra-env:
  - "TZ=Asia/Taipei"
kube-apiserver-extra-env:
  - "TZ=Asia/Taipei"
kube-controller-manager-extra-env:
  - "TZ=Asia/Taipei"
kube-scheduler-extra-env:
  - "TZ=Asia/Taipei"
cloud-controller-manager-extra-env:
  - "TZ=Asia/Taipei"

# kubelet 參數
kubelet-arg:
  - "container-log-max-files=5"           # 最多保留 5 個 log 檔
  - "container-log-max-size=10Mi"         # 每個 log 檔最大 10Mi
  - "config=/etc/kubernetes/kubeletconfig.yml"
  - "eviction-hard=memory.available<1000Mi,imagefs.available<5%,nodefs.available<5%"  # 資源不足時驅逐 Pod 的閾值

# 停用內建 cloud controller
disable-cloud-controller: true
# 停用 kube-proxy,改由 Cilium 接管
disable-kube-proxy: true

# 停用不需要的內建元件
disable:
  - rke2-canal       # 停用預設 CNI Canal
  - rke2-kube-proxy  # 停用內建 kube-proxy

# 使用 Cilium 作為 CNI
cni:
  - "cilium"

# 啟用 CIS security profile
#profile: "cis"

# API Server 額外參數
#kube-apiserver-arg:
#  - "service-account-extend-token-expiration=false"

EOF

Note: 要指定第一台 RKE2 Server node 的 IP

1-3. 編輯 kubelet 設定檔

sudo mkdir -p /etc/kubernetes && \
cat <<EOF | sudo tee /etc/kubernetes/kubeletconfig.yml
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
systemReserved:
  memory: "1Gi"
kubeReserved:
  memory: "2Gi"
EOF

2. Install RKE2 with v1.34.4 veersion

2-1. 執行以下安裝命令

sudo INSTALL_RKE2_CHANNEL=v1.34.4+rke2r1 ./install.sh
  • INSTALL_RKE2_CHANNEL
    • 指定要下載 RKE2 URL 的 Channel,預設是 latest
[WARN]  /usr/local is read-only or a mount point; installing to /opt/rke2
[INFO]  finding release for channel v1.23.9+rke2r1
[INFO]  using v1.23.9+rke2r1 as release
[INFO]  downloading checksums at https://github.com/rancher/rke2/releases/download/v1.23.9+rke2r1/sha256sum-amd64.txt
[INFO]  downloading tarball at https://github.com/rancher/rke2/releases/download/v1.23.9+rke2r1/rke2.linux-amd64.tar.gz
[INFO]  verifying tarball
[INFO]  unpacking tarball file to /opt/rke2
[INFO]  updating tarball contents to reflect install path
[INFO]  moving systemd units to /etc/systemd/system
[INFO]  install complete; you may want to run:  export PATH=$PATH:/opt/rke2/bin

3. enable rke2 and setup kubeconfig

3-1. 將 rke2-server 的服務設為開機自動啟動,並立即啟動服務

sudo systemctl enable rke2-server --now

以上命令執行後的螢幕輸出

Created symlink /etc/systemd/system/multi-user.target.wants/rke2-server.service → /etc/systemd/system/rke2-server.service.

4. check pod status

kubectl get po -A

螢幕輸出 :

NAMESPACE     NAME                                                    READY   STATUS      RESTARTS   AGE
kube-system   cilium-79sx5                                            1/1     Running     0          2m35s
kube-system   cilium-j7jf2                                            1/1     Running     0          19m
kube-system   cilium-operator-6fb6d5b896-jj2nx                        1/1     Running     0          19m
kube-system   etcd-rms-1.kubeantony.com                               1/1     Running     0          19m
kube-system   etcd-rms-2.kubeantony.com                               1/1     Running     0          2m35s
kube-system   helm-install-rke2-cilium-qhdsl                          0/1     Completed   0          19m
kube-system   helm-install-rke2-coredns-hwsqp                         0/1     Completed   0          19m
kube-system   helm-install-rke2-ingress-nginx-bxt7n                   0/1     Completed   0          19m
kube-system   helm-install-rke2-metrics-server-qln6s                  0/1     Completed   0          19m
kube-system   helm-install-rke2-runtimeclasses-5kj6v                  0/1     Completed   0          19m
kube-system   helm-install-rke2-snapshot-controller-crd-vsbjv         0/1     Completed   0          19m
kube-system   helm-install-rke2-snapshot-controller-z9kfv             0/1     Completed   1          19m
kube-system   kube-apiserver-rms-1.kubeantony.com                     1/1     Running     0          19m
kube-system   kube-apiserver-rms-2.kubeantony.com                     1/1     Running     0          2m35s
kube-system   kube-controller-manager-rms-1.kubeantony.com            1/1     Running     0          19m
kube-system   kube-controller-manager-rms-2.kubeantony.com            1/1     Running     0          2m34s
kube-system   kube-scheduler-rms-1.kubeantony.com                     1/1     Running     0          19m
kube-system   kube-scheduler-rms-2.kubeantony.com                     1/1     Running     0          2m34s
kube-system   rke2-coredns-rke2-coredns-77f54456d4-4n5k5              1/1     Running     0          82s
kube-system   rke2-coredns-rke2-coredns-77f54456d4-kqbtc              1/1     Running     0          19m
kube-system   rke2-coredns-rke2-coredns-autoscaler-6c58bf4677-wj7gp   1/1     Running     0          19m
kube-system   rke2-ingress-nginx-controller-bhf7h                     1/1     Running     0          18m
kube-system   rke2-ingress-nginx-controller-vhmtb                     1/1     Running     0          85s
kube-system   rke2-metrics-server-69f4f95bf7-tb6rc                    1/1     Running     0          18m
kube-system   rke2-snapshot-controller-bc4c494bf-cqj7t                1/1     Running     0          18m

四、Join Agent Nodes

1. Config RKE2 Basic Parameters

1-1. 下載 RKE2 的安裝腳本,並賦予執行權限

以下命令請在 agent node 上執行

~> curl -sfL https://get.rke2.io --output install.sh && chmod +x install.sh

RKE2 提供了一個安裝腳本,在 systemd 的系統上將其作為一個服務來安裝。

1-2. 編輯 RKE2 Additional Server Node 設定檔

# 定義 K8s 要跑在哪張網卡上
$ NIC='eth1'
$ IP=$(ip -4 -o addr show ${NIC} | awk '{print $4}' | cut -d/ -f1)
# 定義 API Server 的 IP 位址
$ ServerIP='192.168.11.35'
# 定義節點名稱
$ NODE_NAME='w1'
~> sudo mkdir -p /etc/rancher/rke2/ && \
cat <<EOF | sudo tee /etc/rancher/rke2/config.yaml
server: https://${ServerIP}:9345
write-kubeconfig-mode: "0644"
debug: False
node-ip: "${IP}"
node-name:
  - "${NODE_NAME}"
token: "hehe"
etcd-extra-env: TZ=Asia/Taipei
kube-apiserver-extra-env: TZ=Asia/Taipei
kube-controller-manager-extra-env: TZ=Asia/Taipei
kube-proxy-extra-env: TZ=Asia/Taipei
kube-scheduler-extra-env: TZ=Asia/Taipei
cloud-controller-manager-extra-env: TZ=Asia/Taipei
kubelet-arg:
  - container-log-max-files=5
  - container-log-max-size=10Mi
  - "--config=/etc/kubernetes/kubeletconfig.yml"
  - "--eviction-hard=memory.available<1000Mi,imagefs.available<5%,nodefs.available<5%"
#selinux: false
EOF

Note: 要指定第一台 RKE2 Server node 的 IP

1-3. 編輯 kubelet 設定檔

~> sudo mkdir -p /etc/kubernetes && \
cat <<EOF | sudo tee /etc/kubernetes/kubeletconfig.yml
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
systemReserved:
  memory: "1Gi"
kubeReserved:
  memory: "2Gi"
EOF

2. Install RKE2 with 1.31.2 veersion

2-1. 執行以下安裝命令

~> sudo INSTALL_RKE2_TYPE="agent" INSTALL_RKE2_CHANNEL=v1.31.2+rke2r1 ./install.sh
  • INSTALL_RKE2_CHANNEL
    • 指定要下載 RKE2 URL 的 Channel,預設是 latest
[INFO]  finding release for channel v1.34.4+rke2r1
[INFO]  using v1.34.4+rke2r1 as release
[INFO]  downloading checksums at https://github.com/rancher/rke2/releases/download/v1.34.4%2Brke2r1/sha256sum-amd64.txt
[INFO]  downloading tarball at https://github.com/rancher/rke2/releases/download/v1.34.4%2Brke2r1/rke2.linux-amd64.tar.gz
[INFO]  verifying tarball
[INFO]  unpacking tarball file to /usr/local

3. enable rke2

3-1. 將 rke2-agent 的服務設為開機自動啟動,並立即啟動服務

~> sudo systemctl enable rke2-agent --now

以上命令執行後的螢幕輸出

Created symlink /etc/systemd/system/multi-user.target.wants/rke2-server.service → /etc/systemd/system/rke2-server.service.

4. check pod status

以下命令在第一台 RKE2 Server 執行

~> kubectl get nodes,po -A

螢幕輸出 :

NAME      STATUS   ROLES                       AGE     VERSION
node/m1   Ready    control-plane,etcd,master   4h32m   v1.31.1+rke2r1
node/m2   Ready    control-plane,etcd,master   18m     v1.31.1+rke2r1
node/m3   Ready    control-plane,etcd,master   12m     v1.31.1+rke2r1
node/w1   Ready    <none>                      84s     v1.31.1+rke2r1

NAMESPACE     NAME                                                        READY   STATUS      RESTARTS        AGE
kube-system   pod/cilium-2w97z                                            1/1     Running     0               84s
kube-system   pod/cilium-b744m                                            1/1     Running     0               12m
kube-system   pod/cilium-operator-84b8ff5b6c-stfdw                        1/1     Running     4 (162m ago)    4h25m
kube-system   pod/cilium-p45b4                                            1/1     Running     1 (162m ago)    4h
kube-system   pod/cilium-qvqps                                            1/1     Running     0               18m
kube-system   pod/etcd-m1                                                 1/1     Running     1               4h32m
kube-system   pod/etcd-m2                                                 1/1     Running     0               18m
kube-system   pod/etcd-m3                                                 1/1     Running     0               11m
kube-system   pod/helm-install-rke2-cilium-z7qsz                          0/1     Completed   0               4h25m
kube-system   pod/helm-install-rke2-coredns-9cg6t                         0/1     Completed   0               4h32m
kube-system   pod/helm-install-rke2-ingress-nginx-fscw4                   0/1     Completed   0               4h32m
kube-system   pod/helm-install-rke2-metrics-server-gw8qc                  0/1     Completed   0               4h32m
kube-system   pod/helm-install-rke2-multus-j8h9d                          0/1     Completed   0               4h32m
kube-system   pod/helm-install-rke2-snapshot-controller-crd-h58vl         0/1     Completed   0               4h32m
kube-system   pod/helm-install-rke2-snapshot-controller-v6lwh             0/1     Completed   1               4h32m
kube-system   pod/helm-install-rke2-snapshot-validation-webhook-gz77q     0/1     Completed   0               4h32m
kube-system   pod/kube-apiserver-m1                                       1/1     Running     2               3h41m
kube-system   pod/kube-apiserver-m2                                       1/1     Running     0               18m
kube-system   pod/kube-apiserver-m3                                       1/1     Running     0               12m
kube-system   pod/kube-controller-manager-m1                              1/1     Running     10 (162m ago)   4h32m
kube-system   pod/kube-controller-manager-m2                              1/1     Running     0               18m
kube-system   pod/kube-controller-manager-m3                              1/1     Running     0               12m
kube-system   pod/kube-scheduler-m1                                       1/1     Running     2 (162m ago)    4h32m
kube-system   pod/kube-scheduler-m2                                       1/1     Running     0               18m
kube-system   pod/kube-scheduler-m3                                       1/1     Running     0               12m
kube-system   pod/rke2-coredns-rke2-coredns-79f8cbfcf7-9rh2l              1/1     Running     0               18m
kube-system   pod/rke2-coredns-rke2-coredns-79f8cbfcf7-bwvtc              1/1     Running     0               161m
kube-system   pod/rke2-coredns-rke2-coredns-autoscaler-7cf7db4bdc-t8ff7   1/1     Running     1 (162m ago)    4h
kube-system   pod/rke2-ingress-nginx-controller-4hns2                     1/1     Running     0               48s
kube-system   pod/rke2-ingress-nginx-controller-7c5bp                     1/1     Running     0               11m
kube-system   pod/rke2-ingress-nginx-controller-8qrjf                     1/1     Running     0               18m
kube-system   pod/rke2-ingress-nginx-controller-rwpdf                     1/1     Running     1 (162m ago)    3h40m
kube-system   pod/rke2-metrics-server-6d887864c-vdkgn                     0/1     Completed   0               4h25m
kube-system   pod/rke2-metrics-server-6d887864c-vdt5s                     1/1     Running     1 (162m ago)    4h
kube-system   pod/rke2-multus-6vcp7                                       1/1     Running     3 (50s ago)     84s
kube-system   pod/rke2-multus-bxdkm                                       1/1     Running     2 (11m ago)     12m
kube-system   pod/rke2-multus-hfqc6                                       1/1     Running     1 (162m ago)    4h
kube-system   pod/rke2-multus-t7vln                                       1/1     Running     2 (18m ago)     18m
kube-system   pod/rke2-snapshot-controller-658d97fccc-7gkrv               1/1     Running     7 (162m ago)    4h25m
kube-system   pod/rke2-snapshot-validation-webhook-784bcc6c8-xfq68        1/1     Running     1 (162m ago)    4h25m

Install K3S v1.26.9

  1. 安裝命令
$ curl -sfL https://get.k3s.io/ | INSTALL_K3S_VERSION=v1.26.9+k3s1 K3S_KUBECONFIG_MODE="644" sh -
  1. 設定 kubeconfig
$ mkdir -p $HOME/.kube && sudo cp /etc/rancher/k3s/k3s.yaml $HOME/.kube/config && sudo chown $(id -u):$(id -g) $HOME/.kube/config && sudo chmod 600 $HOME/.kube/config

Helm Install Rancher Prime v2.13.2

1. Add the Helm Chart Repository

1.1 Install helm3

在第一台 Master Node 上執行以下命令

  1. 下載 helm 壓縮檔
wget https://get.helm.sh/helm-v3.8.2-linux-amd64.tar.gz

螢幕輸出

--2022-09-21 09:06:57--  https://get.helm.sh/helm-v3.8.2-linux-amd64.tar.gz
Resolving get.helm.sh (get.helm.sh)... 152.199.39.108, 2606:2800:247:1cb7:261b:1f9c:2074:3c
Connecting to get.helm.sh (get.helm.sh)|152.199.39.108|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 13633605 (13M) [application/x-tar]
Saving to: ‘helm-v3.8.2-linux-amd64.tar.gz’

helm-v3.8.2-linux-amd64.tar.gz     100%[=============================================================>]  13.00M  5.95MB/s    in 2.2s

2022-09-21 09:07:00 (5.95 MB/s) - ‘helm-v3.8.2-linux-amd64.tar.gz’ saved [13633605/13633605]
  1. 解壓縮 helm 壓縮檔
tar zxvf helm-v3.8.2-linux-amd64.tar.gz

螢幕輸出

linux-amd64/
linux-amd64/helm
linux-amd64/LICENSE
linux-amd64/README.md
  1. 將 helm 執行檔拷貝至 PATH 環境變數中的 /usr/local/bin/ 目錄下
sudo cp linux-amd64/helm /usr/local/bin/
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash

1.2 Add the Helm Chart Repository

Prime: Recommended for production environments

helm repo add rancher-prime https://charts.rancher.com/server-charts/prime
helm repo add rancher-latest https://releases.rancher.com/server-charts/latest
helm repo add rancher-stable https://releases.rancher.com/server-charts/stable

2. Create a Namespace for Rancher

This should always be cattle-system

kubectl create ns cattle-system

3. Choose your SSL Configuration

  1. 建立和切換至工作目錄
mkdir ssl;cd ssl
  1. 下載 產生自簽憑證 腳本,並賦予執行權限
wget https://raw.githubusercontent.com/cooloo9871/openssl/master/mk && \
chmod +x mk
  1. 執行腳本產生自簽憑證
./mk create rancher.example.com 192.168.11.60

第一個參數放 rancher 的 Domain Name 第二個參數放 LB 的 IP (HA Rancher),或是 rancher 本身的 IP

螢幕輸出

Generating RSA private key, 4096 bit long modulus (2 primes)
.........................................................................................................................................................................................................................++++
....................................................................................................................................................................................................................................................++++
e is 65537 (0x010001)
Generating RSA private key, 4096 bit long modulus (2 primes)
..........................................................++++
..++++
e is 65537 (0x010001)
Signature ok
subject=CN = example
Getting CA Private Key

檢查是否符合預期

ls -l
total 32
-rw------- 1 rancher users 3326 Feb 13 13:58 ca-key.pem
-rw-r--r-- 1 rancher users 2009 Feb 13 13:58 ca.pem
-rw-r--r-- 1 rancher users   41 Feb 13 13:58 ca.srl
-rw-r--r-- 1 rancher users 1582 Feb 13 13:58 cert.csr
-rw------- 1 rancher users 3243 Feb 13 13:58 cert-key.pem
-rw-r--r-- 1 rancher users 1874 Feb 13 13:58 cert.pem
-rw-r--r-- 1 rancher users   86 Feb 13 13:58 extfile.cnf
-rwxr-xr-x 1 rancher users 1166 Feb 13 13:57 mk
  1. Create the certificate secret resource

將伺服器憑證和任何中間證書串聯到一個名為 tls.crt 的檔案中,並在一個名為 tls.key 的檔案中提供相應的證書密鑰。

kubectl -n cattle-system create secret tls tls-rancher-ingress \
--cert=cert.pem \
--key=cert-key.pem

kubectl -n cattle-system create secret generic tls-ca --from-file=cacerts.pem=./cert.pem

kubectl -n cattle-system get secret
NAME                  TYPE                                  DATA   AGE
default-token-h9lwm   kubernetes.io/service-account-token   3      2m15s
tls-ca                Opaque                                1      13s
tls-rancher-ingress   kubernetes.io/tls                     2      52s
  1. 把 ca.pem 複製到 rancher 託管的每座 Downstream cluster 中的每台 Node 上

之後使用 Rancher 註冊就不需要再勾選 insecure 了

scp ca.pem rancher@<client>:~

# ssh 到 client 上
sudo cp ca.pem /etc/pki/trust/anchors/

sudo cp ca.pem /usr/share/pki/trust/anchors/

sudo update-ca-certificates
  1. Install from the cert-manager release manifest
kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.20.0/cert-manager.yaml
  1. Check cert-manager pod status
kubectl -n cert-manager get pods

螢幕輸出 :

NAME                                       READY   STATUS    RESTARTS   AGE
cert-manager-7b8b89f89d-9tsmq              1/1     Running   0          43s
cert-manager-cainjector-7f9fdd5dd5-mqspq   1/1     Running   0          43s
cert-manager-webhook-769f6b94cb-vmwm2      1/1     Running   0          43s

4. Install Rancher Prime with Helm and Your Chosen Certificate Option

建立 Rancher Prime 並且使用自簽憑證

helm install rancher rancher-prime/rancher \
  --namespace cattle-system \
  --version=2.13.2 \
  --set bootstrapPassword=rancheradmin \
  --set hostname=rancher.example.com \
  --set replicas=3 \
  --set ingress.tls.source=secret \
  --set privateCA=true
  --set global.cattle.psp.enabled=false

建立 Rancher Prime 並且使用 Cert-manager 產生憑證

helm install rancher rancher-prime/rancher \
  --namespace cattle-system \
  --set hostname=ha-rancher.kubeantony.com \
  --set bootstrapPassword=rancheradmin \
  --set global.cattle.psp.enabled=false \
  --set replicas=3 \
  --version 2.13.2

5. Verify that the Rancher Server is Successfully Deployed

kubectl -n cattle-system get po

螢幕輸出 :

NAME                              READY   STATUS      RESTARTS      AGE
helm-operation-cnlsx              0/2     Completed   0             14m
helm-operation-hfpdh              0/2     Completed   0             15m
helm-operation-llz2m              0/2     Completed   0             15m
helm-operation-pcq4s              0/2     Completed   0             16m
helm-operation-tw5hw              0/2     Completed   0             15m
rancher-647cdd469b-7ctmw          1/1     Running     0             20m
rancher-647cdd469b-l5q7w          1/1     Running     1 (17m ago)   20m
rancher-647cdd469b-mb4rc          1/1     Running     1 (17m ago)   20m
rancher-webhook-fb6768c79-fk9jl   1/1     Running     0             15m

檢查名稱解析

~> curl -k -H "host: rancher.example.com" https://192.168.11.50/dashboard/

匯出 cert-manager 簽的憑證

~> curl -k -s -fL rancher.example.com/v3/settings/cacerts | jq -r .value

將憑證匯入瀏覽器

Rancher 生成 RKE2 之前的必要設定

  1. 編輯 Patch file Yaml 檔
$ cat <<EOF > patch-file-hostalias.yaml
spec:
  template:
    spec:
      hostAliases:
      - ip: "192.168.0.11"
        hostnames:
        - "antony-rancher.example.com"
EOF

hostAliases 輸入 Rancher 所在的主機 IP Address hostnames 輸入 Racher 的 FDQN

  1. Patch cattle-cluster-agent 這個 Deployment
$ kubectl -n cattle-system patch deployment cattle-cluster-agent --patch-file patch-file-hostalias.yaml
  1. 檢視 Pods 運作狀態
$ kubectl -n cattle-system get pods -l app=cattle-cluster-agent

螢幕輸出 :

NAME                                    READY   STATUS    RESTARTS   AGE
cattle-cluster-agent-6c54877576-hmtgq   1/1     Running   0          22m
cattle-cluster-agent-6c54877576-zt6mb   1/1     Running   0          22m

請注意,這個方法永遠不要在 Production 環境使用,只能在測試環境使用,因為如果 DownStream Cluster 有被更新,Patch 的設定有可能會被覆蓋

Rancher 生成 RKE2 之後的必要設定

在每一台 Control Plane Node 的設定

{
  # 1. 建立目錄並設定 Kubeconfig
  mkdir -p $HOME/.kube && \
  sudo cp /etc/rancher/rke2/rke2.yaml $HOME/.kube/config && \
  sudo chown $(id -u):$(id -g) $HOME/.kube/config && \
  
  # 2. 搬移執行檔
  sudo cp /var/lib/rancher/rke2/bin/* /usr/local/bin/ && \
  sudo cp /opt/rke2/bin/* /usr/local/bin/ ; \
  
  # 3. 寫入 crictl 設定 (使用 printf 保持單行邏輯)
  printf "runtime-endpoint: unix:///run/k3s/containerd/containerd.sock\nimage-endpoint: unix:///run/k3s/containerd/containerd.sock\ntimeout: 10\n" | sudo tee /etc/crictl.yaml > /dev/null && \
  
  # 4. 設定 Bash Alias 與補全
  printf "\nsource <(kubectl completion bash)\nalias k=kubectl\ncomplete -o default -F __start_kubectl k\n" >> ~/.bashrc && \
  
  # 5. 立即生效
  source ~/.bashrc
}    

在每一台 Worker Node 要做的設定

~> sudo cp /opt/rke2/bin/* /usr/local/bin/ && \
   sudo cp /var/lib/rancher/rke2/bin/* /usr/local/bin/

# Setup crictl config
~> cat <<EOF | sudo tee /etc/crictl.yaml
runtime-endpoint: unix:///run/k3s/containerd/containerd.sock
image-endpoint: unix:///run/k3s/containerd/containerd.sock
timeout: 10
EOF

Helm upgrade Rancher

  1. Update your local helm repo cache
$ helm repo update
  1. Export the current values to a file:
$ helm get values rancher -n cattle-system -o yaml > values.yaml
  1. Helm 查詢 Rancher 的版本,命令如下 :
$ helm -n cattle-system repo ls
- name: rancher-prime
url: https://charts.rancher.com/server-charts/prime

$ helm search repo rancher-prime --versions
NAME                    CHART VERSION   APP VERSION     DESCRIPTION
rancher-prime/rancher   2.8.2           v2.8.2          Install Rancher Server to manage Kubernetes clu...
...
  1. Upgrade Rancher Version
$ helm upgrade rancher rancher-<CHART_REPO>/rancher \
  --namespace cattle-system \
  -f values.yaml \
  --version=2.8.2

RKE2 設定私有 Image Registry

可以透過 Rancher 設定或是手動更改 Containerd 的設定檔,Rancher 做的設定會直接套用到整個叢集的每一台 Node 上,手動設定會需要一台一台 Node 去做設定。

Rancher 設定

  1. 更改叢集設定檔

image

  1. 輸入 Image Registry 資訊

image

image

image

  1. 儲存並套用設定至整個叢集

image

手動設定

  1. 注意資訊 :
  1. 複製一份 Cotainerd 的設定檔
$ sudo cp /var/lib/rancher/rke2/agent/etc/containerd/config.toml /var/lib/rancher/rke2/agent/etc/containerd/config.toml.tmpl

重要: 檔名一定要是 config.toml.tmpl

  1. 修改 config.toml.tmpl 檔案內容
$ sudo nano /var/lib/rancher/rke2/agent/etc/containerd/config.toml.tmpl

新增以下內容 :

[plugins."io.containerd.grpc.v1.cri".registry.configs."HARBOR_FQDN".auth]
  username = "xxx"
  password = "xxx"

[plugins."io.containerd.grpc.v1.cri".registry.configs."HARBOR_FQDN".tls]
  insecure_skip_verify = true

如果 Image Registry 是 HTTP,那麼必須再額外新增以下內容

[plugins."io.containerd.grpc.v1.cri".registry.mirrors]

[plugins."io.containerd.grpc.v1.cri".registry.mirrors."{FQDN or IP Address}:Port"]
 endpoint = ["http://{FQDN or IP Address}:Port"]
  1. 重啟 RKE2 服務
$ sudo systemctl restart rke2-server.service

如果是 RKE2 worker 節點要重啟的服務是 rke2-agent.service

  1. 刪除 config.toml.tmpl 檔案 (不一定要做)
$ sudo rm /var/lib/rancher/rke2/agent/etc/containerd/config.toml.tmpl

重要 ! 如果 RKE2 由 Rancher 管理,那麼只要這個檔案存在,在 Rancher 設定的 Image Registry 資訊,都會被這個檔案覆蓋,所以要自行決定是否刪除。

Enable Rrancher Audit log

PreRequest

Note: Rancher 要可以收到 Audit log ,它所在的 K8S 也要先啟動 Audit log

1. RKE2 啟動 Audit log

Step 1: Update the RKE2 Configuration File

$ echo "audit-policy-file: /etc/rancher/rke2/audit-policy.yaml" | sudo tee -a /etc/rancher/rke2/config.yaml

Step 2: Create an Audit Policy File

$ cat <<EOF | sudo tee /etc/rancher/rke2/audit-policy.yaml
apiVersion: audit.k8s.io/v1
kind: Policy
metadata:
  creationTimestamp: null
rules:
- level: Metadata
EOF

Step 3: Restart RKE2 Server

$ sudo systemctl restart rke2-server

Step 4: Monitor Audit Log

$ sudo tail -f /var/lib/rancher/rke2/server/logs/audit.log

2. Enable Rrancher Audit log

Step 1: Export the current values to a file:

$ helm get values rancher -n cattle-system -o yaml > values.yaml

Step 2: 新增 Audit log 設定

$ cat <<EOF | sudo tee -a values.yaml
auditLog:
  destination: sidecar
  hostPath: /var/log/rancher/audit/
  level: 3
  maxAge: 3
  maxBackup: 1
  maxSize: 100
EOF

Step 3: 更新 Rancher 啟動 Audit log

$ helm upgrade rancher rancher-prime/rancher \
--namespace cattle-system \
-f values.yaml

設定 RKE2 Cluster Pod 總量限制

  1. 點選 “Cluster Management” -> 在要設定的叢集旁邊點選 “Edit Config”

image

  1. 在 Cluster Configuration 的左側選單中點選 “Advanced”,並在 Additional Kubelet Args 區塊下點選 “Add Argument”

image

  1. 輸入以下設定值,並點選右下角 “Save” 套用設定
max-pods=250

max-pods means Number of Pods that can run on this kubelet.

從 Rancher 設定的話,會把以上新增的設定套用到 K8S Cluster 的每個節點上。

image

  1. 回到 “Home”

image

我的 Cluster 有 3 台 Node,所以 250 x 3 = 750
可以參考我做的測試 測試 K8S Pod 數量超過 110 會發生甚麼事?

Trouble shooting

在 Join Master Node 的時候,不小心設定到同一個 node name ,然後 etcd 咬住原來 node 的名稱怎麼辦

錯誤訊息

ETCD join failed: duplicate node name found, please use a unique name for this node

解決辦法

  1. 先進去 etcd 的 pod 中
kubectl -n kube-system exec -it etcd-staging-kube-master-1.fqdn.com -- bash
  1. 列出 etcd 的成員
etcdctl --cert /var/lib/rancher/rke2/server/tls/etcd/server-client.crt --key /var/lib/rancher/rke2/server/tls/etcd/server-client.key --endpoints https://127.0.0.1:2379 --cacert /var/lib/rancher/rke2/server/tls/etcd/server-ca.crt member list

螢幕輸出

121f9e856446fcc4, started, rsm2-f826f76c, https://192.168.11.62:2380, https://192.168.11.62:2379, false
67f4840cc79f9560, started, rsm1-168e267e, https://192.168.11.61:2380, https://192.168.11.61:2379, false
6b20c6a3411cab14, started, rsm3-2126c18e, https://192.168.11.63:2380, https://192.168.11.63:2379, false
  1. 刪除重複的 etcd 成員
etcdctl --cert /var/lib/rancher/rke2/server/tls/etcd/server-client.crt --key /var/lib/rancher/rke2/server/tls/etcd/server-client.key --endpoints https://127.0.0.1:2379 --cacert /var/lib/rancher/rke2/server/tls/etcd/server-ca.crt member remove 6b20c6a3411cab14

螢幕輸出

Member 6b20c6a3411cab14 removed from cluster 9ea915bf6adaa894

手動更新 Cert-manager 做給 Rancher 用的憑證

Rancher 透過 Cert-manager 做出來的憑證,有效期限預設為 90 天,在第 60 天的時候會嘗試自動更換憑證。

  1. SSH 連線至可以執行 kubectl 管理 UpStream Cluster ( Rancher 所在的 Kubernetes Cluster ) 的機器
  2. 下載 Cert-manager 管理工具
$ curl -fsSL -o cmctl.tar.gz https://github.com/cert-manager/cert-manager/releases/latest/download/cmctl-linux-amd64.tar.gz && tar xzf cmctl.tar.gz && sudo mv cmctl /usr/local/bin
  1. 檢查 Rancher 當前使用憑證的有效日期
$ echo | openssl s_client -connect `kubectl -n cattle-system get ing --no-headers -o custom-columns=HOSTS:.spec.rules[*].host`:443 2>/dev/null | openssl x509 -noout -dates

螢幕輸出如下 :

notBefore=Feb 19 05:31:37 2024 GMT
notAfter=May 19 05:31:37 2024 GMT
  1. 手動 Renew Rancher 憑證

4.1. 檢查 Rancher 在 Kubernetes 中使用的憑證名稱

$ kubectl -n cattle-system get certificate

螢幕輸出 :

NAME                  READY   SECRET                AGE
tls-rancher-ingress   True    tls-rancher-ingress   2d21h

4.2. 手動 Renew 憑證

$ cmctl -n cattle-system renew tls-rancher-ingress

螢幕輸出 :

Manually triggered issuance of Certificate cattle-system/tls-rancher-ingress

4.3. 檢查建立憑證的 Request 是否發出

$ kubectl -n cattle-system get certificaterequest --sort-by=.metadata.creationTimestamp

螢幕輸出 :

NAME                        APPROVED   DENIED   READY   ISSUER    REQUESTOR                                         AGE
tls-rancher-ingress-9jb67   True                True    rancher   system:serviceaccount:cert-manager:cert-manager   2d21h
tls-rancher-ingress-m59sk   True                True    rancher   system:serviceaccount:cert-manager:cert-manager   3s
  1. 確認憑證當前狀態的詳細資訊
$ cmctl -n cattle-system status certificate tls-rancher-ingress

螢幕輸出 :

Name: tls-rancher-ingress
Namespace: cattle-system
Created at: 2024-02-16T17:08:39+08:00
Conditions:
  Ready: True, Reason: Ready, Message: Certificate is up to date and has not expired
DNS Names:
- 172.20.0.37.nip.io
Events:
  Type    Reason     Age                   From                                       Message
  ----    ------     ----                  ----                                       -------
  Normal  Requested  13m                   cert-manager-certificates-request-manager  Created new CertificateRequest resource "tls-rancher-ingress-7hdcg"
  Normal  Requested  6m49s                 cert-manager-certificates-request-manager  Created new CertificateRequest resource "tls-rancher-ingress-8hhjl"
  Normal  Reused     2m56s (x6 over 156m)  cert-manager-certificates-key-manager      Reusing private key stored in existing Secret resource "tls-rancher-ingress"
  Normal  Issuing    2m56s (x6 over 156m)  cert-manager-certificates-issuing          The certificate has been successfully issued
  Normal  Requested  2m56s                 cert-manager-certificates-request-manager  Created new CertificateRequest resource "tls-rancher-ingress-m59sk"
Issuer:
  Name: rancher
  Kind: Issuer
  Conditions:
    Ready: True, Reason: KeyPairVerified, Message: Signing CA verified
  Events:  <none>
Secret:
  Name: tls-rancher-ingress
  Issuer Country:
  Issuer Organisation: dynamiclistener-org
  Issuer Common Name: dynamiclistener-ca@1708074590
  Key Usage: Digital Signature, Key Encipherment
  Extended Key Usages:
  Public Key Algorithm: RSA
  Signature Algorithm: ECDSA-SHA256
  Subject Key ID:
  Authority Key ID: bc3674dd7762dca834cb5586c463a2c858d11528
  Serial Number: c9246b491d331f8d197eed83d4de06d5
  Events:  <none>
Not Before: 2024-02-19T14:47:46+08:00
Not After: 2024-05-19T14:47:46+08:00
Renewal Time: 2024-04-19T14:47:46+08:00
No CertificateRequest found for this Certificate

參考網站

Rancher RBAC 實務範例