K8S入门到精通08-项目实战:K8S构建贝亲婴童商城
项目拓扑
该项目拓扑结构如图所示,基本说明如下
- 使用文件共享区的数据库脚本初始化mysql数据库
- 使用beiqin-db-service在集群内部暴露mysql服务
- 使用openjdk:8u222作为基础镜像,部署web应用(SpringBoot开发)
- 使用beiqin-app-service暴露应用的端口
部署所需资源文件
部署所需资源均在文末的百度网盘中,所需资源目录结构如下
[aaa@qq.com www-data]# tree beiqin
beiqin
├── beiqin-app-deploy.yml # web应用部署文件
├── beiqin-app-service.yml # web应用service部署文件
├── beiqin-db-deploy.yml # 数据库部署文件
├── beiqin-db-service.yml # 数据库service部署文件
├── dist
│ ├── application.yml # 应用程序配置文件
│ └── beiqin-app.jar # SpringBoot应用程序
└── sql
└── beiqin.sql # 数据库初始化sql
设置并挂载NFS文件
为了简化操作步骤,这里我们延用《05-基于NFS的集群文件共享》中的NFS设置,将Master节点中的/data/www-data共享到Node节点中的/data/www-data目录中
将需要共享的文件复制到Master节点的/data/www-data目录即可
部署并初始化数据库
编写beiqin-db-deploy.yml
apiVersion: apps/v1beta1 # 等价于extensions/v1beta1(1.6版本以前),1.6版本之后都可以使用apps/*
kind: Deployment # 这是一个部署脚本
metadata: # 元数据信息
name: beiqin-db-deploy # deployment的名称
spec: # 详细信息
replicas: 1 # 部署的副本数量
template: # 模板的设置选项
metadata:
labels: # 标签
app: beiqin-db-deploy # 自定义app标签
spec:
volumes: # 定义数据卷
- name: beiqin-db-volume # 数据卷名称
hostPath: # 主机路径
path: /data/www-data/beiqin/sql/ # Node宿主机上共享文件夹的路径
containers:
- name: beiqin-db-deploy
image: mysql:5.7 # 容器使用镜像
ports:
- containerPort: 3306 # 容器对外声明的暴露端口
env:
- name: MYSQL_ROOT_PASSWORD # 设置mysql的root密码
value: "root"
volumeMounts: # 设置挂载点
- name: beiqin-db-volume # 挂载之前定义的数据卷
mountPath: /docker-entrypoint-initdb.d # 挂载到容器的目录,docker-entrypoint-initdb.d为mysql初始化脚本的目录
部署数据库
kubectl create -f beiqin-db-deploy.yml
验证部署情况
# 查看pod
kubectl get pods
# 进入pod实例内部
kubectl exec -it beiqin-db-deploy-869d9cbdcb-6j567 /bin/bash
# 在容器内部登录mysql
mysql -uroot -proot
# 查看数据库
show databases;
# 使用beiqin db,统计t_goods表
use beiqin;
show tables;
select count(*) from t_goods;
创建db服务
编写beiqin-db-service.yml
apiVersion: v1
kind: Service
metadata:
name: beiqin-db-service
labels: # Service是特殊的pod,也必须定义labels
app: beiqin-db-service
spec:
selector:
app: beiqin-db-deploy
ports:
- port: 3310 # service对外暴露端口(对外指的是:容器外,K8S集群内部)
targetPort: 3306 # 容器内部端口
创建beiqin-db-service
kubectl create -f beiqin-db-service.yml
验证
# 查看service列表
kubectl get svc
# 查看beiqin-db-service详情
kubectl describe svc beiqin-db-service
部署Web应用
编写beiqin-app-deploy.yml
,大部分字段意义与beiqin-db-deploy.yml
相同,不再赘述。
apiVersion: apps/v1beta1
kind: Deployment
metadata:
name: beiqin-app-deploy
spec:
replicas: 2
template:
metadata:
labels:
app: beiqin-app-deploy
spec:
volumes:
- name : beqin-app-volume
hostPath:
path: /data/www-data/beiqin/dist
containers:
- name: beiqin-app-deploy
image: openjdk:8u222-jre
command: ["/bin/sh"] # 容器部署完成后默认执行的命令
args: ["-c","cd /usr/local/beiqin-dist;java -jar beiqin-app.jar"] # 启动web应用的命令
volumeMounts:
- name: beqin-app-volume
mountPath: /usr/local/beiqin-dist
部署web应用
kubectl create -f beiqin-app-deploy.yml
查看应用状态
# 查看pod列表
kubectl get pods
# 查看容器日志
kubectl logs -f beiqin-app-deploy-5bc96d54d9-pjnvf
确认beiqin-app.jar使用的配置文件application.yml
server:
port: 80
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://beiqin-db-service:3310/beiqin?useUnicode=true&characterEncoding=utf-8&useSSL=false
username: root
password: root
mvc:
favicon:
enabled: false
mybatis:
mapper-locations: classpath:/mapper/*.xml
configuration:
map-underscore-to-camel-case: true
注意url: jdbc:mysql://beiqin-db-service:3310/beiqin?useUnicode=true&characterEncoding=utf-8&useSSL=false
,数据库连接不再直接使用数据库的IP,而是使用DB Service中定义的服务名称/主机名称,这样配置文件就不用写死IP。
创建应用服务
编写beiqin-app-service.yml
apiVersion: v1
kind: Service
metadata:
name: beiqin-app-service
labels:
app: beiqin-app-service
spec:
selector:
app: beiqin-app-deploy
ports:
- port: 80
targetPort: 80
创建beiqin-app-service
kubectl create -f beiqin-app-service.yml
验证
# 查看service的CLUSTER-IP
kubectl get svc
# 验证web应用接口
curl 10.101.231.228/goods?gid=1788
使用rinetd实现端口转发
在Master节点上修改/etc/rinetd.conf
0.0.0.0 80 10.101.231.228 80
加载rinetd配置
rinetd -c /etc/rinetd.conf
在浏览器中访问如下地址(192.168.0.31为Master节点/IP),就能看到商城的页面了。
http://192.168.0.31/goods?gid=1788
版权说明
本文章内容为马士兵教育《架构师高级技能kubernetes入门到精通》课程的学习笔记
百度网盘上相关源码资料包 提取码:xdji