本站消息

站长简介/公众号


站长简介:逗比程序员,理工宅男,前每日优鲜python全栈开发工程师,利用周末时间开发出本站,欢迎关注我的微信公众号:程序员总部,程序员的家,探索程序员的人生之路!分享IT最新技术,关注行业最新动向,让你永不落伍。了解同行们的工资,生活工作中的酸甜苦辣,谋求程序员的最终出路!

  价值13000svip视频教程,java大神匠心打造,零基础java开发工程师视频教程全套,基础+进阶+项目实战,包含课件和源码

  出租广告位,需要合作请联系站长


+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

暂无数据

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

发布于2021-09-19 22:55     阅读(612)     评论(0)     点赞(20)     收藏(3)


上下文
技术: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)

泊坞窗文件是:

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

有了这个,一个 pod 被创建为一个 CrashLoopBackoff 状态,因为它没有一个前台进程正在运行。

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

但我得到了:

警告: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

并执行:

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错误点, 其发生的原因是因为您正在尝试修改containers不允许的现有 pod 对象部分。您可以获取整个部署 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


所属网站分类: 技术文章 > 问答

作者:黑洞官方问答小能手

链接:http://www.javaheidong.com/blog/article/290007/99131f3934e98b8a09ff/

来源:java黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

20 0
收藏该文
已收藏

评论内容:(最多支持255个字符)