差異處
這裏顯示兩個版本的差異處。
| 兩邊的前次修訂版 前次修改 下次修改 | 前次修改 | ||
| tech:k3s [2025/11/26 10:37] – NFS Subdir External Provisioner (動態佈建) jonathan | tech:k3s [2026/03/06 11:22] (目前版本) – [7. 如何重啟 K3s cluster 主機] jonathan | ||
|---|---|---|---|
| 行 180: | 行 180: | ||
| ==== NFS Subdir External Provisioner (動態佈建) ==== | ==== NFS Subdir External Provisioner (動態佈建) ==== | ||
| * 已經有 NFS Server 提供給 K3s 共用儲存空間 Exp. nfs - 192.168.1.159 | * 已經有 NFS Server 提供給 K3s 共用儲存空間 Exp. nfs - 192.168.1.159 | ||
| - | * 安裝 NFS Provisioner< | + | |
| + | | ||
| # 使用 Helm 安裝 | # 使用 Helm 安裝 | ||
| helm repo add nfs-subdir-external-provisioner https:// | helm repo add nfs-subdir-external-provisioner https:// | ||
| 行 187: | 行 188: | ||
| --set nfs.server=192.168.1.159 \ | --set nfs.server=192.168.1.159 \ | ||
| --set nfs.path=/ | --set nfs.path=/ | ||
| + | --set nfs.mountOptions=' | ||
| --set storageClass.name=nfs-client \ | --set storageClass.name=nfs-client \ | ||
| - | --set storageClass.defaultClass=false | + | --set storageClass.defaultClass=false \ |
| + | --set storageClass.pathPattern=' | ||
| + | --set storageClass.archiveOnDelete=false | ||
| </ | </ | ||
| 行 207: | 行 211: | ||
| storage: 10Gi # 根據需求調整大小(只是註記, | storage: 10Gi # 根據需求調整大小(只是註記, | ||
| </ | </ | ||
| - | kubectl apply -f app1-static-pv-pvc.yaml | + | kubectl apply -f app1-pvc.yaml |
| </ | </ | ||
| - 驗證 PV 和 PVC 狀態< | - 驗證 PV 和 PVC 狀態< | ||
| kubectl get pv | kubectl get pv | ||
| kubectl get pvc -n default | kubectl get pvc -n default | ||
| + | </ | ||
| + | jonathan@k3s-master-171: | ||
| + | NAME | ||
| + | pv-nfs-subdir-external-provisioner | ||
| + | pvc-ea1739ec-04dd-4549-952b-490bf07ec186 | ||
| + | jonathan@k3s-master-171: | ||
| + | NAME STATUS | ||
| + | app1-data-pvc | ||
| + | pvc-nfs-subdir-external-provisioner | ||
| + | </ | ||
| + | swarm-nfs-159:/ | ||
| + | . | ||
| + | ├── default | ||
| + | │ | ||
| + | : | ||
| </ | </ | ||
| - 部署應用 Exp. app1-deployment.yaml< | - 部署應用 Exp. app1-deployment.yaml< | ||
| 行 220: | 行 239: | ||
| name: app1 | name: app1 | ||
| namespace: default | namespace: default | ||
| + | labels: | ||
| + | app: app1 | ||
| spec: | spec: | ||
| replicas: 1 | replicas: 1 | ||
| 行 232: | 行 253: | ||
| containers: | containers: | ||
| - name: app1 | - name: app1 | ||
| - | image: | + | image: |
| - | | + | |
| - | - containerPort: 8080 | + | args: |
| + | - " | ||
| + | - | | ||
| + | # 建立測試檔案 | ||
| + | echo " | ||
| + | echo " | ||
| + | |||
| + | # 每 60 秒寫入一次心跳 | ||
| + | while true; do | ||
| + | echo " | ||
| + | ls -la /data/ > / | ||
| + | sleep 60 | ||
| + | done | ||
| volumeMounts: | volumeMounts: | ||
| - name: app1-data | - name: app1-data | ||
| - | mountPath: /data # 容器內的掛載路徑 | + | mountPath: /data |
| env: | env: | ||
| - name: DATA_DIR | - name: DATA_DIR | ||
| value: /data | value: /data | ||
| + | resources: | ||
| + | requests: | ||
| + | memory: " | ||
| + | cpu: " | ||
| + | limits: | ||
| + | memory: " | ||
| + | cpu: " | ||
| volumes: | volumes: | ||
| - name: app1-data | - name: app1-data | ||
| persistentVolumeClaim: | persistentVolumeClaim: | ||
| - | claimName: app1-data-pvc | + | claimName: app1-data-pvc |
| </ | </ | ||
| kubectl apply -f app1-deployment.yaml | kubectl apply -f app1-deployment.yaml | ||
| 行 251: | 行 291: | ||
| kubectl get pods -n default | kubectl get pods -n default | ||
| kubectl describe pod < | kubectl describe pod < | ||
| + | </ | ||
| + | swarm-nfs-159:/ | ||
| + | total 12 | ||
| + | -rw-r--r-- | ||
| + | -rw-r--r-- | ||
| + | -rw-r--r-- | ||
| + | swarm-nfs-159:/ | ||
| + | Container started at Wed Nov 26 03:39:31 UTC 2025 | ||
| + | DATA_DIR: /data | ||
| + | swarm-nfs-159:/ | ||
| + | Heartbeat: Wed Nov 26 03:39:31 UTC 2025 | ||
| + | Heartbeat: Wed Nov 26 03:40:31 UTC 2025 | ||
| + | swarm-nfs-159:/ | ||
| + | total 16 | ||
| + | drwxrwxrwx | ||
| + | drwxr-xr-x | ||
| + | -rw-r--r-- | ||
| + | -rw-r--r-- | ||
| + | -rw-r--r-- | ||
| </ | </ | ||
| - 驗證與除錯< | - 驗證與除錯< | ||
| 行 256: | 行 315: | ||
| kubectl get pvc app1-data-pvc -n default | kubectl get pvc app1-data-pvc -n default | ||
| - | # 查看 Pod 內的掛載情況 | + | # 查看 Pod-name |
| - | kubectl exec -it <pod-name> | + | kubectl get pods -n default | grep app1 |
| + | |||
| + | # 查看 Pod 內的掛載情況 | ||
| + | kubectl exec -it app1-584b58d766-qwrqk | ||
| # 測試寫入 | # 測試寫入 | ||
| - | kubectl exec -it <pod-name> | + | kubectl exec -it app1-584b58d766-qwrqk |
| # 在 NFS Server 上確認 | # 在 NFS Server 上確認 | ||
| - | # 檢查檔案是否出現在 192.168.1.159:/ | + | # 檢查檔案是否出現在 192.168.1.159:/ |
| </ | </ | ||
| 行 378: | 行 440: | ||
| </ | </ | ||
| + | === 2-1 如何建立給其他服務通用的 SSL 憑證 === | ||
| + | - 在 DNS 建立一筆萬用記錄, | ||
| + | - 沿用上面的 Cloudflare API Token Secret / ClusterIssuer | ||
| + | - 建立萬用字元憑證 Exp. *.k3s.ichiayi.com -> k3s-certificate.yaml <code yaml> | ||
| + | apiVersion: cert-manager.io/ | ||
| + | kind: Certificate | ||
| + | metadata: | ||
| + | name: wildcard-k3s-ichiayi-com | ||
| + | namespace: default | ||
| + | spec: | ||
| + | secretName: wildcard-k3s-ichiayi-com-tls | ||
| + | issuerRef: | ||
| + | name: letsencrypt-prod | ||
| + | kind: ClusterIssuer | ||
| + | commonName: " | ||
| + | dnsNames: | ||
| + | - " | ||
| + | </ | ||
| + | kubectl apply -f k3s-certificate.yaml | ||
| + | </ | ||
| + | ==== 3. 如何備份 Rancher Web UI ==== | ||
| + | * 參考 - https:// | ||
| + | - 透過 Web UI 的 App Chart 安裝 Rancher Backups \\ {{: | ||
| + | - 在選單新增的 Rancher Backups 選項點選 Buckups -> Create -> 選擇備份的目標 Exp. StorageClasses -> Edit YAML 設定每 8 小時備份一次 \\ {{: | ||
| + | |||
| + | ==== 4. 如何進行 Rancher Web UI 更新 ==== | ||
| + | - 更新 Helm Repository< | ||
| + | - 查看可用的版本< | ||
| + | - 備份當前配置< | ||
| + | - 執行更新< | ||
| + | helm upgrade rancher rancher-stable/ | ||
| + | --namespace cattle-system \ | ||
| + | --reuse-values | ||
| + | </ | ||
| + | - 驗證更新狀態< | ||
| + | kubectl -n cattle-system rollout status deploy/ | ||
| + | kubectl -n cattle-system get pods | ||
| + | </ | ||
| + | * 更新過程中 Rancher UI 會暫時無法訪問 | ||
| + | |||
| + | ==== 5. 如何設定與取消 K3s 自動更新 ==== | ||
| + | === 設定 K3s 自動更新 === | ||
| + | - 安裝 System Upgrade Controller< | ||
| + | kubectl apply -f https:// | ||
| + | </ | ||
| + | - 建立自動升級計畫(監看 k3s 的 stable channel 版本自動升級)< | ||
| + | cat <<EOF | kubectl apply -f - | ||
| + | --- | ||
| + | # Server 升級計畫 | ||
| + | apiVersion: upgrade.cattle.io/ | ||
| + | kind: Plan | ||
| + | metadata: | ||
| + | name: server-plan | ||
| + | namespace: system-upgrade | ||
| + | spec: | ||
| + | concurrency: | ||
| + | cordon: true | ||
| + | nodeSelector: | ||
| + | matchExpressions: | ||
| + | - key: node-role.kubernetes.io/ | ||
| + | operator: In | ||
| + | values: | ||
| + | - " | ||
| + | serviceAccountName: | ||
| + | upgrade: | ||
| + | image: rancher/ | ||
| + | channel: https:// | ||
| + | drain: | ||
| + | force: false | ||
| + | ignoreDaemonSets: | ||
| + | deleteLocalData: | ||
| + | timeout: 300s # 5 分鐘超時 | ||
| + | --- | ||
| + | # Agent 升級計畫 | ||
| + | apiVersion: upgrade.cattle.io/ | ||
| + | kind: Plan | ||
| + | metadata: | ||
| + | name: agent-plan | ||
| + | namespace: system-upgrade | ||
| + | spec: | ||
| + | concurrency: | ||
| + | cordon: true | ||
| + | nodeSelector: | ||
| + | matchExpressions: | ||
| + | - key: node-role.kubernetes.io/ | ||
| + | operator: DoesNotExist | ||
| + | prepare: | ||
| + | args: | ||
| + | - prepare | ||
| + | - server-plan | ||
| + | image: rancher/ | ||
| + | serviceAccountName: | ||
| + | upgrade: | ||
| + | image: rancher/ | ||
| + | channel: https:// | ||
| + | drain: | ||
| + | force: false | ||
| + | ignoreDaemonSets: | ||
| + | deleteLocalData: | ||
| + | timeout: 300s | ||
| + | EOF | ||
| + | </ | ||
| + | - 查看升級進度< | ||
| + | # 查看升級計畫 | ||
| + | kubectl get plans -n system-upgrade | ||
| + | |||
| + | # 查看升級任務 | ||
| + | kubectl get jobs -n system-upgrade | ||
| + | |||
| + | # 查看節點狀態 | ||
| + | watch kubectl get nodes | ||
| + | </ | ||
| + | * ++看執行命令的輸出結果|< | ||
| + | jonathan@k3s-master-171: | ||
| + | NAME IMAGE | ||
| + | agent-plan | ||
| + | server-plan | ||
| + | jonathan@k3s-master-171: | ||
| + | NAME STATUS | ||
| + | apply-agent-plan-on-k3s-worker-173-with-776e91b05dc4d9c78-42442 | ||
| + | apply-server-plan-on-k3s-master-171-with-776e91b05dc4d9c7-b57b4 | ||
| + | jonathan@k3s-master-171: | ||
| + | NAME STATUS | ||
| + | apply-agent-plan-on-k3s-worker-172-with-776e91b05dc4d9c78-0fa71 | ||
| + | apply-agent-plan-on-k3s-worker-173-with-776e91b05dc4d9c78-42442 | ||
| + | apply-server-plan-on-k3s-master-171-with-776e91b05dc4d9c7-b57b4 | ||
| + | jonathan@k3s-master-171: | ||
| + | NAME STATUS | ||
| + | apply-agent-plan-on-k3s-worker-172-with-776e91b05dc4d9c78-0fa71 | ||
| + | apply-agent-plan-on-k3s-worker-173-with-776e91b05dc4d9c78-42442 | ||
| + | apply-server-plan-on-k3s-master-171-with-776e91b05dc4d9c7-b57b4 | ||
| + | </ | ||
| + | * ++看 Rancher Cluster Nodes 的畫面|{{: | ||
| + | |||
| + | === 取消 K3s 自動更新 === | ||
| + | - 刪除 Plan(停止所有自動升級)< | ||
| + | - 修改為固定版本 Exp. v1.33.6+k3s1(不再自動追蹤新版本)< | ||
| + | - 刪除整個 controller(完全停用)< | ||
| + | |||
| + | ==== 6. 如何設定 K3s 自動更新結果透過 Discord 通知 ==== | ||
| + | - 取得 Discord Webhook URL Exp. https:// | ||
| + | - 修改配置並部署< | ||
| + | # 下載 k3s-discord-notifier.yaml | ||
| + | curl -o k3s-discord-notifier.yaml https:// | ||
| + | |||
| + | # 替換你的 Discord Webhook URL Exp. https:// | ||
| + | sed -i ' | ||
| + | |||
| + | # 修改叢集名稱(可選) Exp. ichiayi K3s | ||
| + | sed -i ' | ||
| + | |||
| + | # 部署 Discord 通知 | ||
| + | kubectl apply -f k3s-discord-notifier.yaml | ||
| + | </ | ||
| + | - 驗證部署< | ||
| + | # 檢查 notifier 是否運行 | ||
| + | kubectl get deployment -n system-upgrade k3s-upgrade-notifier | ||
| + | |||
| + | # 查看日誌 | ||
| + | kubectl logs -n system-upgrade -l app=k3s-upgrade-notifier -f | ||
| + | |||
| + | # 測試 Discord 升級成功通知 | ||
| + | cat <<EOF | kubectl apply -f - | ||
| + | apiVersion: batch/v1 | ||
| + | kind: Job | ||
| + | metadata: | ||
| + | name: test-notify-success | ||
| + | namespace: system-upgrade | ||
| + | labels: | ||
| + | upgrade.cattle.io/ | ||
| + | upgrade.cattle.io/ | ||
| + | spec: | ||
| + | template: | ||
| + | metadata: | ||
| + | labels: | ||
| + | upgrade.cattle.io/ | ||
| + | spec: | ||
| + | containers: | ||
| + | - name: test | ||
| + | image: busybox | ||
| + | command: [" | ||
| + | restartPolicy: | ||
| + | backoffLimit: | ||
| + | EOF | ||
| + | |||
| + | # 測試 Discord 升級失敗通知 | ||
| + | cat <<EOF | kubectl apply -f - | ||
| + | apiVersion: batch/v1 | ||
| + | kind: Job | ||
| + | metadata: | ||
| + | name: test-notify-fail | ||
| + | namespace: system-upgrade | ||
| + | labels: | ||
| + | upgrade.cattle.io/ | ||
| + | upgrade.cattle.io/ | ||
| + | spec: | ||
| + | template: | ||
| + | metadata: | ||
| + | labels: | ||
| + | upgrade.cattle.io/ | ||
| + | spec: | ||
| + | containers: | ||
| + | - name: test | ||
| + | image: busybox | ||
| + | command: [" | ||
| + | restartPolicy: | ||
| + | backoffLimit: | ||
| + | EOF | ||
| + | |||
| + | |||
| + | 清理測試 Job | ||
| + | # 刪除測試 Job | ||
| + | kubectl delete job test-notify-success test-notify-fail -n system-upgrade | ||
| + | </ | ||
| + | * Discord 頻道應該可以看到這樣的測試通知訊息 \\ {{: | ||
| + | |||
| + | ==== 7. 如何確認目前K3s 穩定版最新的版本 ==== | ||
| + | * < | ||
| + | <a href=" | ||
| + | </ | ||
| + | * 穩定版 : **v1.34.5+k3s1** | ||
| + | |||
| + | ==== 8. 如何重啟 K3s cluster 主機 ==== | ||
| + | * 原則 : 先重啟 Server 完成恢復服務後, | ||
| + | * 可參考執行 [[tech/ | ||
| {{tag> | {{tag> | ||