k8s構(gòu)建java應(yīng)用

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

上一節(jié)中了介紹了minikube的安裝以及一個簡單的hello-word service的部署,下面主要介紹如何部署一個java應(yīng)用

構(gòu)建基礎(chǔ)鏡像

1. 構(gòu)建centos鏡像

1.1 構(gòu)建之前,需要先安裝docker

> brew install docker

由于已經(jīng)安裝了minikube,它默認(rèn)已經(jīng)啟動了一個內(nèi)置的docker daemon,所以我們可以直接修改docker的env,
查看下運(yùn)行的容器,可以正常訪問了

> 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 構(gòu)建鏡像
構(gòu)建好之后,查看下本地是否有對應(yīng)鏡像

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

2. 構(gòu)建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 構(gòu)建鏡像

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

2.3 驗(yàn)證鏡像

```
> 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. 構(gòu)建java應(yīng)用鏡像

3.1 編寫dockerfile
假設(shè)maven構(gòu)建好的包名稱叫app.jar,對應(yīng)的依賴包在lib目錄下,那我們需要將這些文件copy到鏡像內(nèi),如下所示

```
> 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 構(gòu)建鏡像
> docker build -t com.my/app:1.0.0 . > docker images

3.3 配置文件
至此為止,鏡像已經(jīng)處理完成,但是應(yīng)用中有一些配置文件我們可能希望它能動態(tài)配置,所以我們可以將需要的配置文件上傳到k8s的configmap中

```
> mkdir ~/config
> touch c1.properties
> touch c2.properties
#from-file參數(shù)跟目錄表示該目錄下所有配置文件全部加入,key為文件名,value為文件內(nèi)容
> kubectl create configmap app-config --from-file=~/config
```

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

配置k8s

k8s最小的單位是pod,deployment是基于pod抽象的一層,這里使用deployment的原因是我可能希望某個應(yīng)用運(yùn)行多個實(shí)例,配置它的負(fù)載策略,另外
一些配置文件也需要在這時加載好,應(yīng)用本身才啟動

1. 創(chuàng)建deployment配置文件

> cat app-deployment.yaml
apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: app-deployment
  labels:
    app: app
spec:
  # 副本數(shù)
  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,因?yàn)閍pp.jar以及l(fā)ib包都在該
目錄下,端口開的是8888,該端口根據(jù)應(yīng)用本身開啟的端口而定,在介紹command之前先說明下volumeMounts以及volumes。
volumeMounts是創(chuàng)建掛載點(diǎn),在這里創(chuàng)建了一個叫config的掛載點(diǎn),掛載的路徑是/usr/app/config,需要注意的是不要掛載在已有文件的目錄,否則會覆蓋
volumes是在通過不同的方式拉取數(shù)據(jù),放到volumeMounts指定的掛載點(diǎn)上,在這里我們使用configmap這種方式拉取到app-config下key為c1.properties的數(shù)據(jù)重命名為conf.properties
掛載到了/usr/app/config目錄下,所以容器執(zhí)行完這些就會存在/usr/app/config/conf.properties這個文件。理解了這個那么command就好理解了,建立一個軟鏈接到工作目錄下方便app.jar應(yīng)用的讀取

2. 創(chuàng)建deployment

kubectl create -f app-deployment.yaml

查看deployment

kubectl get deployments

可以看到3個部署

3. 創(chuàng)建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會隨機(jī)產(chǎn)生一個端口,該端口作為所有進(jìn)入該service的入口,并由該service分發(fā)到它后面的8888
端口上

4. 創(chuàng)建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詳細(xì)信息
> kubectl descibe pods
# 用于查看容器啟動后的返回,排錯時有用
> kubectl logs <pod name> -c <container name> 
# 登錄到container
> kubectl exec -it <pod name> -- /bin/bash
# 開啟dashboard ui,并且指定綁定的端口以及允許192.168.9網(wǎng)段的訪問
> kubectl proxy --address='192.168.9.1' --accept-hosts='^192\.168\.9\..*'
# service 列表
> minikube service list
# 查看某個service的url
> minikube service app-service --url
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容