使用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