美文网首页k8s
k8s构建java应用

k8s构建java应用

作者: edolovee | 来源:发表于2018-01-25 10:15 被阅读0次

    Kubernetes is an open-source system for automating deployment, scaling, and management of containerized applications.

    上一节中了介绍了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-deployment
      labels:
        app: app
    spec:
      # 副本数
      replicas: 3
      selector:
        matchLabels:
          app: app
      template:
        metadata:
          labels:
            app: app
        spec:
          containers:
          - name: app
            image: com.my/app:1.0.0
            workingDir: /usr/app
            command: ["/bin/bash", "-c", "ln -s /usr/app/config/conf.properties /usr/app/conf.properties && java -jar app.jar"]
            ports:
            - containerPort: 8888
            volumeMounts:
            - mountPath: /usr/app/config
              name: config
          volumes:
          - name: config
            configMap:
              name: app-config
              items:
              - key: c1.properties
                path: 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-service
      labels:
        app: app
    spec:
      type: NodePort
      ports:
      - port: 8888
        protocol: TCP
        targetPort: 8888
      selector:
        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   <none>        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 <pod name> -c <container name> 
    # 登录到container
    > kubectl exec -it <pod name> -- /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
    

    相关文章

      网友评论

        本文标题:k8s构建java应用

        本文链接:https://www.haomeiwen.com/subject/newmaxtx.html