正好最近新弄,記一下流程

curl -sfL https://get.k3s.io | sh - 
~# kubectl get nodes
NAME      STATUS   ROLES           AGE   VERSION
chunk01   Ready    control-plane   19s   v1.36.3+k3s1
cat /var/lib/rancher/k3s/server/node-token

記下上面的token,目前master就完成了

到其它worker執行指令

curl -sfL https://get.k3s.io | K3S_URL=https://1.2.3.4:6443 K3S_TOKEN=K10b0c5b2cd2f5fbbeca19ee4c0fb3b9dc20d8511a9f16b23a90100daf856eadd55::server:12b6247168b4ce1122d27925fa03e41f sh -s - agent

記得替換成你的token和剛剛先前裝好的master ip

如果你不小心裝了但沒成功指定後面的參數,它就會自己成為master,使用以下指令移除

再來裝ARGO

kubectl create namespace argocd
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml

有錯誤,但它是可以直接強制的

"The CustomResourceDefinition "applicationsets.argoproj.io" is invalid: metadata.annotations: Too long: may not be more than 262144 bytes"

k3s kubectl apply --server-side --force-conflicts -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml

稍待一下檢查

kubectl get pods -n argocd
NAME                                                READY   STATUS    RESTARTS   AGE
argocd-application-controller-0                     1/1     Running   0          95s
argocd-applicationset-controller-579c4c54b8-k4pwj   1/1     Running   0          95s
argocd-dex-server-744c5d4467-9h6hv                  1/1     Running   0          95s
argocd-notifications-controller-dd4ff84c-wdxtz      1/1     Running   0          95s
argocd-redis-84497fb7c5-zmx9b                       1/1     Running   0          95s
argocd-repo-server-5f46d9f598-9r6j9                 1/1     Running   0          95s
argocd-server-7f4549bb69-cbdxp                      1/1     Running   0          95s

這樣就是有成功了

再來是給它打個洞(因為是展示機,就直接打洞,請視情況

kubectl patch svc argocd-server -n argocd -p '{"spec": {"type": "NodePort", "ports": [{"port": 80, "targetPort": 8080, "nodePort": 32080}, {"port": 443, "targetPort": 8081, "nodePort": 32443}]}}'

這樣外部就可以連32443

再來找出密碼

kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d; echo
Zq9grs98xILBU1ZY  <--

然後打開browser,輸入你的IP和PORT號,帳號是"admin" 然後剛剛的"密碼",就能正常登入了

再來做點簡單的應用走一下流程。

[寫好 Node.js] ──> [推送到 Git] ──> [GitHub Actions 打包] ──> [推送到 Registry (ECR/ACR)]  │
                                                                                                                                                       │
[K8s 運行中] <── [ArgoCD 自動拉取] <── [更新 Git 裡的 YAML/Kustomize]            <───────

所以以上面正常流程,需要準備Github, Docker Hub 兩邊帳號或是自架替代

Github 建立兩個專案,請看my-node-app my-app-infra

兩個都照抄就行了,但要改

回到原本放 Node.js 原始碼(有 Dockerfile)的那個 Git 倉庫。
設定密鑰 (Secrets)到 GitHub 專案的 Settings -> Secrets and variables -> Actions
新增三個密鑰:DOCKERHUB_USERNAME: 您的 Docker Hub 帳號。
DOCKERHUB_TOKEN: 您的 Docker Hub 密碼或 Access Token。
INFRA_REPO_TOKEN: 一組具備寫入權限的 GitHub Personal Access Token (PAT),讓機器人可以跨倉庫去修改 my-app-infra 的檔案。

至於node的測試檔和打包都也是現成的

/.github/workflows/deploy.yml
overlays/prod/kustomization.yaml

記得都要全部替換成你的Docker Hub and Github的。

再來檢查

第一步:在 GitHub 建立「程式碼」與「Infra」兩個倉庫
您需要在 GitHub 上建立 2 個分開的 Git 倉庫(Repository)
  1. 第一個倉庫:my-node-app(放寫好的 Node.js 程式)
    • 把剛才做好的 server.jspackage.jsonDockerfile 推送上來。
    • 先不要加 .github/workflows/deploy.yml,我們等一下設定完密鑰再放。
  2. 第二個倉庫:my-app-infra(專門放 K8s 設定檔)
    • 這個倉庫非常重要。請在裡面建立我上一回提供的 Kustomize 結構檔案(也就是 base/ 目錄與 overlays/ 目錄那 4 個 YAML 檔)。
    • 請確保裡面的帳號都已經是您的 kelvin666888111/nodejs-app
第二步:生成 GitHub 跨倉庫密鑰 (PAT)
因為「Node.js 機器人」打包完後,必須跨倉庫去修改「Infra 倉庫」裡的版本號,我們必須給它鑰匙。
  1. 點擊 GitHub 右上角頭像 -> Settings -> 左側最下方 Developer Settings
  2. 選擇 Personal access tokens -> Tokens (classic)
  3. 點擊 Generate new token (classic)
  4. Note 輸入:k8s-gitops-token
  5. Scopes(權限)勾選 repo 全套權限(這樣機器人才能幫你推程式碼)。
  6. 點擊最下方生成,把那串以 ghp_ 開頭的超長密鑰複製下來(它只會出現一次!)。
第三步:在 Node.js 倉庫設定密鑰並啟動 Actions
回到第一個 my-node-app (Node.js) 的 GitHub 倉庫網頁。
  1. 點擊功能表的 Settings -> 左側 Secrets and variables -> Actions
  2. 點擊 New repository secret,依序建立三個鑰匙:
    • 名稱DOCKERHUB_USERNAME / 內容kelvin666888
    • 名稱DOCKERHUB_TOKEN / 內容(您的 Docker Hub 密碼)
    • 名稱INFRA_REPO_TOKEN / 內容(剛才步驟二複製的 ghp_... 超長密鑰)
  3. 正式啟動
    • 在本地的 Node.js 專案中,補上 .github/workflows/deploy.yml 檔案。
    • 將它 git commitgit push 到 GitHub。
    • 這時去 GitHub 網頁的 Actions 分頁,您就會看到一個藍色(或綠色)的轉圈圈正在進行自動打包與推播!

Docker hub 權限要給R&W,因為要PUSH Image上去!

最後就是打開ARGO

+ NEW APP 按鈕,右側會彈出一個設定選單,請依序填入以下內容:

📋 【General】基本設定
  • Application Name: my-nodejs-app (自己取名)
  • Project Name: default
  • Sync Policy: 建議先選 Manual (手動),等熟練了再改 Automatic, 等下可以方便測試
📋 【Source】你的 K8s 設定檔在哪?
  • Repository URL: 貼上您建立的 my-app-infra(Infra 倉) 的 GitHub 公開網址。
  • Revision: 填寫 HEADmain
  • Path: 填寫 overlays/prod(告訴 ArgoCD 我們要跑生產環境的 Kustomize 配置)。
📋 【Destination】要部署到哪裡?
  • Cluster URL: 下拉選單直接選 https://default.svc(代表部署在目前的 K3s 本地叢集)。
  • Namespace: 填寫 default
  1. 填完後,點擊最上方的 CREATE 按鈕。
  2. 畫面上會出現一個顯示為 OutOfSync 的卡片。大膽點擊卡片上的 SYNC 按鈕,然後點 SYNCHRONIZE 執行!

最後就是打開網站,就能見到

然後來測試,請修改程式碼,然後commit,推上Git

它現在是正常"綠"色,會變成"橘"色的,這時可以手動按一下同步,它就會自動更新上去。
更新後仔細看"Rev.?" 是會自動變化的

再來,如果有了改壞,但已怖署了,該怎麼回滾? GitOps

最快的方法是再到Git上回滾,這是最好的,因為可以留下記錄

當發現 V2 版有嚴重的 Bug、想退回 V1 時,操作邏輯與日常開發一模一樣:
  1. 回到您的 my-app-infra(K8s 設定檔倉庫)
  2. 點進 overlays/prod/kustomization.yaml
  3. 點擊編輯,把 newTag: 後面那串 V2 的 Git SHA 亂碼,手動改回上一版 V1 的 Git SHA 亂碼,然後 Commit 儲存。
  4. 回到 ArgoCD 網頁:ArgoCD 會立刻發現「Git 上的版本」與「目前 K8s 跑的版本」不一樣,畫面再次亮起黃色的 OutOfSync
  5. 點擊 SYNC:K8s 就會啟動滾動更新,安全地把 V2 容器停掉,無縫換回 V1 容器。

第二個是直接在ARGO上面點"HISTORY AND ROLLBACK",它也能馬上解決,但最終還是得回到Git去修改,留下記錄。

再說一下為什麼直接改,因為要快點滅火,在有發現的前提下,當然正確來說,在上新之前的QA應該早就發現了,只是常有萬一……

「既然要回滾,為什麼不是回去原本的 my-node-app(Node 倉)用 Git 倒退(Reset/Revert)然後 Push 呢?」
在實務上,這兩種「Push」都可以達到回滾效果,但速度與目的不同:
  • 作法 1:去 my-app-infra 修改並 Push(剛剛介紹的方法 A)
    • 特點速度最快。因為 V1 的 Image 之前早就打包好存在 Docker Hub 了,我們直接改 Infra 倉的 YAML 標籤 [4],地端 K8s 就能在 10 秒內直接拉下現成的舊 Image 換上去。
  • 作法 2:去 my-node-app 執行 git revert 並 Push
    • 特點:會重新觸發 GitHub Actions 流程。機器人會把舊程式碼「重新包成一個全新名稱的 V3 映像檔(雖然內容跟 V1 一樣)」,再自動 Push 到 Docker Hub、自動改寫 Infra 倉。
    • 缺點:要重新經歷一次 Docker 打包與推播,速度比較慢(需要 1~2 分鐘),不適合緊急救火。

測試後,就可以改成自動SYNC了。只要一有commit 就能自動跑完全程。

Joomla templates by a4joomla