使用k8s管理应用以及java案例

使用k8s管理应用

制作镜像

使用dockerfile制作docker镜像

镜像分为

  • 基础镜像:centos,ubuntu、debian等
  • 服务镜像:openjdk,nginx,mysql、tomcat等
  • 项目镜像:项目代码打包在镜像里,最终交付

项目镜像

  • java或者go的代码需要编译,php和python的可以不用编译。
  • Java:mvn会生成一个jar结尾文件,Java --jar,现在把这个文件做到镜像
  • Go:go build ,会生成一个二进制文件,现在把二进制文件做到镜像里
  • Python:aa.py可以直接运行

控制器管理pod

  • Deployment:无状态部署,例如Web,微服务,API等
  • StatefulSet:有状态部署,例如数据库,zookeeper,eureka、elasticsearch等
  • DaemonSet:守护进程部署,例如监控Agent、日志Agent、HDFS的datanode等
  • JOB & CronJob:批处理,例如数据库备份,邮件通知等

pod数据持久化

容器部署过程中一般有以下三种数据:

  • 启动时需要的初始数据,可以是配置文件
  • 启动过程中产生的临时数据,该临时数据需要多个容器间共享
  • 启动过程中产生的业务数据

创建service四层代理

使用Service ClusterIP类型暴露集群内部应用访问:

  • Service定义了Pod的逻辑集合和访问这个集合的策略
  • Service引入为了解决Pod的动态变化,提供服务发现和负载均衡
  • 使用CoreDNS解析Service名称

创建ingress规则对外发布应用

使用Ingress对外暴露应用:

  • 通过Service关联Pod
  • 基于域名访问
  • 通过Ingress Controller实现Pod的负载均衡
  • 支持TCP/UDP 4层和HTTP 7层(Nginx)

日志与监控

  • 使用Prometheus监控集群中资源的状态
  • 使用ELK来收集应用的日志


应用案例(因无开发代码,最终跑不起来)

基于 Java 编写一个简单的 Web 应用程序,并使用 Dockerfile 构建 Docker 镜像,并在 Kubernetes 上运行的步骤:

编写java代码

以下是一个基于 Spring Boot 构建的简单 REST API 示例,它将返回一个

包含问候语的 JSON 响应
首先,你需要安装 Java 和 Maven。然后,在命令行中执行以下步骤:

python 复制代码
yum install java-1.8.0-openjdk-devel
java -version
yum install maven
mvn -version

创建一个新的 Spring Boot 项目,并指定项目名称和 Maven 坐标:

执行以下命令:创建myapp

需要跑很长时间

python 复制代码
mvn archetype:generate \
  -DgroupId=com.example \
  -DartifactId=myapp \
  -DarchetypeArtifactId=maven-archetype-quickstart \
  -DinteractiveMode=false


在 pom.xml 文件中添加 Spring Boot 依赖项:

python 复制代码
cd myapp/
vim pom.xml
python 复制代码
<dependencies>
 <dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
 </dependency>
</dependencies>

创建一个新的 Java 类,命名为 GreetingController.java,

并添加以下代码:

python 复制代码
vim GreetingController.java
python 复制代码
package com.example.myapp;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class GreetingController {

  @GetMapping("/greeting")
  public Greeting greeting(@RequestParam(value = "name", defaultValue = "World")String name) {
      return new Greeting(String.format("Hello, %s!", name));
  }
}

创建一个新的 Java 类,命名为 Greeting.java,并添加以下代码

python 复制代码
vim  Greeting.java
python 复制代码
package com.example.myapp;

public class Greeting {

  private final String message;

  public Greeting(String message) {
    this.message = message;
  }

  public String getMessage() {
    return message;
 }
}

在命令行中进入项目目录,并执行以下命令来构建和打包应用程序:

需要较长时间

python 复制代码
mvn clean package



会生成一个myapp.jar文件

编写 Dockerfile

创建一个名为 Dockerfile 的文件,并使用文本编辑器打开。输入以下内容:

python 复制代码
cd ~/myapp/target
cp myapp-1.0-SNAPSHOT.jar myapp.jar
vim dockerfile
python 复制代码
# 使用官方的 OpenJDK 8 镜像作为基础镜像
FROM openjdk:8-jdk-alpine
# 拷贝应用程序到容器中
COPY myapp.jar /app/myapp.jar
# 暴露端口
EXPOSE 8080
# 运行应用程序
ENTRYPOINT ["java","-jar","/app/myapp.jar"]
备注:做镜像,基础镜像最好用alpine或者rockylinux

构建 Docker 镜像

python 复制代码
docker build -t myapp:1.0 .

导出镜像

python 复制代码
docker save -o  myapp.tar.gz myapp:1.0

在 Kubernetes 上运行应用程序

使用 kubectl 命令行工具部署应用程序镜像。在命令行中,执行以下命令:

python 复制代码
kubectl create deployment myapp --image=myapp:1.0 --port=8080  --replicas=3

上述命令会在 Kubernetes 集群中部署名为 myapp 的应用程序,使用镜像为 myapp:1.0,将容器

的端口设置为 8080,副本数为 3

创建 Kubernetes 服务service

在命令行中,执行以下命令创建 Kubernetes 服务:

python 复制代码
kubectl expose deployment myapp --type=NodePort --port=80 --target-port=8080

上述命令会创建一个 Kubernetes 服务,将容器的端口映射到外部端口 80 上,以便可以通过外

部 IP 地址访问应用程序。

创建ingress服务

python 复制代码
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
    ingressClassName: nginx
  - host: example.com
    http:
      paths: 
      - path: /myapp
        pathType: Prefix
        backend:
          service:
            name: myapp
            port:
              name: 80
相关推荐
我是谁??1 小时前
ubuntu22.04 通过docker部署vLLM(Qwen3-0.6B)大模型+New API+OpenWebUI
docker·容器·vllm
Patrick_Wilson2 小时前
K8s 探针避坑:Next.js 不同部署模式下的健康检查实践
kubernetes·node.js·next.js
运维瓦工2 小时前
DevOps 生态介绍(十):Docker Compose 核心 YAML 配置详解与常用命令大全
spring cloud·docker·容器
Plastic garden2 小时前
K8s(10)NFS 的动态 PV 创建数据库给k8s的mysql和redis
docker·容器·kubernetes
Plastic garden2 小时前
k8s(11) Pod 控制器,服务发现与存储管理
kubernetes
与海boy3 小时前
docker compose minio
docker·容器·eureka
星辰徐哥3 小时前
云原生核心特性:容器化、微服务与DevOps的通俗解读
微服务·云原生·devops
武子康4 小时前
调查研究-167 Docker Compose 详解:从单容器到多服务编排的工程化入口
运维·docker·云原生·容器·kubernetes·k8s·docker-compose
heimeiyingwang4 小时前
【架构实战】分布式会话:从Session到JWT的演进
微服务·云原生·架构