k8s内网环境部署web项目(tomcat+mysql)
k8s内网环境部署web项目, 包括镜像制作, 导入与导出, 资源创建
·
k8s部署web项目
本篇k8s版本为1.18, 容器运行时为docker
注: kubernetes从1.24版本开始, 移除了对docker的支持, 采用containerd作为容器运行时
一、准备镜像
-
准备包含web项目的tomcat压缩包,jdk压缩包
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7JvWKSP3-1680597266913)(images/image-20230321150545441-16805972329092.png)]](https://i-blog.csdnimg.cn/blog_migrate/71f1e3d11537b2dee66bef56ffd2d4ef.png)
-
在上一步的目录下编写dockerfile文件
vim dockerfileFROM centos:7 ADD apache-tomcat-9.0.64.tar.gz /usr/local/ ADD jdk-8u291-linux-x64.tar.gz /usr/local/ # 定义工作目录 ENV MYPATH /usr/local WORKDIR $MYPATH # 设置JAVA_HOME 环境变量 ENV JAVA_HOME /usr/local/jdk1.8.0_291 # 设置CLASSPATH 环境变量 ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.64 ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.64 # 设置PATH ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin # 暴露端口 EXPOSE 8080 # 指定容器启动后执行的命令 CMD /usr/local/apache-tomcat-9.0.64/bin/startup.sh && tail -f /usr/local/apache-tomcat-9.0.64/logs/catalina.out -
构建镜像
docker build -t myweb:v1 .选项:
-t给镜像加一个Tagmyweb镜像名称v1镜像版本号.表示当前目录,即Dockerfile所在目录
tips:当使用Dockerfile构建镜像时,所在的目录一定要使用一个干净的目录(最好新建一个),以免目录下有其他文件(构建会加载当前目录下所有文件,导致磁盘爆满)。![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tAU7bGHn-1680597266915)(images/image-20230321151843654.png)]](https://i-blog.csdnimg.cn/blog_migrate/d8ed9d295203716b5ff1b5c7f88e99c6.png)
输出Successfully tagged myweb:v1后使用
docker images命令查看镜像![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GaXvMzdj-1680597266917)(images/image-20230321152127777.png)]](https://i-blog.csdnimg.cn/blog_migrate/42dd22568e34078e6197721fcf2c4865.png)
-
启动镜像
docker run -d -p 18080:8080 --name myweb -v /home/tomcat/logs:/usr/local/apache-tomcat-9.0.64/logs --restart=always myweb:v1选项:
--name: 容器名称-d: 后台启动-p: 映射端口--restart=always: 容器自启(默认为no)-v: 目录挂载
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eYAWGWMY-1680597266918)(images/image-20230321152801566.png)]](https://i-blog.csdnimg.cn/blog_migrate/22b4c0f73cb827f7242ddb929a1c95d2.png)
测试访问
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KqV2m7wF-1680597266921)(images/image-20230321153127215.png)]](https://i-blog.csdnimg.cn/blog_migrate/04fbfe752c07f169918a0156aa684972.png)
-
打包镜像
docker save myweb:v1 -o /app/myweb.tardocker save 用来保存镜像
格式:
docker save 镜像名:版本号 -o /路径/保存的包名.tar选项:
-o: 输出到文件![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CDvyBKTk-1680597266921)(images/image-20230321153802978.png)]](https://i-blog.csdnimg.cn/blog_migrate/091522f9779398212e5af0745c4b56e4.png)
MySQL镜像就不多介绍了, 如果k8s集群有外网环境或者有自己的仓库源直接跳过此处
如果是内网环境
docker pull mysql:版本号拉取镜像, 然后使用docker save命令将镜像输出到文件即可
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-W2sXvhOl-1680597266922)(images/image-20230321155131202.png)]](https://i-blog.csdnimg.cn/blog_migrate/c7591594e33c5852af054d899ad66c29.png)
二、Work节点导入镜像
-
将上一步导出的镜像上传到work节点中
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VQTBICRN-1680597266923)(images/image-20230404151254138.png)]](https://i-blog.csdnimg.cn/blog_migrate/0820d2bb0050e05814656c2c3d9ce1b6.png)
-
将镜像文件加载到docker镜像中
docker load -i myweb.tardocker load 用于加载镜像文件
格式:
docker load -i 镜像文件选项:
-i: 指定导入的文件![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fcjVrst4-1680597266924)(images/image-20230404151929284.png)]](https://i-blog.csdnimg.cn/blog_migrate/81b5d0331ef43335793497b5e6692af5.png)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-x8uFOItO-1680597266925)(images/image-20230404152016432.png)]](https://i-blog.csdnimg.cn/blog_migrate/bb9228f2a2d52d3d59469b17c7242483.png)
三、master节点编写yaml文件并创建资源
1.创建deployment资源
vim deploy.yaml
#控制器定义
apiVersion: apps/v1 #指定api版本标签
kind: Deployment #定义资源类型
metadata:
name: myweb #定义资源名称
spec:
replicas: 1 #定义副本数量
selector:
matchLabels: #定义标签选择器,与被控制对象绑定
name: myweb
#被控制对象
template:
metadata: #定义标签选择器
labels:
name: myweb
spec:
containers: #定义容器属性
- name: myweb #镜像名称,一个name定义一个容器,多个容器使用`-`区分
image: myweb:v1 #镜像地址
imagePullPolicy: IfNotPresent #拉取策略
ports:
- name: myweb #端口名称
containerPort: 8080 #容器端口
protocol: TCP #端口协议
resources: #资源管理
limits:
cpu: 500m
memory: 1024Mi
requests:
cpu: 200m
memory: 1024Mi
- name: mysql
image: mysql:5.7
resources:
requests:
memory: 1Gi
cpu: 500m
limits:
memory: 1Gi
cpu: 500m
ports:
- name: mysql
containerPort: 3306
env:
- name: MYSQL_ROOT_PASSWORD
value: root #设置root密码
args:
- --character-set-server=utf8mb4 #字符集为utf8
- --collation-server=utf8mb4_unicode_ci
- --lower_case_table_names=1 #不区分大小写
volumeMounts: #定义数据卷目录,没有自动创建
- name: vol-mysql-data
mountPath: /var/lib/mysql
volumes: #定义数据卷挂载目录
- name: vol-mysql-data
hostPath:
path: /usr/lib/mysql
#通过yaml文件创建实例
kubectl apply -f deploy.yaml
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ejz2GGia-1680597266925)(images/image-20230404161411208.png)]](https://i-blog.csdnimg.cn/blog_migrate/c2230838f6d6669f0428229436c0a394.png)
#查看pods的详细信息
kubectl describe pods myweb
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jSfvyhth-1680597266926)(images/image-20230404161346960.png)]](https://i-blog.csdnimg.cn/blog_migrate/b4d15b6ac47043b0d74466a81a92614a.png)
2.创建service资源
vim svc.yaml
apiVersion: v1
kind: Service
metadata:
name: myweb-svc
spec:
ports:
- name: myweb #端口名称,一个name定义一个端口
nodePort: 31369 #集群对外暴露端口,通过nodeip:nodePort访问
port: 18080 #集群内部访问端口,通过ClusterIP:prot访问
protocol: TCP
targetPort: 8080 #目标端口,也就是容器的端口
- name: mysql
nodePort: 31379
port: 13306
protocol: TCP
targetPort: 3306
selector:
name: myweb #指定label标签的pod绑定
type: NodePort #services类型,默认ClusterIP,NodePort时可指定端口
kubectl apply -f svc.yaml
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mN50HdU0-1680597266927)(images/image-20230404162808350.png)]](https://i-blog.csdnimg.cn/blog_migrate/44a1136c6d5f20fabad014a48735d1d8.png)
3.查看创建的资源
kubectl get pods,svc -o wide
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jNqRFQ4C-1680597266928)(images/image-20230404162931760.png)]](https://i-blog.csdnimg.cn/blog_migrate/d16255483907ffc18edf59b202f23d84.png)
通过集群中的任意节点+NodePort访问
![[外链图片转存中...(img-mN50HdU0-1680597266927)]](https://i-blog.csdnimg.cn/blog_migrate/284170fbfcfe0a970c3ace7a93b65909.png)
更多推荐



所有评论(0)