1、案例需求介绍
ZrLog是使用 Java 开发的博客平台,运行在tomcat环境中,本案例需要将ZrLog部署在k8s集群中,并实现外部访问。
部署思路如下:
准备镜像仓库,用于存储镜像。
将Java项目提前打包好,项目运行在什么环境中,需要将运行环境打包到镜像中。
准备项目所需的数据库,并配置好项目连接数据库的信息。
在k8s中部署项目,并通过Ingress发布项目。
2、部署zrlog数据库
本方案将数据部署在k8s集群外部。可以直接使用前边项目的数据库。
#登录数据库
mysql -uroot -padmin123456
#创建zrlog数据库
create database zrlog;
#创建zrlog用户(密码长度须满足8位)
create user zrlog@'%' identified by "zrlog123456";
#授权用户权限
grant all on zrlog.* to zrlog@'%' identified by "zrlog123456";
#查看用户
select user,host from mysql.user;3、准备zrlog镜像
通过Dockerfile来构建zrlog镜像
mkdir zrlog
cd zrlogcat dockerfile
#定义基础镜像
FROM centos:7.9.2009
#配置阿里仓库安装openJDK
RUN yum install --nogpgcheck java-1.8.0-openjdk.x86_64 -y && \
yum clean all && rm -rf /var/cache/yum/*
#拷贝tomcat二进制包
COPY ./apache-tomcat-8.0.30.tar /
#安装tomcat
RUN tar -xf /apache-tomcat-8.0.30.tar -C /usr/local/ && \
mv /usr/local/apache-tomcat-8.0.30/ /usr/local/tomcat
#清空webapps目录默认数据
RUN rm -rf /usr/local/tomcat/webapps/*
#拷贝zrlog.war到webapps目录
COPY ./zrlog.war /usr/local/tomcat/webapps/
#将zrlog目录改名为ROOT作为tomcat的默认一级访问目录
RUN mv /usr/local/tomcat/webapps/zrlog.war /usr/local/tomcat/webapps/ROOT.war
#暴露容器的端口
EXPOSE 8080
#启动tomcat(该脚本tomcat自带)
CMD ["/usr/local/tomcat/bin/catalina.sh","run"]#构建镜像(准备好需要拷贝的tomcat二进制包和zrlog.war包到当前构建目录)
docker build -f dockerfile -t zrlog:v1.0 .推送zrlog镜像到harbor仓库
提示:在harbor中创建一个名为zrlog的项目仓库。
#登录仓库
docker login 192.168.0.25
Username: admin
Password: 12345#修改镜像标签
docker tag zrlog:v1.0 192.168.0.25/zrlog/zrlog:v1.0#上传镜像到仓库
docker push 192.168.0.25/zrlog/zrlog:v1.04、部署zrlog项目
创建zrlog名称空间
kubectl create ns zrlog在zrlog空间中创建Secret存储Harbor仓库信息
kubectl create secret docker-registry registry \
--docker-server=192.168.0.25 \
--docker-username=admin \
--docker-password=12345 \
--namespace=zrlog创建PVC存储tomcat日志文件
# cat tomcatlog-pvc.yml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: tomcat-log
namespace: zrlog
spec:
storageClassName: "nfs-client"
accessModes:
- ReadWriteMany
resources:
requests:
storage: 5Gi#创建PVC
kubectl create -f tomcatlog-pvc.yml通过Deployment部署zrlog
cat zrlog-pod.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: zrlog-deploy
namespace: zrlog
spec:
replicas: 1
selector:
matchLabels:
app: zrlog
template:
metadata:
labels:
app: zrlog
spec:
imagePullSecrets: #镜像仓库的secret
- name: registry
containers:
- name: zrlog
image: 192.168.0.25/zrlog/zrlog:v1.0
ports:
- containerPort: 8080
env:
- name: JAVA_TOOL_OPTIONS #设置程序编码为UTF8
value: "-Dfile.encoding=UTF-8"
volumeMounts:
- name: log #挂载卷
mountPath: /usr/local/tomcat/logs/ #挂载到容器的目录
volumes: #定义存储卷
- name: log #卷名称
persistentVolumeClaim: #卷类型PVC
claimName: tomcat-log #PVC名字
---
#Service
apiVersion: v1
kind: Service
metadata:
name: zrlog-svc
namespace: zrlog
spec:
selector:
app: zrlog
ports:
- port: 8080
targetPort: 8080#创建Pod
kubectl create -f zrlog-pod.yml创建Ingress发布zrlog提供外部访问
cat zrlog-ingress.yml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: zrlog-ingress #自定义ingress名称
namespace: zrlog
annotations:
#指定控制器的类别为nginx
kubernetes.io/ingress.class: nginx
spec:
rules: #定义主机列表
- host: web.zrlog.com #自定义域名
http:
paths:
- pathType: Prefix #路径类型
path: "/" #定义站点路径
backend: #定义后端引用的服务
service: #关联service
name: zrlog-svc #对应上面创建的service名称
port:
number: 8080 #service端口#创建Ingress
kubectl create -f zrlog-ingress.yml提示:windows配置域名解析
发表一篇文章验证博客平台可用性!
扩容zrlog的Pod数量后再次验证
kubectl edit deploy zrlog-deploy -n zrlog
...
replicas: 3问题:默认新扩容的Pod都需要指定数据库的连接信息。解决方法可以通过在原有的镜像基础上,直接定义好数据库的连接信息,在重新构建一个新的镜像即可。
删除zrlog的Pod
kubectl delete -f zrlog-pod.yml在MySQL中删除zrlog数据库并重新创建
drop database zrlog;
create database zrlog;在Harbor主机基于上一个镜像创建容器,并指定连接数据库的信息,然后在重新构建新的镜像
docker run -id --name=zrlog -p 8080:8080 zrlog:v1.0访问zrlog:http://192.168.0.25:8080
数据库连接成功后,通过docker将该容器重新导成新镜像
docker commit zrlog zrlog:v2.0修改镜像标签上传到仓库
docker tag zrlog:v2.0 192.168.0.25/zrlog/zrlog:v2.0
docker push 192.168.0.25/zrlog/zrlog:v2.0在k8s中创建PVC存储zrlog文章中的图片
cat zrlog-pvc.yml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: zrlog-data
namespace: zrlog
spec:
storageClassName: "nfs-client"
accessModes:
- ReadWriteMany
resources:
requests:
storage: 5Gi#创建PVC
kubectl create -f zrlog-pvc.yml通过Deployment部署zrlog:v2.0版本镜像,并挂载PVC
cat zrlog-pod.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: zrlog-deploy
namespace: zrlog
spec:
replicas: 1
selector:
matchLabels:
app: zrlog
template:
metadata:
labels:
app: zrlog
spec:
imagePullSecrets: #镜像仓库的secret
- name: registry
containers:
- name: zrlog
image: 192.168.0.25/zrlog/zrlog:v2.0
ports:
- containerPort: 8080
env:
- name: JAVA_TOOL_OPTIONS #设置程序编码为UTF8
value: "-Dfile.encoding=UTF-8"
volumeMounts:
- name: log #挂载卷
mountPath: /usr/local/tomcat/logs/ #挂载到容器的目录
- name: data #挂载卷
mountPath: /usr/local/tomcat/webapps/ROOT/attached/
volumes: #定义存储卷
- name: log #卷名称
persistentVolumeClaim: #卷类型PVC
claimName: tomcat-log #PVC名字
- name: data
persistentVolumeClaim: #卷类型PVC
claimName: zrlog-data #PVC名字
---
#Service
apiVersion: v1
kind: Service
metadata:
name: zrlog-svc
namespace: zrlog
spec:
selector:
app: zrlog
ports:
- port: 8080
targetPort: 8080#创建Pod
kubectl create -f zrlog-pod.yml登录zrlog发表一篇带图片的文章:http://web.zrlog.com
扩容zrlog验证新的Pod是否需要重新配置连接数据库
kubectl edit deploy zrlog-deploy -n zrlog
...
replicas: 3





评论区