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

devtools/2024/11/13 23:59:19/

使用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-ingressannotations:nginx.ingress.kubernetes.io/rewrite-target: /
spec:rules:ingressClassName: nginx- host: example.comhttp:paths: - path: /myapppathType: Prefixbackend:service:name: myappport:name: 80

http://www.ppmy.cn/devtools/133280.html

相关文章

Android 如何实现不编译指定的apk,不加载系统应用

1.把Android.mk改为Android.mk_bak 2.删除当前Android.mk内容变为空mk 或者注释掉里面所有内容 3.以上方法存在些许问题&#xff0c;因为只是把当前的mk屏蔽了&#xff0c;但其他路径的类似应用也会编译进去。 在内置应用mk下添加需要覆盖的应用&#xff0c;这个比较全面&…

Oracle 23AI创建示例库

一、示例库介绍 多年来&#xff0c;Oracle 一直使用简单的数据库模式 SCOTT 及其两个突出的表 EMP 和 DEPT&#xff0c;用于文档和培训中的各种示例。但不少小伙伴并不知道如何创建这些示例数据&#xff0c;其实Oracle官方上就有提供对应的方法&#xff0c;本文就带领大家完成…

关于vue生命周期

父子组件生命周期执行顺序&#xff1f; v2 v3 父beforeCreate -> 父created -> 父beforeMount -> 子beforeCreate -> 子created -> 子beforeMount -> 子mounted -> 父mounted Vue2生命周期 Vue3生命周期 beforeCreate setup created created befor…

乐尚代驾十订单支付seata、rabbitmq异步消息、redisson延迟队列

账单信息 司机结束代驾之后&#xff0c;生成账单&#xff08;包含账单信息和分账信息&#xff09;司机发送账单给乘客乘客获取账单之后&#xff0c;进行支付 获取账单信息 order_bill表记录的账单信息&#xff0c;我们直接获取即可 Operation(summary "根据订单id获取…

JavaScript:loadScript 方法

一、loadScript 解释 在JavaScript中&#xff0c;loadScript 方法通常用于动态地加载一个外部JavaScript脚本。这种方法常用于需要根据某些条件&#xff08;如用户交互、页面加载完成后的某些操作等&#xff09;动态引入脚本的场景。 二、实现代码 function loadScript(url,…

协程6 --- HOOK

文章目录 HOOK 概述链接运行时动态链接 linux上的常见HOOK方式修改函数指针用户态动态库拦截getpidmalloc 第一版malloc 第二版malloc/free通过指针获取到空间大小malloc 第三版strncmp 内核态系统调用拦截堆栈式文件系统 协程的HOOK HOOK 概述 原理&#xff1a;修改符号指向 …

pip常用命令

不常用pip用到的时候总是到处找命令&#xff0c;大多罗列不全或者布局不喜欢&#xff0c;特此收集在博文中&#xff0c;以供查找。 pip 是 Python 的包管理工具&#xff0c;用于安装、管理和卸载 Python 包。以下是 pip 的一些常用命令及其详细解释&#xff1a; 安装包 安装单…

《Linux运维总结:基于银河麒麟V10+ARM64架构CPU部署redis 6.2.14 TLS/SSL哨兵集群》

总结:整理不易,如果对你有帮助,可否点赞关注一下? 更多详细内容请参考:《Linux运维篇:Linux系统运维指南》 一、简介 Redis 哨兵模式是一种高可用性解决方案,它通过监控 Redis 主从架构,自动执行故障转移,从而确保服务的连续性。哨兵模式的核心组件包括哨兵(Sentine…