des*_*pot 2 java docker kubernetes docker-toolbox minikube
上下文:
技术:Java、Docker 工具箱、Minikube。
我有一个 java web 应用程序(已经打包为 web-tool.jar),我想在运行时同时拥有 kubernetes 的所有好处。
为了指示kubernetes 在本地获取图像,我使用了图像标签:
docker build -t despot/web-tool:1.0 .
Run Code Online (Sandbox Code Playgroud)
然后通过以下方式使其可用于 minikube:
docker save despot/web-tool:1.0 | (eval $(minikube docker-env) && docker load)
Run Code Online (Sandbox Code Playgroud)
该泊坞窗文件是:
FROM openjdk:11-jre
ADD target/web-tool-1.0-SNAPSHOT.jar app.jar
EXPOSE 1111
EXPOSE 2222
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
有了这个,一个 pod 被创建为一个 CrashLoopBackoff 状态,因为它没有一个前台进程正在运行。
b) 尝试以下操作,希望部署接受将传播到 pod 创建 (1.1.) 的命令和参数:
kubectl create deployment reggo --image=despot/web-tool:1.0 -- java -jar app.jar reg
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
但我得到了:
警告:kubectl apply 应用于由 kubectl create --save-config 或 kubectl apply 创建的资源 Pod
"reggo-858ccdcddd-mswzs" 无效:
* spec.containers[0].image:
required value * spec.containers : Forbidden: pod 更新不能添加或删除容器
这让我认为我无法通过应用命令/参数配置来执行命令。
解决方案(使用Arghya 答案):
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
Run Code Online (Sandbox Code Playgroud)
并执行:
kubectl expose deployment reggo --type=NodePort --port=1111
Run Code Online (Sandbox Code Playgroud)
您可以使用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"]
Run Code Online (Sandbox Code Playgroud)
或者,可以通过kubernetes yaml 中的command和args部分实现相同的功能
containers:
- name: myapp
image: myregistry.azurecr.io/myapp:0.1.7
command: ["java"]
args: ["-jar", "app.jar", "reg"]
Run Code Online (Sandbox Code Playgroud)
现在来到Forbidden: pod updates may not add or remove containers错误点, 其发生的原因是因为您正在尝试修改containers不允许的现有 pod 对象部分。您可以获取整个部署 yaml 并在编辑器中打开并编辑它以添加命令部分,然后删除现有部署,最后将修改后的部署 yaml 应用到集群,而不是这样做。
kubectl get deploy reggo -o yaml --export > deployment.yamlkubectl delete deploy reggokubectl apply -f deployment.yaml| 归档时间: |
|
| 查看次数: |
1222 次 |
| 最近记录: |