上一节中了介绍了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

 

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐