从 0 到 1 掌握部署第一个 Web 应用到 Kubernetes 中

文章目录

  • 前言
  • 构建一个 hello world web 应用
    • 项目结构
    • 项目核心文件
    • 启动项目 检查项目是否构建成功
  • 容器化我们的应用
    • 编写 Dockerfile
    • 构建 docker 镜像
    • 推送 docker 镜像仓库
  • 使用 labs.play-with-k8s.com 构建 Kubernetes 集群并部署应用
    • 构建 Kubernetes 集群环境
    • 编写部署文件
  • 总结
  • 个人简介

前言

  • 随着容器化技术的普及,部署 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)、日志与监控 等,构建更加复杂和健壮的分布式应用系统。

个人简介

👋 你好,我是 Lorin 洛林,一位 Java 后端技术开发者!座右铭:Technology has the power to make the world a better place.

🚀 我对技术的热情是我不断学习和分享的动力。我的博客是一个关于Java生态系统、后端开发和最新技术趋势的地方。

🧠 作为一个 Java 后端技术爱好者,我不仅热衷于探索语言的新特性和技术的深度,还热衷于分享我的见解和最佳实践。我相信知识的分享和社区合作可以帮助我们共同成长。

💡 在我的博客上,你将找到关于Java核心概念、JVM 底层技术、常用框架如Spring和Mybatis 、MySQL等数据库管理、RabbitMQ、Rocketmq等消息中间件、性能优化等内容的深入文章。我也将分享一些编程技巧和解决问题的方法,以帮助你更好地掌握Java编程。

🌐 我鼓励互动和建立社区,因此请留下你的问题、建议或主题请求,让我知道你感兴趣的内容。此外,我将分享最新的互联网和技术资讯,以确保你与技术世界的最新发展保持联系。我期待与你一起在技术之路上前进,一起探讨技术世界的无限可能性。

📖 保持关注我的博客,让我们共同追求技术卓越。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/923968.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据结构与算法——1120——时间空间效率问题求边界值

目录 1、效率问题 1、时间复杂度 1、O(1) 2、O(n) 3、O(n) 或O(n*log2n)——n倍的log以2为底n的对数 例题 4、O(n) 2、空间复杂度 3、数组和链表 2、面试题之求边界值 题目 解答 (1)-i (2)~i (3&#x…

爬虫与反爬-Ja3指纹风控(Just a moment...)处理方案及参数说明

概述:本文将针对 Ja3 指纹检测风控进行处理,举例了一个案例并使用两种不同的破解方案进行突破,同时深入了解指纹间不同字符所代表的含义 指纹检测背景: 1、每一个设备、软件都有独属于自己的设备信息、版本号、加密算法、椭圆算…

【JUC-JMM】Java Memory Model Java内存模型

Java内存模型--JMM 一、JMM是什么?二、Happens-Before原则三、JMM有什么用? 一、JMM是什么? JMM,全拼Java Memory Model,翻译过来就是Java内存模型。 那么,我们不禁思索,Java内存模型有什么用&…

SpringAI:Java 开发的智能新利器

一、SpringAI 简介 随着人工智能技术的飞速发展,越来越多的开发者开始探索如何将 AI 能力集成到现有的应用中来提升产品的智能化水平。Spring AI 正是为 Java 开发者提供的一款强大的 AI 框架,使得这一集成过程变得前所未有的简单和高效。 本文将深入探…

在Excel中处理不规范的日期格式数据并判断格式是否正确

有一个Excel表,录入的日期格式很混乱,有些看着差不多,但实际多一个空格少一个字符很难发现,希望的理想格式是 1980-01-01,10位,即:“YYYY-mm-dd”,实际上数据表中这样的格式都有 19…

【我在CSDN成长】我的五周年创作纪念日

感叹 五年的时光匆匆而过, 像一阵风,拂过岁月的湖面, 泛起层层涟漪,又悄然离去。 曾经的欢笑与泪水, 那些奋斗的日夜, 如同电影般在脑海中放映, 却已成为遥远的回忆。 五年,说长不长…

Jmeter中的定时器

4)定时器 1--固定定时器 功能特点 固定延迟:在每个请求之间添加固定的延迟时间。精确控制:可以精确控制请求的发送频率。简单易用:配置简单,易于理解和使用。 配置步骤 添加固定定时器 右键点击需要添加定时器的请求…

BERT 详解

BERT简介 BERT(Bidirectional Encoder Representations from Transformers)是由 Google 在 2018 年提出的一种预训练语言模型。BERT 在自然语言处理(NLP)领域取得了重大突破,因为它能够有效地捕捉文本的上下文信息&am…

macos 14.0 Monoma 修改顶部菜单栏颜色

macos 14.0 设置暗色后顶部菜单栏还维持浅色,与整体不协调。 修改方式如下:

数据库-MySQL-Dynamic-Datasource源码解析

文章目录 前言一、简介二、整体流程三、核心解析四、总结 前言 多数据源的应用在日常项目中也是很常见的场景。 dynamic-datasource的功能,用起来的确很方便,只需要一个DS注解,加上一些简单的配置即可完成多数据源的切换。究竟是怎么做到的…

YB2503HV:高效率降压IC,助力电动车、太阳能设备等领域的能源转换

今天我要向大家介绍一款引人注目的产品—— YB2503HV 100V 3A SOP8内置MOS 高效率降压IC。这款单片集成芯片具备可设定输出电流的开关型降压恒压驱动器功能,可广泛应用于电动车、太阳能设备、电子电池充电等领域。让我们一起来看看它的特点和应用吧! 首先…

架构-微服务架构

文章目录 前言一、系统架构演变1. 单体应用架构2. 垂直应用架构3. 分布式架构4. SOA 架构5. 微服务架构 二. 微服务架构介绍1. 微服务架构的常见问题2. 微服务架构的常见概念3. 微服务架构的常见解决方案4. 解决方案选型 三. Spring Cloud Alibaba介绍1. 主要功能2. 组件 前言 …

【一个简单的整数问题2——线段树】

题目 代码 下面的两个代码的区别在于modify的分类&#xff0c;modify最简单的分类方式是存在性分类&#xff0c;另一种类似某些query采用的三段式分类&#xff0c;详细见代码 存在性 #include <bits/stdc.h> using namespace std; using ll long long; const int N 1…

通用网络安全设备之【防火墙】

概念&#xff1a; 防火墙&#xff08;Firewall&#xff09;&#xff0c;也称防护墙&#xff0c;它是一种位于内部网络与外部网络之间的网络安全防护系统&#xff0c;是一种隔离技术&#xff0c;允许或是限制传输的数据通过。 基于 TCP/IP 协议&#xff0c;主要分为主机型防火…

如何启动 Docker 服务:全面指南

如何启动 Docker 服务:全面指南 一、Linux 系统(以 Ubuntu 为例)二、Windows 系统(以 Docker Desktop 为例)三、macOS 系统(以 Docker Desktop for Mac 为例)四、故障排查五、总结Docker,作为一种轻量级的虚拟化技术,已经成为开发者和运维人员不可或缺的工具。它允许用…

构建英语知识网站:Spring Boot框架解析

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常…

Android mk/bp构建工具介绍

零. 前言 由于Bluedroid的介绍文档有限&#xff0c;以及对Android的一些基本的知识需要了(Android 四大组件/AIDL/Framework/Binder机制/JNI/HIDL等)&#xff0c;加上需要掌握的语言包括Java/C/C等&#xff0c;加上网络上其实没有一个完整的介绍Bluedroid系列的文档&#xff0…

2022 年中高职组“网络安全”赛项-海南省省竞赛任务书-1-B模块B-1-Windows操作系统渗透测试

前言 本章节我将带领大家一起重新模拟操作一次Windows渗透测试模块&#xff0c;并加固的流程。 任务概览 环境部署 我的实验复现环境&#xff1a; 服务器Windows server 2008 R2 攻击机Kali Linux 场景操作系统Windows 7 额外还有台交换机支持&#xff1a; 这里我使用的是…

如何搭建一个小程序:从零开始的详细指南

在当今数字化时代&#xff0c;小程序以其轻便、无需下载安装即可使用的特点&#xff0c;成为了连接用户与服务的重要桥梁。无论是零售、餐饮、教育还是娱乐行业&#xff0c;小程序都展现了巨大的潜力。如果你正考虑搭建一个小程序&#xff0c;本文将为你提供一个从零开始的详细…

根据实验试要求,打通隧道连接服务器上的数据库,前端进行数据调用。

1.背景介绍 数据库布置在了工大实验试K80服务器上&#xff0c;本地属于外网无法直接访问校园内网。需要打通隧道&#xff0c;通过堡垒机进行服务器的访问。获取到数据库数据进行前端展示。 2.打通隧道 访问指令&#xff1a; 我选择使用Xshell打通隧道。优点&#xff1a;凭证…