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
网友评论