当前位置: 首页 > article >正文

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

使用k8s管理应用

  • 制作镜像
  • 控制器管理pod
  • pod数据持久化
  • 创建service四层代理
  • 创建ingress规则对外发布应用
  • 日志与监控
  • 应用案例(因无开发代码,最终跑不起来)
    • 编写java代码
    • 编写 Dockerfile
    • 构建 Docker 镜像
    • 在 Kubernetes 上运行应用程序
    • 创建 Kubernetes 服务service
    • 创建ingress服务

制作镜像

使用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。然后,在命令行中执行以下步骤:

yum install java-1.8.0-openjdk-devel
java -version
yum install maven
mvn -version

创建一个新的 Spring Boot 项目,并指定项目名称和 Maven 坐标:
执行以下命令:创建myapp
需要跑很长时间

mvn archetype:generate \
  -DgroupId=com.example \
  -DartifactId=myapp \
  -DarchetypeArtifactId=maven-archetype-quickstart \
  -DinteractiveMode=false

在这里插入图片描述
在这里插入图片描述

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

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

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

vim GreetingController.java
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,并添加以下代码

vim  Greeting.java
package com.example.myapp;

public class Greeting {

  private final String message;

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

  public String getMessage() {
    return message;
 }
}

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

mvn clean package

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

会生成一个myapp.jar文件

编写 Dockerfile

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

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

构建 Docker 镜像

docker build -t myapp:1.0 .

在这里插入图片描述

导出镜像

docker save -o  myapp.tar.gz myapp:1.0

在 Kubernetes 上运行应用程序

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

kubectl create deployment myapp --image=myapp:1.0 --port=8080  --replicas=3

上述命令会在 Kubernetes 集群中部署名为 myapp 的应用程序,使用镜像为 myapp:1.0,将容器
的端口设置为 8080,副本数为 3

创建 Kubernetes 服务service

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

kubectl expose deployment myapp --type=NodePort --port=80 --target-port=8080

上述命令会创建一个 Kubernetes 服务,将容器的端口映射到外部端口 80 上,以便可以通过外
部 IP 地址访问应用程序。

创建ingress服务

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

http://www.kler.cn/a/383120.html

相关文章:

  • UML的另一个主角——用例图
  • 从传统服务器到虚拟化:虚拟机 VM 如何改变计算游戏规则?
  • Qt中的Model与View 4:QStandardItemModel与QTableView
  • DPDK(F-Stack) 实现UDP通信
  • 安全关键型嵌入式系统设计模式整理及应用实例
  • 2024年【汽车修理工(高级)】考试总结及汽车修理工(高级)试题及解析
  • Go API 多种响应的规范化处理和简化策略
  • 晚霞视频素材哪里下载 高清无水印素材推荐平台
  • 在Scrapy爬虫中应用Crawlera进行反爬虫策略
  • 背包九讲——背包问题求具体方案
  • java.lang.NoClassDefFoundError: kotlin/jvm/JvmInline
  • 无root权限在Linux虚拟环境安装指定版本python
  • [354]基于springboot的足球俱乐部管理系统
  • 第07章 运算符的使用
  • qt QCloseEvent详解
  • C++__XCode工程中Debug版本库向Release版本库的切换
  • 【GIT】sourceTree的“当前分支“,“合并分支“与“检出分支的区别
  • Linux中级(防火墙iptables)
  • 冒泡排序:相邻两俩比较,小的放前面,大的放后面
  • 使用PyCharm连接虚拟机运行spark任务,本地开发:远程提交测试
  • 在老旧小区配电系统中剩余电流继电器的应用
  • 一.Linux文件基本属性
  • docker+mysql配置
  • 第十九课 Vue组件中的方法
  • 3^100的位数判断
  • CAN通讯中常见的接口异常问题及其解决方案