Mark Ku's Blog

時空背景

因為公司的容器越來越多,好幾台的Docker desktop ,實在不好調度及橫向擴展,因此花了些時間研究,如何在 Docker Desktop for windows 裡安裝jenkins 整合 K8s。

為什麼要用 Kubernetes

  1. 按需的垂直擴展,新的服務器(node)能夠輕易的增加或刪除,叢集內的溝通
  2. 依據需自動橫向擴展,縮減資源能力
  3. 服務及效能監控
  4. Auto Recovery
  5. 伺服器資源,最佳化
  6. 負載平衡 ( 分流 )
  7. 服務融斷
  8. 自動部署和回滾,如果應用狀態錯誤,可以實現自動回滾
  9. 混合雲佈署

為什麼使用Windows kubernetes

公司沒Linux Server ,多數成員不擅長用 Linux

佈署流程

Kubernetes deployment flow
Kubernetes deployment flow

預先準備

1.安裝Docker Desktop,並勾選 Kubernetes 及 Show system containers

setup widnows docker P.S. 按下 apply 後會自動建立 %USERPROFILE%.kube\config 連線的檔案

2. 架設Private Docker registry server

docker run -d -p 5000:5000 -e REGISTRY_STORAGE_DELETE_ENABLED=true --name registry registry:2
docker update --restart always registry

3. 設定 Docker Engine,加入private ip

 "insecure-registries": [
    "192.168.50.49:5000"
  ]  

P.S. 192.168.50.49 為我的實驗機IP,可透過訪問 http://192.168.50.49:5000/v2/_catalog 檢查目前私有的docker hub 有那些映像檔

設定 Kubernetes

Dashboard

kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml

kubectl get pod -n kubernetes-dashboard

kubectl proxy

訪問此目錄
http://127.0.0.1:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/#/login

首先我們來,建立 Token (這個token 是要拿去給jenkins 用的)

kubectl describe secrets -n kube-system (kubectl get secrets -n kube-system | Select-String "dashboard" | ForEach-Object { $_ -split " " | Select-Object -First 1 })

查詢 Token

$TOKEN=((kubectl -n kube-system describe secret default | Select-String "token:") -split " +")[1]
kubectl config set-credentials docker-for-desktop --token="${TOKEN}"
echo $TOKEN
get-token
get-token

也可以透過config 查詢 token

kubectl config view // 同等於訪問 %USERPROFILE%\.kube\config
kube config
kube config

Jenkins 配置 Kubernetes

安裝 Jenkins

參考先前撰寫的文章

在Jenkins 容器中中安裝 kubectl

docker exec -it -uroot jenkins bash // 進入jenkins 容器中
curl -LO https://storage.googleapis.com/kubernetes-release/release/v1.29.1/bin/linux/amd64/kubectl // 下載 kubectl
chmod +x ./kubectl // 給予權限
mv ./kubectl /usr/local/bin/kubectl // 複製到系統環境資料夾
kubectl version --client // 查詢版本

P.S. Docker Desktop 和 Jenkins 容器的 kubectl 版本最好一致

複製 kubectl 設定至 Jenkins 容器中 (需要逐行執行)

docker exec -it -uroot jenkins /bin/bash 
mkdir -p /.kube
exit 
docker cp C:/Users/Mark/.kube jenkins:/root/.kube // 複製檔案到 Jenkins 容器中

Jenkins 透過 Kubernetes CLI 連線 kubernetes

  1. 要想把jenkins關聯到Kubernetes中需要安裝幾個最件,打開 系統管理 > 套件管理
  • Kubernetes plugin
  • Kubernetes CLI Plugin install kubernetes plugin
  1. set up cloud set up cloud
  2. set Disable https certificate check => true disable http certificate check
  3. Kubernetes URL => kubectl cluster-info https://host.docker.internal:6443
  4. Jenkins URL Jenkins URL:http://host.docker.internal:8080/ Jenkins tunnel:host.docker.internal:50000
  5. Credentials => add public key to jenkins
  6. Copy dashboard token to here Copy dashboard token to here

撰寫 Jenkins pipeline

properties([pipelineTriggers([githubPush()])])
pipeline {
    agent any 

    environment {
        tag = ':latest'
        imageShortName = 'de-next-ap'
        imageName = "${imageShortName}${tag}"
        containerName = "${imageShortName}-1"
        containerUrl = "192.168.50.49:2376"
        dockerfile = "./Dockerfile"        
        registry = "192.168.50.49:5000/next-ec"				
		
    }   
   
    stages {
        stage("GitHub Pull") {
             steps {
                git branch: 'main', 
                credentialsId: '946a703f-dff7-4138-84b2-0aba700dedca', 
                url:  '[email protected]:markku636/ec.git/'
            }
            
        }
		
        stage("Building Docker Image") {
			steps {
				script {
					dockerImage = docker.build "$registry:latest"
				}
			}
		}
		
		stage("Deploying to Registry Server") {
			steps {
				script {
					docker.withRegistry("http://192.168.50.49:5000", "") {
						dockerImage.push()
					}
				}
			}
		}
		
		stage("Cleaning Up") {
			steps {
				sleep(time: 3, unit: "SECONDS")

				sh "docker rmi --force $registry:latest"
			}
		}
			
        stage("Deply") {
             steps {
                    withKubeConfig([credentialsId: 'k8s-secret', serverUrl: 'https://host.docker.internal:6443']) {                     
                     sh 'kubectl apply -f ./next-js-deployment.yaml'
                    }
                
             }
        }    			        
    }
}

在 Github next-ec 專案裡建立 Kubernetes 的 YAML 佈署設定檔(next-js-deployment.yaml)

apiVersion: v1
kind: Deployment
metadata:
  name: nextjs-deployment
  labels:
    app: nextjs
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nextjs
  template:
    metadata:
      labels:
        app: nextjs
    spec:
      containers:
      - name: nextjs
        image: 192.168.50.49:5000/next-ec:latest
        ports:
        - containerPort: 80
        resources:
          limits:
            memory: "128Mi"
            cpu: "500m"

---

apiVersion: v1
kind: Service
metadata:
  name: nextjs-service
spec:
  type: NodePort
  selector:
    app: nextjs
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
    nodePort: 30099

此時執行 Jenkins 執行建置,應該己經可以執行成功。 Jenkins 執行結果

結論

K8S 功能及配置還蠻複雜的,光配置就花蠻多時間,蠻多細節還需要花些時間實驗及測試。

其他遇到問題

1. no matcher for kind "Deploy" in version v1 問題

yaml 檔改了幾次版本,請依據官方文件撰寫最新的 YAML 佈署檔

2. kubectl: command not found

需要在Jenkins 容器中安裝 kubectl

參考資料

作者

Mark Ku

擁有 10+ 年經驗的資深軟體工程師,現為 AI 應用 Builder,專注於大型平台架構與簡化複雜系統設計,從電商系統到訂閱與收費平台,結合 AI Agent、AI 整合與自動化開發,打造高效率且可持續演進的產品技術基礎。閱讀更多

覺得這篇有幫助?

作者做的免費工具、每日 Podcast 與電子報,都在這裡。

Mark Ku · 本文採用 CC BY 4.0 授權,轉載請註明作者並附上原文連結。

留言

訂閱電子報

訂閱後即時收到新文章通知,不錯過任何技術分享。

提交即表示同意接收電子報,隨時可

熱門文章

View all
Mark Ku
··604

Oracle Cloud 永久免費方案 Linux 主機及固定 IP :0 元打造雲端解決方案

Oracle Cloud 永久免費方案 Linux 主機及固定 IP :0 元打造雲端解決方案
Mark Ku
··471

告別 Postman 收費陷阱!開源 Git 原生 API 測試神器 Bruno 實戰指南

告別 Postman 收費陷阱!開源 Git 原生 API 測試神器 Bruno 實戰指南
Mark Ku
··329

一款免費開源類似於 Notion 類知識庫系統 — Outline Wiki 佈署與備份全攻略

一款免費開源類似於 Notion 類知識庫系統 — Outline Wiki 佈署與備份全攻略
Mark Ku
··240

打造高效 API 管理平台:從 0 開始部署 Kong Gateway - Part 1

打造高效 API 管理平台:從 0 開始部署 Kong Gateway - Part 1
Mark Ku
··235

訓練自己的 AI 語音:硬體門檻、開源模型比較與 LoRA 微調

訓練自己的 AI 語音:硬體門檻、開源模型比較與 LoRA 微調
Mark Ku
··216

在 Ubuntu 上設置 Samba 來共享資料夾,讓 Windows 11 用戶可以存取

在 Ubuntu 上設置 Samba 來共享資料夾,讓 Windows 11 用戶可以存取