【问题标题】:Deploy WAR in Tomcat on Kubernetes在 Kubernetes 上的 Tomcat 中部署 WAR
【发布时间】:2019-06-17 21:08:31
【问题描述】:

我需要创建一个 Multibranch Jenkins 作业以在 Tomcat 中部署一个应该在 Kubernetes 上运行的 .war 文件。基本上,我需要以下内容:

  1. 一种在 Kubernetes 平台上安装 Tomcat 的方法。
  2. 在这个新安装的 Tomcat 上部署我的 war 文件。

我需要使用Dockerfile 来实现这一点。

PS:我对 Kubernetes 和 Docker 非常陌生,也需要基本的细节。我尝试寻找教程,但找不到任何令人满意的文章。

任何帮助都将受到高度赞赏。

【问题讨论】:

    标签: java docker tomcat kubernetes


    【解决方案1】:

    Docker 部分

    您可以使用tomcat docker official image

    在您的Dockerfile 中,只需将您的war 文件复制到/usr/local/tomcat/webapps/ 目录中即可:

    FROM tomcat
    
    COPY app.war /usr/local/tomcat/webapps/
    

    构建它:

    docker build --no-cache -t <REGISTRY>/<IMAGE>:<TAG> .

    构建映像后,将其推送到您选择的 Docker 注册表中。

    docker push <REGISTRY>/<IMAGE>:<TAG>

    Kubernetes 部分

    1) 这是一个简单的 kubernetes Deployment 用于您的 tomcat 映像

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: tomcat-deployment
      labels:
        app: tomcat
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: tomcat
      template:
        metadata:
          labels:
            app: tomcat
        spec:
          containers:
          - name: tomcat
            image: <REGISTRY>/<IMAGE>:<TAG>
            ports:
            - containerPort: 8080
    

    此部署定义将基于您的 tomcat 映像创建一个 pod。

    放到yml文件中,执行kubectl create -f yourfile.yml创建。

    2) 创建Service

    kind: Service
    apiVersion: v1
    metadata:
      name: tomcat-service
    spec:
      selector:
        app: tomcat
      ports:
      - protocol: TCP
        port: 80
        targetPort: 8080
    

    您现在可以使用 http://tomcat-service.your-namespace/app 访问集群内的 pod(因为您的战争称为 app.war

    3) 如果你有Ingress controller,你可以创建一个Ingress ressource 将应用程序暴露在集群之外:

    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
      name: tomcat-ingress
      annotations:
        nginx.ingress.kubernetes.io/rewrite-target: /
    spec:
      rules:
      - http:
          paths:
          - path: /app
            backend:
              serviceName: tomcat-service
              servicePort: 80
    

    现在使用http://ingress-controller-ip/app访问应用程序

    【讨论】:

    • 嗨@Nicolas,非常感谢您的回答。我尝试实现这个,在 Jenkins 作业结束时,我得到了这个: + kubectl --kubeconfig **** --namespace=dev-a apply -f k8s/services/ service "tomcat-service" created [Pipeline ] sh + kubectl --kubeconfig **** --namespace=dev-a apply -f k8s/dev/ ingress "tomcat-ingress" created 但是,当我运行这个时,我没有看到任何新的 pod:kubectl - -kubeconfig=dev.us-east-1 --namespace=dev-a 获取 pod
    • 可能出了点问题。键入kube get events --sort-by lastTimestamp --namespace=dev-a 以检查与创建的新组件相关的事件
    • 入口内容和部署文件是否应该放在不同的yaml中?
    • 不,您可以将所有内容放在一个 yaml 文件中。检查这个example
    • 构建已成功执行,但我在 pod 中收到 ImagePullBackOff 错误。在描述 pod 时,我发现了这个错误:xyz/myrepo 的拉取访问被拒绝,存储库不存在或可能需要“docker login”。但是,我可以看到使用相同名称推送的图像。我也试过 docker login 但没用。
    猜你喜欢
    • 1970-01-01
    • 2015-05-29
    • 1970-01-01
    • 2010-09-13
    • 2012-07-29
    • 2015-05-08
    • 1970-01-01
    • 1970-01-01
    • 2011-05-15
    相关资源
    最近更新 更多