README

👋 歡迎來到我的 Blog!

  • 這是第一次嘗試使用 GitHub Actions 所建立的 Blog,順便作為個人筆記的專案。

🌉 Gateway API:使用 Envoy Gateway

前幾篇文章使用了 cert-manager 產生 Private CA,並且安裝 MetalLB 讓 Kubernetes Cluster Service 可以被外部流量訪問,現在來試試看透過 Private CA 簽一個 Wildcard 憑證,並且安裝 Envoy Gateway 設定 SSL Termination,讓外部連線到 Jenkins 的流量可以被加密。 Kubernetes 中安裝 cert-manager 並產生 Private CA Kubernetes 外部存取:MetalLB 裸機安裝與連線測試 Jenkins:安裝 Jenkins 在 Kubernetes 安裝 Envoy Gateway 安裝: helm install eg oci://docker.io/envoyproxy/gateway-helm --version v1.6.1 -n envoy-gateway-system --create-namespace 確認服務處於有效狀態: kubectl wait --timeout=5m -n envoy-gateway-system deployment/envoy-gateway --for=condition=Available 安裝 GatewayClass、Gateway 首先建立一個 namespace 名為 gateway Wildcard Certificate 使用先前產生的 Cluster Issuer my-ca-issuer 去簽,並且放到 gateway namespace Gateway 設定 Wildcard Certificate 並且允許所有 namespace 都可以在其掛 Routes,此 Obejct 同樣放到 gateway namespace 使用指令 kubectl get gateway -n gateway eg,查看 Gateway 取得的 External IP 是多少 apiVersion: v1 kind: Namespace metadata: name: gateway --- apiVersion: cert-manager.io/v1 kind: Certificate metadata: name: wildcard-k8s-wcya-test namespace: gateway spec: secretName: wildcard-k8s-wcya-test-tls issuerRef: name: my-ca-issuer kind: ClusterIssuer commonName: "*.k8s.wcya.test" dnsNames: - "*.k8s.wcya.test" --- apiVersion: gateway.networking.k8s.io/v1 kind: GatewayClass metadata: name: eg spec: controllerName: gateway.envoyproxy.io/gatewayclass-controller --- apiVersion: gateway.networking.k8s.io/v1 kind: Gateway metadata: name: eg namespace: gateway spec: gatewayClassName: eg listeners: - name: https protocol: HTTPS port: 443 tls: mode: Terminate certificateRefs: - kind: Secret group: "" name: wildcard-k8s-wcya-test-tls allowedRoutes: namespaces: from: All 安裝 HTTPRoute 為 Jenkins Service 建立 HTTPRoute,並且 Gateway 設定剛剛建立的 eg ...

December 21, 2025 · 2 分鐘 · Wayne Yang

🤵 Jenkins:建立 GitHub Branch Source 的 Multibranch Pipleline

目的 在上一篇『Jenkins:安裝 Jenkins 在 Kubernetes』將 Jenkins 安裝在 Kubernetes 後,現在來試試看搭配 GitHub 去使用 Multibranch Pipelines 自動化管理 Pipeline Jobs。 Dynamic Agents 透過 Helm Chart 安裝 Jenkins 時,預設會安裝 Kubernetes Plugin,可以在 Kubernetes Cluster 內動態的為 Jenkins agents 建立 Pod 而不用手動去建立 static agents。 事前準備 架構連線的方式為 GitHub App 在發生 events 時會送請求到 Jenkins Webhook,由於我的 Kubernetes Cluster 是在我的 Lab 環境,且沒有固定的外部 IP Addresses 或 Domain Names,這邊我使用 Hookdeck 的 CLI 工具將來自 GitHub App 的 events 轉送往我 Kubernetes Lab 環境為 Jenkins 建立的 External IP。 在申請完 Hookdeck 帳號後,網站會引導你建立第一個 Connection,需要填的資訊約如下: ...

December 20, 2025 · 4 分鐘 · Wayne Yang

🤵 Jenkins:安裝 Jenkins 在 Kubernetes

事前準備 設定 Helm Repository helm repo add jenkinsci https://charts.jenkins.io helm repo update # 可以使用以下指令查詢 Jenkins repo 存在的 charts helm search repo jenkinsci 建立 Namespace kubectl create namespace jenkins 建立持久性儲存 PV 如果測試環境是使用 minikube,可直接參考 官網範例 建立 Local StorageClass,但需要能接受當節點不可被調度(如 CPU 使用率滿載)造成服務中斷跟資料遺失等等風險 使用 Dynamic provisioner (例如:Rook),則不用手動建立 PV 這邊使用 Local StorageClass 為例,這種方式有個好處,因為設定 WaitForFirstConsumer 時,可以延遲 Volume Binding 讓 scheduler 可以考慮所有 constrains,因此當 Local PV 建立好後,之後建立的 Pod 使用 Local StorageClass 時就會自動被調度到 PV 的節點上,參考官網 Volume local。 需要先決定 Local PV 要建立在哪個節點,這邊選用我的節點 k8s-1。 ...

November 25, 2025 · 4 分鐘 · Wayne Yang

🤖 Slack 機器人:訂便當機器人

為什麼有這個 side project 過往工作的團隊都是跟外面店家訂午餐,並且有各種門檻:需要滿多少錢 or 需要幾份以上才能外送。這造成負責訂餐的同仁需要先統計資訊後才能向店家訂餐,且都是大家透過 Slack 傳訊息給負責人,不只耗費人力去統計且偶爾會出錯造成餐點數量不對。 這個 side project 就是為了減少這件事所耗費的人力與時間成本,讓收集、統計訂單資訊的這種工作更有效率和降低出錯機率。 這個 project 是使用 Bolt for Python 建立 socket mode 的 Slack app,這模式有不用固定 IP、不用域名、不用合法 SSL 憑證等等優勢。 Demo 注意事項 此專案是使用 socket mode,沒辦法部屬到 Slack Marketplace。建議只在公司內部、私人 workspace 使用。 如果同時運作兩個 socket mode app,原則上應該會踢出第一個 app,但因為使用 docker compose 且設定 restart: always 的關係,可能兩個 app 會持續重新啟動互相競爭,造成功能異常。 重頭建立 Slack app 你可以直接使用我已經設定好的 manifest 檔案去建立 Slack app,跳至 Create your app from a manifest 建立你的 Slack app:使用 from scratch 的方式,建立之後你將進入你的 Slack app 基本資訊頁面。或從 Your Apps 進入剛剛建立的 Slack app。 啟用 Socket Mode 與建立 App-level token:點選側邊欄的 Socket Mode,將 Enable Socket Mode 的 Toggle Button 開啟,這將協助你建立 App-level token 和需要的 Scope。建立完後可將 App-level token 先複製下來,此 Token 應該由 xapp- 開頭。 設定 Slash Commands:點選側邊欄的 Slash Commands,點選 Create new Command,指令名稱可隨意,例如: Command:/order Short Description:開啟午餐訂單 調整 Bot Token Scopes:點選側邊欄的 OAuth & Permissions,滾動到 Scopes 部份的 Bot Token Scopes 區域,點選 Add an OAuth Scope 新增以下 scopes: commands:上面開啟 Slash Commands 就會新增了 chat:write:Slack app 發送訊息到頻道 pins:write:透過 /order slash command 開啟的訊息會被 pined 安裝 Slack App 到 Workspace:點選側邊欄的 Install App,點選 Install to {Your workspace}。安裝完後同頁面會出現 Bot User OAuth Token,應該為 xoxb- 開頭,同樣複製起來。 將 Slack App 加入某個 Slack 頻道: 打開你的 Slack 對 Slack 頻道按右鍵,點選 View channel details 切到 Integrations 分頁 按 Add an App,選擇剛剛建立的 Slack app 使用 manifest 檔案建立 Slack app 建立你的 Slack app:使用 from a manifest 的方式,貼上以下 manifest json 建立好 Slack app 後,一樣需要將其安裝到 Workspace 和從 Slack 頻道加入 App { "display_information": { "name": "slack-order" }, "features": { "bot_user": { "display_name": "slack-order", "always_online": false }, "slash_commands": [ { "command": "/order", "description": "開啟午餐訂單", "should_escape": false } ] }, "oauth_config": { "scopes": { "bot": [ "chat:write", "commands", "pins:write" ] } }, "settings": { "interactivity": { "is_enabled": true }, "org_deploy_enabled": false, "socket_mode_enabled": true, "token_rotation_enabled": false } } 運作 Slack app 透過 docker compose 去運行 app,所以主機需要先安裝 Docker Engine clone 專案 git clone https://github.com/WCYa/slack-order.git 從範例複製環境變數設定檔 cd slack-order cp env_template .env 編輯 .env,新增以下兩個 tokens SLACK_APP_TOKEN=‘xapp-…’ SLACK_BOT_TOKEN=‘xoxb-…’ 運行 docker compose up # or run container in background docker compose up -d

November 24, 2025 · 2 分鐘 · Wayne Yang

🌐 Kubernetes 外部存取:MetalLB 裸機安裝與連線測試

目的 一般情況下要讓外部使用者使用 Kubernetes 的服務時,需要透過 External Load Balancers 如 Cloud Provider (GCP、AWS、Azure…),但在使用 bare metal Kubernetes clusters 時,Kubernetes 沒有提供原生的這種 Network Load Balancers,如果要讓外部使用者能連線到 bare metal cluster 內部的服務時,通常是使用 NodePort 和 ExternalIPs service,但這兩種在生產環境使用都有著缺點。 MetalLB 的目的就是與標準網路設備做整合,使用標準的路由協定使在 bare-metal clusters 內的 對外部的服務 可以正常運作。 MetalLB 提供兩種模式:BGP mode 和 Layer 2 mode,BGP mode 才能實現真正的跨多節點均衡負載,但因為我只是測試用途所以採用 Layer 2 mode。 MetalLB 在做什麼 MetalLB 會同時作到兩個功能去提供此服務:IP 位址分配、向外部宣告 IP 是存在於這個 cluster。 IP 位址分配:你需要提供 IP Pools 給 MetalLB,其餘的事例如分配、取消分配、追蹤都由 MetalLB 處理。Private/Public 的 IPV4/IPV6 你要獨立提供或是一起提供都可以,取決於你的環境和租用的 IPs 向外部宣告 IP:向 cluster 所在的網路宣告,這個 IP 存在我這個 cluster,宣告方式取決於所使用的模式為何:ARP、NDP、or BGP 關於 Layer 2 模式 在 Layer 2 模式下,是一個節點負責向本地網路宣告某個 Service IP,故所有流到此 Service IP 的流量都先經過這台節點,之後才由 kube-proxy 去分散流量到此 Service 的所有 Pods。故 Layer 2 模式未實現真正的網路負載平衡,而是實現故障轉移的功能,故障轉移的偵測是使用 memberlist 實現。 ...

November 23, 2025 · 3 分鐘 · Wayne Yang