🌉 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

🌐 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

🔐 Kubernetes 中安裝 cert-manager 並產生 Private CA

⚠️ 僅用於測試用途 安裝 透過 Helm 安裝 cert-manager,首先下載簽署 cert-manager chart 的 GPG keyring,且在安裝時用此 GPG keyring 來驗證我們從 OCI Registry 下載的 chart curl -LO https://cert-manager.io/public-keys/cert-manager-keyring-2021-09-20-1020CF3C033D4F35BAE1C19E1226061C665DF13E.gpg helm install \ cert-manager oci://quay.io/jetstack/charts/cert-manager \ --version v1.19.1 \ --namespace cert-manager \ --create-namespace \ --verify \ --keyring ./cert-manager-keyring-2021-09-20-1020CF3C033D4F35BAE1C19E1226061C665DF13E.gpg \ --set crds.enabled=true 產生 Private CA 對應的 Custom Resources 以下為範例的 manifest 檔案,命名為 root_ca.yaml apiVersion: cert-manager.io/v1 kind: ClusterIssuer metadata: name: selfsigned-issuer spec: selfSigned: {} --- apiVersion: cert-manager.io/v1 kind: Certificate metadata: name: my-selfsigned-ca namespace: cert-manager spec: isCA: true commonName: my-selfsigned-ca secretName: root-secret privateKey: algorithm: ECDSA size: 256 issuerRef: name: selfsigned-issuer kind: ClusterIssuer group: cert-manager.io subject: organizations: - WCYa Example Inc. countries: - TW organizationalUnits: - Internal PKI localities: - Taipei --- apiVersion: cert-manager.io/v1 kind: ClusterIssuer metadata: name: my-ca-issuer spec: ca: # `ClusterIssuer` resource is not namespaced, so `secretName` is assumed to reference secret in `cert-manager` namespace. secretName: root-secret 這些 Custom Resources 的用途: ...

November 22, 2025 · 1 分鐘 · Wayne Yang