前言
隨著容器化技術的普及,部署 Web 應用到 Kubernetes(K8s)已經成為現代開發中常見的實踐。本教程將從零開始,引導您構建並部署一個簡單的 Java Spring Boot Web 應用到 Kubernetes 叢集,覆蓋從程式碼開發到容器化再到叢集部署的完整流程。
本文一共包含三個部分:使用 Java Spring Boot 構建一個簡單的 Hello World Web 應用、編寫 Dockerfile 構建映象將應用容器化、使用 labs.play-with-k8s.com 快速體驗 Kubernetes 的部署與執行。
構建一個 hello world web 應用
我們可以使用
Spring Initializr
快速生成一個 Spring Boot 專案,也可以使用 ide 腳手架工具幫助我們快速構建一個簡單的 Hello World Web 應用,此部分內容比較簡單大家可以選擇合適的方式構建。
專案結構
專案核心檔案
HelloWorldController.java package org.demo.springwebwithk8s.controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class HelloWorldController { @RestController public class HelloController { @GetMapping("/") public String sayHello() { return "Hello world!"; } } } application.properties spring.application.name=spring-web-with-k8s server.port=8080
啟動專案 檢查專案是否構建成功
啟動專案,使用 curl 命令訪問 http://localhost:8080,檢查是否正常輸出 "Hello world!"
正常輸出 "Hello world!" ,專案構建成功。
容器化我們的應用
容器化是將應用打包為一個可以在任何地方執行的輕量級環境。下面我們將我們構建的 hello world 應用打包成 Docker 映象。
編寫 Dockerfile
# 使用的基礎映象 FROM openjdk:17-jdk-alpine # 定義環境變數 注意地址是否和本地 jar 包地址是否一致 ARG JAR_FILE=target/spring-web-with-k8s-0.0.1-SNAPSHOT.jar # 將應用的 jar 檔案複製到容器中 COPY ${JAR_FILE} app.jar # 暴露埠 EXPOSE 8080 # 定義執行命令 ENTRYPOINT ["java", "-jar", "/app.jar"]
構建 docker 映象
docker build -t hello-world-app:1.0 . docker build: 命令用於根據 Dockerfile 構建 Docker 映象。 -t: 表示為構建的映象指定一個標籤(tag)。 hello-world-app:1.0: hello-world-app: 映象名稱,用於標識你的應用映象。 1.0: 映象的版本號,可以幫助區分同一應用的不同版本。 .: 指定 Dockerfile 所在的路徑。在當前目錄(.)中尋找 Dockerfile。
檢測映象是否正常構建
docker run -d -p 8080:8080 --name hello-world-app hello-world-app:1.0 docker run: 命令用於執行一個容器。 -d: 後臺執行容器(Detached 模式)。 --name hello-world-app: 為容器指定一個名字 hello-world-app,方便後續管理(例如檢視狀態、停止容器等)。 -p 8080:8080: 埠對映,將宿主機的 8080 埠對映到容器的 8080 埠。 hello-world-app:1.0: 指定執行的映象名稱和版本號,表示基於這個映象建立並執行容器。
推送 docker 映象倉庫
本文以
hub.docker.com
為例
# Docker Hub 要求推送的映象以 username/repository:tag 格式命名。為本地映象打上 Docker Hub 所需的標籤 docker tag hello-world-app:1.0 your-dockerhub-username/hello-world-app:1.0 docker push your-dockerhub-username/hello-world-app:1.0
使用 labs.play-with-k8s.com 構建 Kubernetes 叢集並部署應用
最後,我們使用 labs.play-with-k8s.com 快速部署我們的應用到 Kubernetes 叢集中。
構建 Kubernetes 叢集環境
首先建立三臺伺服器例項,構建 Kubernetes 叢集
初始化 master 節點並初始化網路
kubeadm init --apiserver-advertise-address $(hostname -i) --pod-network-cidr 10.5.0.0/16 kubectl apply -f https://raw.githubusercontent.com/cloudnativelabs/kube-router/master/daemonset/kubeadm-kuberouter.yaml
將另外兩臺伺服器例項新增入叢集
kubeadm join 192.168.0.6:6443 --token y18e92.u3f9xgtio2vifvkb \ --discovery-token-ca-cert-hash sha256:85d66d0f4ae5122084bf0149029b9a9e374007cf6ae91913cab9cdf6b6f66789
叢集搭建結果檢視
編寫部署檔案
在 Kubernetes 中,部署檔案(YAML 檔案)是 Kubernetes 物件的宣告式配置。等價於使用 kubectl 命令列工具逐步手動建立、管理和配置這些物件的命令。透過部署檔案,你可以用一種宣告式的方式告訴 Kubernetes 需要什麼樣的資源,而 Kubernetes 會自動實現和維持這些需求。
hello-world-service.yaml
apiVersion: v1 kind: Service metadata: name: hello-world-service spec: selector: app: hello-world ports: - protocol: TCP port: 80 targetPort: 8080 type: LoadBalancer --- apiVersion: apps/v1 kind: Deployment metadata: name: hello-world spec: replicas: 2 selector: matchLabels: app: hello-world template: metadata: labels: app: hello-world spec: containers: - name: hello-world image: your-dockerhub-username/hello-world-app:1.0 ports: - containerPort: 8080
部署
kubectl apply -f hello-world-deployment.yaml
訪問是否部署成功
總結
本文我們從零開始構建並部署了一個 Java Spring Boot Web 應用到 Kubernetes 叢集,完整經歷了以下步驟:
應用開發:我們使用 Spring Boot 構建了一個簡單的 "Hello World" 應用,奠定了部署的基礎。 應用容器化:透過編寫 Dockerfile,將 Spring Boot 應用打包成 Docker 映象,為跨平臺部署和環境一致性提供支援。 Kubernetes 部署:利用 labs.play-with-k8s.com,快速構建 Kubernetes 叢集,成功部署和執行了容器化的 Web 應用。
本文只是一篇 Kubernetes 最基礎的入門介紹教程,隨著實際專案需求的擴充套件,我們可以進一步學習 Kubernetes 的更多功能,例如 水平擴充套件(Scaling)、配置管理(ConfigMaps 和 Secrets)、日誌與監控 等,構建更加複雜和健壯的分散式應用系統。