云原生:Kubernetes下的Java应用部署实战详解
随着云原生技术的蓬勃发展,Kubernetes 已成为容器编排领域的事实标准,为微服务架构提供了强大的支撑。对于 Java 开发者而言,掌握在 Kubernetes 上部署和管理 Java 应用的技能变得尤为重要。本文将手把手带你完成一次 Java 应用从零到部署上 Kubernetes 的全过程,涵盖关键步骤、最佳实践及实用技巧。
目录
随着云原生技术的蓬勃发展,Kubernetes 已成为容器编排领域的事实标准,为微服务架构提供了强大的支撑。对于 Java 开发者而言,掌握在 Kubernetes 上部署和管理 Java 应用的技能变得尤为重要。本文将手把手带你完成一次 Java 应用从零到部署上 Kubernetes 的全过程,涵盖关键步骤、最佳实践及实用技巧。
一、准备工作
1.1 Docker 及 Kubenetes 安装
首先确保你的电脑上已经安装了 Docker 和 kubectl。Docker 的安装可以直接安装 Docker Desktop 即可,然后在 Docker Desktop 中直接启用 Kubenetes,如图所示:
Mac 上安装 kubectl 可直接通过 brew install kubectl 进行安装,安装完成后执行 kubectl cluster-info 命令进行查看,会返回如下内容
Kubernetes control plane is running at https://kubernetes.docker.internal:6443
CoreDNS is running at https://kubernetes.docker.internal:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
1.2 Java应用准备
这一步比较简单,直接在 SpringBoot 中写一个简单的接口即可,接口如下:
@RestController
public class TestController {
@GetMapping("/test")
public String test() {
return "ok";
}
}
二、构建 Docker 镜像
在刚才 Java 应用的基础上编写 Dockerfile,指定基础镜像为 openjdk,复制应用代码,并定义启动命令,Dockerfile 详细内容如下:
# 基础镜像
FROM openjdk:8-jdk-alpine
# 将本地文件夹挂载到容器中
VOLUME /tmp
# 复制文件到容器,我的jar包文件名为 k8s-demo-1.0-SNAPSHOT.jar
ADD target/k8s-demo-1.0-SNAPSHOT.jar app.jar
# 启动命令,这里也已指定堆内存大小,垃圾回收器,运行环境等
ENTRYPOINT java -jar app.jar
Dockerfile 文件编写好后就可以构建 Java 应用的镜像并推送至 Docker registry,由于注册 Docker Hub 相对来说比较麻烦,这里在本地搭建 Docker Registry。
2.1 本地Docker Registry搭建
具体的步骤如下:
首先要从 Docker 拉取 Registry 镜像
docker pull registry:2
然后运行 registry,指定其映射端口为 5000,这里并未设置用户名密码,无需相关认证操作
docker run -d -p 5000:5000 --name registry registry:2
2.2 推送镜像到本地Docker Registry
首先需要给镜像添加新标签,指向本地 Registry
docker tag k8s-demo:latest localhost:5000/k8s-demo:latest
然后就可以将镜像推送到本地 Registry
docker push localhost:5000/k8s-demo:latest
到 Docker Desktop 中查看镜像是否推送成功
三、使用 kubenetes 部署
Kubenetes 通过配置文件来定义各种资源,主要用于定义和管理集群内的各个资源对象,如 Pods、Services、Deployments、ConfigMaps、Secrets等。这些配置文件通常采用YAML格式编写,因其简洁明了且易于阅读和编辑而被广泛使用。如下为 Deployment 资源文件内容:
apiVersion: apps/v1
kind: Deployment
metadata:
name: k8s-demo-deployment
spec:
replicas: 1
selector:
matchLabels:
app: k8s-demo
template:
metadata:
labels:
app: k8s-demo
spec:
containers:
- name: k8s-demo
image: localhost:5000/k8s-demo:latest # 指定本地registry 获取镜像
ports:
- containerPort: 8080
service 资源文件定义
apiVersion: v1
kind: Service
metadata:
name: k8s-demo-service
spec:
type: NodePort
selector:
app: k8s-demo # 与Deployment中定义的label匹配
ports:
- port: 80 # Service监听的端口
targetPort: 8080 # Pod中的容器端口
nodePort: 30081 # 指定在节点上开放的端口,可选,如果不指定,Kubernetes会自动分配一个可用端口
使用 kubectl 命令来部署应用,部署的命令如下
kubectl apply -f app-deployment.yaml
kubectl apply -f app-service.yaml
分别执行部署命令后可以通过相应的命令查看,查看命令为
kubectl get deployments
kubectl get services
kubectl get pods
从命令返回的状态可以看出,是 Running 状态,到这里就可以正常访问你的Java应用了,查看自己的电脑的IP,在浏览器直接访问,访问结果如图
是不是感觉很简单呢,这是单机的实现,如果在生产环境部署要复杂的多。
四、Kubenetes常用命令
以下是一些 Kubernetes (`kubectl`) 常用命令的总结,这些命令对于管理和操作 Kubernetes 集群非常关键
命令 | 含义 |
kubectl get pods | 查看当前命名空间下的所有Pod |
kubectl get pods -o wide | 查看Pod详情,包括节点信息 |
kubectl get all | 查看所有资源,包括Pod、deployment、service、replicaset |
kubectl apply -f deployment.yaml/service.yanl | 部署应用 |
kubectl create -f <file> | 根据YAML或JSON文件创建资源 |
kubectl run <name> --image=<image> | 快速运行一个容器 |
kubectl delete -f <file> | 根据文件删除资源 |
kubectl logs <pod-name> | 查看Pod的日志 |
kubectl cluster-info | 显示集群基本信息 |
kubectl autoscale deployment <deployment-name> --min=<min-replicas> --max=<max-replicas> --cpu-percent=<target-cpu> | 设置Deployment的自动扩缩容 |
kubectl scale deployment <deployment-name> --replicas=<number> | 调整Deployment副本数量 |
kubectl top | 显示资源(CPU、内存、存储)的使用情况。如 kubectl top pods,可以指定排序,通过 --sort-by=cpu来设置 |
其他常用的命令可以参考中文官方网站:命令行工具 (kubectl) | Kubernetes
往期经典推荐
更多推荐
所有评论(0)