Context:技术:Java,Docker工具箱,Minikube。我有一个要运行的Java Web应用程序(已经打包为web-tool.jar),同时具有kubernetes的所有优点。为了指示kubernetes在本地拍摄图像,我使用了图像标签:
docker build -t despot/web-tool:1.0 .
然后通过以下方式将其用于minikube:
docker save despot/web-tool:1.0 | (eval $(minikube docker-env) && docker load)
docker文件是:
FROM openjdk:11-jre
ADD target/web-tool-1.0-SNAPSHOT.jar app.jar
EXPOSE 1111
EXPOSE 2222
1。如何创建pod,运行Java应用程序,并同时具有引用它的部署和服务?
1.1。我可以创建一个部署,以便在创建Pod时传播命令和参数吗? (最适合我,因为我确保在创建Pod之前先创建部署和服务)1.2。如果1.1。不可行,我是否可以将kubectl带有命令和参数的某些pod配置应用于已创建的Deployment / pod / service? (更糟糕的解决方案是其他手动步骤)1.3。如果是1.2。不可行,是否可以创建部署/服务并将其附加到已经运行的pod(以“ kubectl run ... java -jar app.jar reg”开头)?
我尝试过的是:a)创建一个部署(自动启动Pod)并公开(创建服务):
kubectl create deployment reggo --image=despot/web-tool:1.0
这样,将创建一个具有CrashLoopBackoff状态的pod,因为它尚未运行前台进程。
b)尝试以下操作,希望部署接受将传播到Pod创建(1.1。)的命令和参数:
kubectl create deployment reggo --image=despot/web-tool:1.0 -- java -jar app.jar reg
pod的结果相同,因为部署不接受命令和参数。
c)尝试在部署创建Pod之后应用带有命令和参数的Pod配置,因此我从a)运行了命令,找到了(kubectl get pods)和pod的ID(reggo-858ccdcddd-mswzs),并然后我执行:
kubectl apply -f - <<EOF
apiVersion: v1
kind: Pod
metadata:
name: reggo-858ccdcddd-mswzs
spec:
containers:
- name: reggo-858ccdcddd-mswzs
command: ["java"]
args: ["-jar", "app.jar", "reg"]
EOF
但是我得到了:
警告:kubectl apply应该用于由以下任何一个创建的资源kubectl create --save-config或kubectl apply Pod“ reggo-858ccdcddd-mswzs”无效:* spec.containers [0] .image:必填值* spec.containers:禁止:pod更新不能添加或删除容器
这让我认为我无法通过应用命令/参数配置来执行命令。
您可以在Docker文件本身中将java -jar
命令设为ENTRYPOINT
,它告诉Docker运行Java应用程序。
FROM openjdk:11-jre
ADD target/web-tool-1.0-SNAPSHOT.jar app.jar
EXPOSE 1111
EXPOSE 2222
ENTRYPOINT ["java", "-jar", "app.jar", "reg"]