gpt4 book ai didi

java - 如何让创建的 Pod 运行应用程序(命令和参数),同时让部署和服务引用它?

转载 作者:行者123 更新时间:2023-12-02 20:35:42 37 4
gpt4 key购买 nike

上下文:
技术:Java、Docker Toolbox、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 配置应用于已经创建的部署/pod/服务吗? (更糟糕的解决方案是额外的手动步骤)
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 后尝试使用命令和 args 应用 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

但是我得到了:

Warning: kubectl apply should be used on resource created by either kubectl create --save-config or kubectl apply The Pod
"reggo-858ccdcddd-mswzs" is invalid:
* spec.containers[0].image: Required value
* spec.containers: Forbidden: pod updates may not add or remove containers

这让我觉得我无法通过应用命令/参数配置来执行命令。

解决方案(使用 Arghya answer ):

kubectl apply -f - <<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
name: reggo
spec:
selector:
matchLabels:
app: reggo-label
template:
metadata:
labels:
app: reggo-label
spec:
containers:
- name: reggo
image: "despot/web-tool:1.0"
command: ["java"]
args: ["-jar", "app.jar", "reg"]
ports:
- containerPort: 1111
EOF

并执行:

kubectl expose deployment reggo  --type=NodePort --port=1111

最佳答案

您可以在 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"]

或者,可以通过 kubernetes yaml 中的 commandargs 部分实现同样的效果

containers:
- name: myapp
image: myregistry.azurecr.io/myapp:0.1.7
command: ["java"]
args: ["-jar", "app.jar", "reg"]

现在到了 Forbidden: pod updates may not add or remove containers 错误的地步,它发生的原因是因为你试图修改现有的 pod 对象的 containers不允许的部分。您可以获取整个部署 yaml 并在编辑器中打开并编辑它以添加命令部分,然后删除现有部署,最后将修改后的部署 yaml 应用到集群,而不是这样做。

  1. kubectl get deploy reggo -o yaml --export > deployment.yaml
  2. 通过kubectl delete deploy reggo删除现有部署
  3. 编辑 deployment.yaml 添加正确的命令
  4. 将 yaml 应用到集群 kubectl apply -f deployment.yaml

关于java - 如何让创建的 Pod 运行应用程序(命令和参数),同时让部署和服务引用它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61439079/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com