K8s部署docker化Java应用

docker下载链接

Docker

下面以SpringBoot工程为例

  • 首先建立一个SpringBoot工程,工程目录结构如下:
> mt-myservice
    > .idea
    > .mvn
    > src
        > main
            > docker
                  Dockerfile         // Dockerfile(名字是固定的)为工程docker的配置
        > java
            > com.my
                > controller         // web应用入口,controller控制器
                > service            // 业务逻辑类             
                  MyserviceApplication   // springBoot应用启动类
    > resources
          application.properties     // springBoot配置类,tomcat默认端口号可在这里修改
  • 上述添加docker配置文件Dockerfile,目录结构设置为src/main/docker,内容如下
#基础镜像环境
FROM java:8  
VOLUME /tmp  
#把工程生成的jar包添加到容器并改名为app.jar
ADD myservice-0.0.1-SNAPSHOT.jar app.jar 
#命令入口,其中-Djava.security.egd=file:/dev/./urando是生成随机数,urandom节约构建熵池时间
#设置应用最大内存为1000M
ENTRYPOINT ["java","-Xmx1000m","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
  • pom中配置maven插件,配置如下
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <plugin>
                <groupId>com.spotify</groupId>
                <artifactId>docker-maven-plugin</artifactId>
                <version>0.2.3</version>
                <configuration>
                    <imageName>demo/${project.artifactId}</imageName>
                    <dockerDirectory>src/main/docker</dockerDirectory>
                    <resources>
                        <resource>
                            <targetPath>/</targetPath>
                            <directory>${project.build.directory}</directory>
                            <include>${project.build.finalName}.jar</include>
                        </resource>
                    </resources>
                </configuration>
            </plugin>
        </plugins>
    </build>
  • 指定tomcat端口号,以springboot为例,在classpath路径下修改application.properties文件,内容:
    server.port=<要修改的端口号>
  • 启动docker(不启动下面构建会失败)
  • 执行maven命令:package docker:build(执行成功后会生成docker镜像在本地仓库)
  • 在docker命令行执行命令
    • docker images(查看本地镜像)
    • docker login(登录自己的docker账号,没有可以注册下)
    • docker tag [ImageId]  demo/myservice:[镜像版本号]   //修改版本号
    • docker push <username>/<tag>(推送镜像到远程仓库)

常见问题:

  1. docker启动失败,可能是计算机没有设置允许装VM选项,可到bios进行更改
  2. 创建VM失败,可能是VirtualBox版本问题,可以卸载VirtualBox重新装

k8s部署service,yaml文件配置:

配置service信息:
api:/api/v1/namespaces/{mynamespace}/services/
请求方式:post
{
    "metadata":{
        "name":"myservice",
        "namespace":"mynamespace",
        "labels":{
            "app":"myservice"
        }
    },
    "apiVersion":"v1",
    "kind":"Service",
    "spec":{
        "selector":{
            "app":"myservice"
        },
        "ports":[
            {
                "protocol":"TCP",
                "port":80,
                "targetPort":8080
            }
        ],
        "clusterIP":"None"
    }
}
注意:targetPort一定要和项目启动的端口号一致。


配置Ingress信息(相当于nginx):
api:/apis/extensions/v1beta1/namespaces/{mynamesapce}/ingresses/
请求方式:post
{
    "metadata":{
        "name":"myservice",
        "namespace":"mynamesapce"
    },
    "apiVersion":"extensions/v1beta1",
    "kind":"Ingress",
    "spec":{
        "rules":[
            {
                "host":"myservice.mtdata.bach.com",
                "http":{
                    "paths":[
                        {
                            "path":"/",
                            "backend":{
                                "servicePort":80,
                                "serviceName":"myservice"
                            }
                        }
                    ]
                }
            }
        ]
    }
}


配置deployment,定义Deployment来创建Pod和ReplicaSet
api:/apis/extensions/v1beta1/namespaces/{mynamespace}/deployments/
请求方式:post
{
    "metadata":{
        "name":"myservice",
        "namespace":"mynamespace"
    },
    "apiVersion":"extensions/v1beta1",
    "kind":"Deployment",
    "spec":{
        "template":{
            "metadata":{
                "labels":{
                    "app":"myservice"
                }
            },
            "spec":{
                "hostNetwork":false,
                "containers":[
                    {
                        "image":"docker镜像路径:版本号",
                        "imagePullPolicy":"Always",
                        "name":"subtitle",
                        "resources":{
                            "requests":{
                                "memory":"1024Mi",
                                "cpu":4
                            },
                            "limits":{  
                                "memory":"2048Mi",         //内存最大限制
                                "cpu":4                    //cpu核心数
                            }
                        },
                        "readinessProbe":{
                            "tcpSocket":{
                                "port":8080
                            },
                            "periodSeconds":10,
                            "initialDelaySeconds":20
                        }
                    }
                ],
                "affinity":{
                    "nodeAffinity":{
                        "requiredDuringSchedulingIgnoredDuringExecution":{
                            "nodeSelectorTerms":[
                                {
                                    "matchExpressions":[
                                        {
                                            "key":"gpu",
                                            "operator":"DoesNotExist"
                                        }
                                    ]
                                }
                            ]
                        }
                    }
                }
            }
        },
        "replicas":1
    }
}

image升级时候,需要修改deployment,请求方式为patch

api:/apis/extensions/v1beta1/namespaces/mynamespace/deployments/myservice

Content-Type:application/strategic-merge-patch+json


{
    "spec":{
        "template":{
            "spec":{
                "containers":[
                    {
                        "image":"docker镜像路径:版本号",
                        "name":"myservice"
                    }
                ]
            }
        }
    }
}

k8s api文档:http://kubernetes.kansea.com/docs/api-reference/v1/operations/
k8s 参数说明文档:http://kubernetes.kansea.com/docs/api-reference/v1/definitions/#_v1_event

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Docker和Kubernetes是两个非常流行的容器技术,可以用来部署Java服务。Docker可以将Java应用程序打包成一个容器镜像,然后在任何支持Docker的环境中运行。Kubernetes则可以管理和协调多个Docker容器,以确保Java服务的高可用性和可伸缩性。在使用Docker和Kubernetes部署Java服务时,需要注意一些细节,例如如何优容器镜像、如何配置Kubernetes集群等。 ### 回答2: 随着云计算和容器技术的发展,Docker和Kubernetes已经成为开发和部署Java服务的首选工具。在本文中,我们将重点介绍如何使用Docker和Kubernetes来部署Java服务。 Docker是一种容器技术,可以将应用程序、库和依赖项打包到Docker镜像中,并将其部署到任何支持Docker的环境中。对于Java服务来说,这意味着将Java应用程序打包到Docker镜像中,然后将这些镜像部署Docker容器中。这可以简应用程序的部署、维护和扩展,同时保证基础架构的可移植性。 Kubernetes是一种容器编排平台,可以管理和编排多个Docker容器,形成一个高可用、可扩展的分布式应用程序。对于Java服务来说,Kubernetes可以协调多个Java服务的部署、发现和负载均衡。这可以提高应用程序的可用性和性能,同时简应用程序的部署和运维。 下面是使用Docker和Kubernetes来部署Java服务的具体步骤: 1. 创建Docker镜像:首先,需要编写Dockerfile文件,指定Java应用程序的构建、运行和依赖项。然后,使用Docker CLI来构建和发布镜像到Docker Hub或私有Docker Registry。 2. 配置Kubernetes集群:可以使用minikube或kubeadm来创建本地或云端的Kubernetes集群。然后,使用kubectl工具来检查集群状态、创建命名空间、服务和容器等。 3. 部署Java服务:使用kubectl来创建Deployment对象,指定Java应用程序的Docker镜像和容器端口等。可以指定多个复制品(replica)来提高可用性和负载均衡。然后,使用kubectl expose命令创建Service对象,使外部客户端能够访问Java服务。 4. 水平扩展Java服务:使用kubectl scale命令可以让Kubernetes自动扩展Java服务的复制品数。也可以使用HPA(Horizontal Pod Autoscaler)来根据CPU使用率或其他指标动态扩展Java服务。 总之,使用Docker和Kubernetes来部署Java服务可以简应用程序的维护和扩展,同时提高应用程序的可用性和性能。需要注意的是,在实践中需要考虑安全、监控、日志记录等方面的问题。 ### 回答3: Docker是一款轻量级的容器技术,它可以将应用程序及其依赖打包成独立的可执行容器,方便部署和迁移。而Kubernetes(k8s)则是一款开源的容器编排系统,可以自动管理和调度Docker容器,提供高可用性和伸缩性。 在部署Java服务的过程中,可以采用Docker和Kubernetes的组合,使得应用程序能够快速部署和扩展。具体的步骤如下: 1. 编写Dockerfile,该文件定义了构建Docker镜像的步骤,包括基础镜像、依赖安装、代码拷贝等操作。同时,可以在Dockerfile中设置环境变量和启动命令,以便在容器启动时执行相应的操作。 2. 构建Docker镜像,使用Docker命令将Dockerfile构建成镜像,可以使用DockerHub等公共仓库或者自行搭建私有仓库。 3. 部署Docker容器,使用Kubernetes的Pod部署Java应用程序,一个Pod可以包含一个或多个容器,通常情况下一个Pod只包含一个容器。可以在Pod中设置容器的资源需求和限制,以便在高负载时自动扩展和缩容。 4. 设置服务发现和负载均衡,使用Kubernetes的Service来暴露Pod中的应用程序,同时实现内部和外部的负载均衡和服务发现,可以使用Kubernetes自带的Ingress或者第三方的Ingress Controller。 5. 监控和日志收集,使用Kubernetes的监控和日志收集功能,可以实时监控容器的状态和性能指标,同时收集容器的日志,为故障排查和性能优提供支持。 综上所述,采用Docker和Kubernetes部署Java服务可以加速应用程序的部署和扩展,同时提高应用程序的可用性和可维护性。需要注意的是,这只是一个简单的部署流程,实际上根据实际情况还需要进行相关的优和调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值