首先具备
1、创建 Dockerfile
FROM openjdk:17
RUN echo "Asia/Shanghai" > /etc/timezone
WORKDIR /app
COPY *.jar /app/
COPY pod_start.sh /app/
RUN chmod +x /app/pod_start.sh
ENTRYPOINT ["/app/pod_start.sh"]
2、pod_start.sh
#!/bin/bash
echo "172.16.xx.xxx redis.xxx.com" >> /etc/hosts
echo "172.16.xx.xxx dmsql.xxx.com" >> /etc/hosts
echo "172.16.xx.xxx pgsql.xxx.com" >> /etc/hosts
jarname=`ls /app/*.jar`
JVM="-server -Xmx512M -Xms512M -Djava.security.egd=file:/dev/./urandom"
java $JVM -jar $jarname --spring.profiles.active=dev
3、remote_script.sh
#!/bin/bash
# 远程服务器的地址
remote_server="172.16.xxx.xxx"
# SSH 连接的用户名
username="root"
# 远程服务器上的脚本路径
remote_script="/data/app/clean_docker_image.sh"
# 远程服务器上执行的命令
remote_command="cd /data/app && docker build -t ylc-dgcc-web:v1.0.0 ."
# 执行远程脚本
ssh $username@$remote_server bash $remote_script
# 在远程服务器上执行 docker build 命令
ssh $username@$remote_server $remote_command
echo "远程操作完成"
4、ylc-dgcc-web-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: ylc-dgcc-web
namespace: dev
spec:
replicas: 1
selector:
matchLabels:
app: ylc-dgcc-web
template:
metadata:
labels:
app: ylc-dgcc-web
spec:
containers:
- name: ylc-dgcc-web
image: ylc-dgcc-web:v1.0.0
ports:
- containerPort: 8000
---
apiVersion: v1
kind: Service
metadata:
name: ylc-dgcc-web
namespace: dev
spec:
selector:
app: ylc-dgcc-web
ports:
- port: 8000
targetPort: 8000
nodePort: 32080 # 在有效范围内的 NodePort
type: NodePort
5、clean_docker_image.sh
#!/bin/bash
# 设置要删除的镜像标签
IMAGE_TAG="ylc-dgcc-web:v1.0.0"
# 查找要删除的镜像的 ID
IMAGE_ID=$(docker images -q $IMAGE_TAG)
# 检查是否找到了镜像
if [ -z "$IMAGE_ID" ]; then
echo "未找到标签为 $IMAGE_TAG 的镜像。"
else
# 删除镜像
echo "正在删除标签为 $IMAGE_TAG 的镜像..."
docker rmi $IMAGE_ID
echo "镜像删除成功。"
fi
6、backup_script.sh
#!/bin/bash
# 设置备份目录
backup_dir="/data/backup/xxxx"
app_dir="/data/app"
app_name="app.jar"
# 确保备份目录存在
mkdir -p $backup_dir
# 获取当前时间并格式化为年月日时分秒
timestamp=$(date +"%Y%m%d%H%M%S")
# 构造备份文件名
backup_file="app-$timestamp.jar"
# 备份文件
cp "$app_dir/$app_name" "$backup_dir/$backup_file"
echo "备份完成,备份文件名为: $backup_file"
7、app_apply.sh 最主要脚本
记得以上脚本全部授权,授权命令
chmod +x xxx.sh
#!/bin/bash
# 定义可选操作
options=("Build Docker Image" "Apply Deployment" "Delete Deployment" "Delete Service" "Get Pods" "Get Services" "View Logs" "SCP App Directory" "Restart Deployment" "Scale Deployment" "Push Docker Image" "Backup App" "Exit")
# 显示菜单并读取用户选择
echo "请选择一个操作:"
select opt in "${options[@]}"
do
case $opt in
"Build Docker Image")
echo "正在执行清理 Docker 镜像脚本..."
if /data/app/clean_docker_image.sh; then
echo "清理成功,正在构建 Docker 镜像..."
if docker build -t ylc-dgcc-web:v1.0.0 .; then
echo "Docker 镜像构建成功"
else
echo "Docker 镜像构建失败"
fi
else
echo "清理 Docker 镜像脚本执行失败"
fi
;;
"Apply Deployment")
echo "正在应用部署..."
if kubectl apply -f /data/app/ylc-dgcc-web-deployment.yaml --namespace dev --validate=false; then
echo "部署应用成功"
else
echo "部署应用失败"
fi
;;
"Delete Deployment")
echo "正在删除部署..."
if kubectl delete deployment ylc-dgcc-web --namespace dev; then
echo "部署删除成功"
else
echo "部署删除失败"
fi
;;
"Delete Service")
echo "正在删除服务..."
if kubectl delete service ylc-dgcc-web --namespace dev; then
echo "服务删除成功"
else
echo "服务删除失败"
fi
;;
"Get Pods")
echo "正在获取 Pods..."
kubectl get pods --namespace dev
;;
"Get Services")
echo "正在获取 Services..."
kubectl get services --namespace dev
;;
"View Logs")
echo "正在获取 ylc-dgcc-web 的日志..."
pod_name=$(kubectl get pods -n dev -l app=ylc-dgcc-web -o jsonpath="{.items[0].metadata.name}")
if [ -n "$pod_name" ]; then
kubectl logs -n dev -f --tail=1000 $pod_name
else
echo "未找到匹配的 Pod"
fi
;;
"SCP App Directory")
echo "正在传输 app 目录..."
if scp -r ../app [email protected]:/data; then
echo "传输成功"
else
echo "传输失败"
fi
;;
"Restart Deployment")
echo "请选择要重启的部署:"
deployments=$(kubectl get deployments -n dev -o jsonpath="{.items[*].metadata.name}")
select selected_pod in $deployments; do
if [ -n "$selected_pod" ]; then
echo "正在重启部署 $selected_pod..."
if kubectl rollout restart -n dev deployment "$selected_pod"; then
echo "部署 $selected_pod 重启成功"
else
echo "部署 $selected_pod 重启失败"
fi
break
else
echo "无效选择,请选择一个有效的部署"
fi
done
;;
"Scale Deployment")
echo "请输入要设置的副本数量:"
read replicas
echo "正在设置副本数量为 $replicas..."
if kubectl scale --replicas=$replicas deployment ylc-dgcc-web -n dev; then
echo "设置副本数量成功"
else
echo "设置副本数量失败"
fi
;;
"Push Docker Image")
echo "正在推送 Docker 镜像..."
if /data/app/remote_script.sh; then
echo "推送成功"
else
echo "推送失败"
fi
;;
"Backup App")
echo "正在执行备份脚本..."
if /data/app/backup_script.sh; then
echo "备份完成"
else
echo "备份失败"
fi
;;
"Exit")
echo "退出"
break
;;
*)
echo "无效选项,请选择一个有效的操作"
;;
esac
done
8、运行脚本
就可以完成一键化部署,一键化删除,查看同步,最适合单主节点。
回车就可以一直继续
1) Build Docker Image 3) Delete Deployment 5) Get Pods 7) View Logs 9) Restart Deployment 11) Push Docker Image 13) Exit
2) Apply Deployment 4) Delete Service 6) Get Services 8) SCP App Directory 10) Scale Deployment 12) Backup App
以下是这些操作的解释和对应命令:
1、Build Docker Image (构建 Docker 镜像)
解释:创建一个新的 Docker 镜像,这通常包括将应用程序代码和依赖项打包在一起。
命令:docker build -t <image_name>: .
2、Apply Deployment (应用部署)
解释:将应用的部署配置应用到 Kubernetes 集群,创建或更新部署。
命令:kubectl apply -f <deployment_file>.yaml
3、Delete Deployment (删除部署)
解释:删除 Kubernetes 中指定的部署。
命令:kubectl delete deployment <deployment_name>
4、Delete Service (删除服务)
解释:删除 Kubernetes 中指定的服务。
命令:kubectl delete service <service_name>
5、Get Pods (获取 Pods)
解释:列出当前 Kubernetes 集群中所有的 Pods。
命令:kubectl get pods
6、Get Services (获取服务)
解释:列出当前 Kubernetes 集群中所有的服务。
命令:kubectl get services
7、View Logs (查看日志)
解释:查看指定 Pod 的日志输出。
命令:kubectl logs <pod_name>
8、SCP App Directory (使用 SCP 传输应用目录)
解释:使用 SCP(安全复制协议)将应用程序目录传输到远程服务器。
命令:scp -r <local_directory> @<remote_host>:<remote_directory>
9、Restart Deployment (重启部署)
解释:重启 Kubernetes 中的一个部署,通常通过删除所有 Pod 来实现,Kubernetes 会自动重建它们。
命令:kubectl rollout restart deployment <deployment_name>
10、Scale Deployment (扩展/缩减部署)
解释:调整 Kubernetes 部署的副本数量,以实现扩展或缩减。
命令:kubectl scale deployment <deployment_name> --replicas=<number_of_replicas>
11 、Push Docker Image (推送 Docker 镜像)
解释:将本地构建的 Docker 镜像推送到 Docker 镜像仓库。
命令:docker push <image_name>:
12、Backup App (备份应用)
解释:备份应用程序,具体操作可能包括复制文件、导出数据库等。
命令:取决于具体的应用程序和需求。例如:
文件备份:tar -czvf backup.tar.gz /path/to/app
13、Exit (退出)
解释:退出当前会话或终端。
命令:exit