切换语言为:繁体

小白如何从 0 到 1 掌握部署一个 Web 应用到 Kubernetes 中

  • 爱糖宝
  • 2024-11-25
  • 2003
  • 0
  • 0

前言

  • 随着容器化技术的普及,部署 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 应用,此部分内容比较简单大家可以选择合适的方式构建。

项目结构

小白如何从 0 到 1 掌握部署一个 Web 应用到 Kubernetes 中

项目核心文件

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!"

小白如何从 0 到 1 掌握部署一个 Web 应用到 Kubernetes 中

小白如何从 0 到 1 掌握部署一个 Web 应用到 Kubernetes 中

  • 正常输出 "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。

小白如何从 0 到 1 掌握部署一个 Web 应用到 Kubernetes 中

  • 检测镜像是否正常构建

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: 指定运行的镜像名称和版本号,表示基于这个镜像创建并运行容器。

小白如何从 0 到 1 掌握部署一个 Web 应用到 Kubernetes 中

推送 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

小白如何从 0 到 1 掌握部署一个 Web 应用到 Kubernetes 中

小白如何从 0 到 1 掌握部署一个 Web 应用到 Kubernetes 中

小白如何从 0 到 1 掌握部署一个 Web 应用到 Kubernetes 中

使用 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

小白如何从 0 到 1 掌握部署一个 Web 应用到 Kubernetes 中

  • 将另外两台服务器实例添加入集群

kubeadm join 192.168.0.6:6443 --token y18e92.u3f9xgtio2vifvkb \
        --discovery-token-ca-cert-hash sha256:85d66d0f4ae5122084bf0149029b9a9e374007cf6ae91913cab9cdf6b6f66789

小白如何从 0 到 1 掌握部署一个 Web 应用到 Kubernetes 中

  • 集群搭建结果查看

小白如何从 0 到 1 掌握部署一个 Web 应用到 Kubernetes 中

编写部署文件

  • 在 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

小白如何从 0 到 1 掌握部署一个 Web 应用到 Kubernetes 中

  • 访问是否部署成功

小白如何从 0 到 1 掌握部署一个 Web 应用到 Kubernetes 中

总结

  • 本文我们从零开始构建并部署了一个 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)、日志与监控 等,构建更加复杂和健壮的分布式应用系统。


下一个

没有更多了...

0条评论

您的电子邮件等信息不会被公开,以下所有项均必填

OK! You can skip this field.