热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

k8s构建java应用

上一节中了介绍了minikube的安装以及一个简单的hello-wordservice的部署,下面主要介绍如何部署一个java应用构建基础镜像1.构建centos

上一节中了介绍了minikube的安装以及一个简单的hello-word service的部署,下面主要介绍如何部署一个java应用

构建基础镜像

1. 构建centos镜像

1.1 构建之前,需要先安装docker

> brew install docker

由于已经安装了minikube,它默认已经启动了一个内置的docker daemon,所以我们可以直接修改docker的env,
查看下运行的容器,可以正常访问了

> eval $(minikube docker-env)
> docker ps

1.2 编写centos dockerfile
> mkdir -p ~/docker-images/baseos > cat Dockerfile FROM centos:7 MAINTAINER "your info" LABEL Description="base image for all other images" Version="1.0.0" #ajust timezone RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

1.3 构建镜像
构建好之后,查看下本地是否有对应镜像

```
> docker build -t com.my/baseos:1.0.0 .
> docker images
```

2. 构建jre镜像

2.1 下载jre编写dockerfile

```
> wget http://download.oracle.com/otn/java/jdk/8u152-b16/aa0333dd3019491ca4f6ddbe78cdb6d0/jre-8u152-linux-x64.tar.gz
> mkdir -p ~/docker-images/jre-8u152
> cat Dockerfile
FROM com.jds/baseos:1.0.0
MAINTAINER "your info"
LABEL Description="image for jre 8u152" Version="1.0.0"
ADD jre-8u152-linux-x64.tar.gz /usr/lib/jvm/
RUN update-alternatives --install "/usr/bin/java" "java" "/usr/lib/jvm/jre1.8.0_152/bin/java" 1 \&& update-alternatives --set java /usr/lib/jvm/jre1.8.0_152/bin/java
ENV JAVA_HOME /usr/lib/jvm/jre1.8.0_152```

2.2 构建镜像

```
> docker build -t com.my/jre:8u152 .
> docker images
```

2.3 验证镜像

```
> docker run --rm com.jds/jre:8u152 java -version
java version "1.8.0_152"
Java(TM) SE Runtime Environment (build 1.8.0_152-b16)
Java HotSpot(TM) 64-Bit Server VM (build 25.152-b16, mixed mode)
```

3. 构建java应用镜像

3.1 编写dockerfile
假设maven构建好的包名称叫app.jar,对应的依赖包在lib目录下,那我们需要将这些文件copy到镜像内,如下所示

```
> mkdir ~/docker-images/app
> cat Dockerfile
FROM com.jds/jre:8u152
MAINTAINER "your info"
LABEL Description="image for app" Version="1.0.0"RUN mkdir /usr/app
WORKDIR /usr/app
ADD app.jar /usr/app
ADD lib /usr/app/lib
CMD ["java", "-jar", "app.jar"]```

3.2 构建镜像
> docker build -t com.my/app:1.0.0 . > docker images

3.3 配置文件
至此为止,镜像已经处理完成,但是应用中有一些配置文件我们可能希望它能动态配置,所以我们可以将需要的配置文件上传到k8s的configmap中

```
> mkdir ~/config
> touch c1.properties
> touch c2.properties
#from-file参数跟目录表示该目录下所有配置文件全部加入,key为文件名,value为文件内容
> kubectl create configmap app-config --from-file=~/config
```

查看下配置文件
> kubectl get configmap app-config -o yaml

配置k8s

k8s最小的单位是pod,deployment是基于pod抽象的一层,这里使用deployment的原因是我可能希望某个应用运行多个实例,配置它的负载策略,另外
一些配置文件也需要在这时加载好,应用本身才启动

1. 创建deployment配置文件

> cat app-deployment.yaml
apiVersion: apps/v1beta1
kind: Deployment
metadata:name: app-deploymentlabels:app: app
spec:# 副本数replicas: 3selector:matchLabels:app: apptemplate:metadata:labels:app: appspec:containers:- name: appimage: com.my/app:1.0.0workingDir: /usr/appcommand: ["/bin/bash", "-c", "ln -s /usr/app/config/conf.properties /usr/app/conf.properties && java -jar app.jar"]ports:- containerPort: 8888volumeMounts:- mountPath: /usr/app/configname: configvolumes:- name: configconfigMap:name: app-configitems:- key: c1.propertiespath: conf.properties

配置文件里面上半部分好理解,主要介绍下containers的配置,image使用的com.my/app:1.0.0,这是我们刚build过的,工作目录指定了/usr/app,因为app.jar以及lib包都在该
目录下,端口开的是8888,该端口根据应用本身开启的端口而定,在介绍command之前先说明下volumeMounts以及volumes。
volumeMounts是创建挂载点,在这里创建了一个叫config的挂载点,挂载的路径是/usr/app/config,需要注意的是不要挂载在已有文件的目录,否则会覆盖
volumes是在通过不同的方式拉取数据,放到volumeMounts指定的挂载点上,在这里我们使用configmap这种方式拉取到app-config下key为c1.properties的数据重命名为conf.properties
挂载到了/usr/app/config目录下,所以容器执行完这些就会存在/usr/app/config/conf.properties这个文件。理解了这个那么command就好理解了,建立一个软链接到工作目录下方便app.jar应用的读取

2. 创建deployment

kubectl create -f app-deployment.yaml

查看deployment

kubectl get deployments

可以看到3个部署

3. 创建service配置文件

> cat app-service.yaml
apiVersion: v1
kind: Service
metadata:name: app-servicelabels:app: app
spec:type: NodePortports:- port: 8888protocol: TCPtargetPort: 8888selector:app: app

这个相对简单,由于我们使用的类型是NodePort,而且没有指定nodePort 这个字段,所以k8s会随机产生一个端口,该端口作为所有进入该service的入口,并由该service分发到它后面的8888
端口上

4. 创建service

kubectl create -f app-service.yaml

查看service

> kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
app-service NodePort 10.104.129.65 8888:30140/TCP 5h

可以看到它对外暴露的端口是30140

5. 访问

> minicube ip
192.168.99.100
> curl "http://192.168.99.100:30140"

常用命令

# 查看pods
> kubectl get pods
# 查看pods详细信息
> kubectl descibe pods
# 用于查看容器启动后的返回,排错时有用
> kubectl logs -c
# 登录到container
> kubectl exec -it -- /bin/bash
# 开启dashboard ui,并且指定绑定的端口以及允许192.168.9网段的访问
> kubectl proxy --address='192.168.9.1' --accept-hosts='^192\.168\.9\..*'
# service 列表
> minikube service list
# 查看某个service的url
> minikube service app-service --url

 


推荐阅读
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 2019我的金三银四
    先讲一下自己的情况吧,二本学生,17年毕业,目前在一家跨境电商从事Java技术开发工作(不是阿里,没那么厉害),技术栈目前偏向于容器云、持续集成持续交付这一块,也就是SpringBoot、Kuber ... [详细]
  • docker+k8s+git+jenkins
    docker+k8s+git+jenkins,Go语言社区,Golang程序员人脉社 ... [详细]
  • k8shelm官网:https:helm.sh点击charts:https:artifacthub.iopackagessearch?sortrelevance&page11.1h ... [详细]
  • kubelet配置cni插件_Kubernetes新近kubectl及CNI漏洞修复,Rancher 2.2.1发布
    今天,Kubernetes发布了一系列补丁版本,修复新近发现的两个安全漏洞CVE-2019-1002101(kubectlcp命令安全漏洞)和CVE-2 ... [详细]
  • Kubernetes集群高可用的策略和实践 ... [详细]
  • 虚拟机CentOS7挂载文件系统失败上周五下班前没有关闭虚拟机和物理机,今天周一开了虚拟机之后,发现操作系统启动失败。原因跟这篇文章描述的一模一样。解决操作系统的文件系统挂载的问题 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • 本文记录了在vue cli 3.x中移除console的一些采坑经验,通过使用uglifyjs-webpack-plugin插件,在vue.config.js中进行相关配置,包括设置minimizer、UglifyJsPlugin和compress等参数,最终成功移除了console。同时,还包括了一些可能出现的报错情况和解决方法。 ... [详细]
  • Java 11相对于Java 8,OptaPlanner性能提升有多大?
    本文通过基准测试比较了Java 11和Java 8对OptaPlanner的性能提升。测试结果表明,在相同的硬件环境下,Java 11相对于Java 8在垃圾回收方面表现更好,从而提升了OptaPlanner的性能。 ... [详细]
  • centos安装Mysql的方法及步骤详解
    本文介绍了centos安装Mysql的两种方式:rpm方式和绿色方式安装,详细介绍了安装所需的软件包以及安装过程中的注意事项,包括检查是否安装成功的方法。通过本文,读者可以了解到在centos系统上如何正确安装Mysql。 ... [详细]
  • CentOS7.8下编译muduo库找不到Boost库报错的解决方法
    本文介绍了在CentOS7.8下编译muduo库时出现找不到Boost库报错的问题,并提供了解决方法。文章详细介绍了从Github上下载muduo和muduo-tutorial源代码的步骤,并指导如何编译muduo库。最后,作者提供了陈硕老师的Github链接和muduo库的简介。 ... [详细]
  • Spring框架《一》简介
    Spring框架《一》1.Spring概述1.1简介1.2Spring模板二、IOC容器和Bean1.IOC和DI简介2.三种通过类型获取bean3.给bean的属性赋值3.1依赖 ... [详细]
  • “自主设计与实施的故障注入微服务Sidecar,欢迎大佬批评指正!”
    “故障注入Sidecar“——为您的微服务注入故障以验证集群性能!由于导师和实验室师兄们的科研需要,本人专门以Sidecar的模式设计了一个用于错误注入的微服务模块。该模块可以与任 ... [详细]
  • 本文|层面_Kubernetes概述
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Kubernetes概述相关的知识,希望对你有一定的参考价值。前言本文搜集大量关于Kuber ... [详细]
author-avatar
冰凌清泽_712
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有