使用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
相关推荐
MonkeyKing_sunyuhua26 分钟前
sudo docker ps才能查看,docker ps不能查看问题
docker·容器·eureka
小龙在山东28 分钟前
使用Docker快速部署FastAPI Web应用
docker·容器·fastapi
苏格拉真没有底29 分钟前
docker配置代理解决不能拉镜像问题
运维·docker·容器
A ?Charis4 小时前
我来讲一下-Service Mesh.
云原生·service_mesh
ciao-lk4 小时前
docker desktop运行rabittmq容器,控制台无法访问
docker·容器
严格要求自己6 小时前
nacos-operator在k8s集群上部署nacos-server2.4.3版本踩坑实录
云原生·容器·kubernetes
少吃一口就会少吃一口6 小时前
k8s笔记
云原生·容器·kubernetes
葡萄皮Apple6 小时前
[CKS] K8S ServiceAccount Set Up
服务器·容器·kubernetes
星海幻影7 小时前
云原生-docker安装与基础操作
网络·安全·docker·云原生·容器
2301_806131368 小时前
Kubernetes 核心组件调度器(Scheduler)
云原生·容器·kubernetes