在 Kubernetes 集群中部署 Java 项目

在 Kubernetes 集群中部署 Java 项目

1.1 k8s 部署 java 项目流程

  • 制作镜像【Dockerfile】
  • 上传到镜像仓库【Dockerhub、阿里云、网易】
  • 控制器部署镜像【Deployment】
  • 对外暴露应用【Service、Ingress】
  • 运维【监控、升级】

1.2 制作 Jar 包

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
project/
└── demojenkins
├── demojenkins.iml
├── Dockerfile
├── HELP.md
├── mvnw
├── mvnw.cmd
├── pom.xml
├── src
│ ├── main
│ └── test
## 使用 java 和 Maven 进行打包
## 使用 java (springboot)进行打包
└── target # jar 包
├── classes
├── generated-sources
├── generated-test-sources
├── maven-archiver
├── maven-status
├── surefire-reports
├── demojenkins.jar ## jar 包

1.3 制作镜像 Dockerfile

1
2
3
4
FROM openjdk:8-jdk-alpine
VOLUME /tmp
ADD ./target/demojenkins.jar demojenkins.jar
ENTRYPOINT ["java","-jar","/demojenkins.jar", "&"]

打包镜像:

1
2
cd javaproject/demojenkins/
docker build -t java-demo-01:latest .

测试镜像容器:

1
docker run -d -p 8111:8111 java-demo-01:latest -t 

上传到镜像仓库:(本地仓库)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
## 搭建私人仓库
mkdir -p /data/myregistry
docker pull registry:latest
docker run -d -p 5000:5000 --name my_registry --restart=always -v /data/myregistry:/var/lib/registry registry:latest

## 更改 docker 配置文件(在需要连接到私有仓库的机器上全部都执行一遍)
## 在 k8smaster k8snode1 k8snode2 上均执行一遍
cat > /etc/docker/daemon.json << EOF
{
"registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"],
"insecure-registries": ["192.168.60.151:5000"]
}
EOF
## 重启 docker,重启 registry(如果停止了的话)
systemctl restart docker # 3 台机器上执行
docker start my_registry # 主节点上执行(因为私人仓库在主节点上)

测试本地私有仓库:

1
2
docker tag java-demo-01 192.168.60.151:5000/test/java-demo-01:v1
docker push 192.168.60.151:5000/test/java-demo-01:v1

1.4 部署项目

1
2
3
4
5
6
7
8
9
10
kubectl create deployment java01 --image=192.168.60.151:5000/test/java-demo-01:v1 --dry-run -o yaml > java01.yaml
kubectl create -f java01.yaml
kubectl get pod -o wide
kubectl expose deployment java01 --port=8111 --target-port=8111 --type=NodePort

## 查看暴露的端口
[root@k8smaster test]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
java01 NodePort 10.109.195.123 <none> 8111:31954/TCP 15s
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 6d

其实不一定非要部署 jar 包

部署其他服务也是一样的,比如部署 nginx,将 index.html 换掉。(学会这个,其他的都会了)

总结一下要点:

制作项目的 docker 镜像
将镜像上传到 docker 仓库
使用 k8s 部署项目
完 …….