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