一,前言
在 K8S 上如何部署一个简单的服务?此文中,将介绍如何在 K8S 上部署一个 halo 博客,并将服务暴露到外网。大致流程可以参考下图:
大致流程可以概况为:
- 准备服务镜像;
- 通过 pod 控制器管理创建 pod;
- 通过 Service 暴露服务;
- 域名解析,对外发布服务;
部署前需要准备:
- K8S 集群环境;
- 已搭建的MySQL 服务;
- halo 服务镜像;
二,准备服务镜像
从 halo 官网可以拿到最新的镜像为:
halohub/halo:1.5.3
一般项目需要通过 Dockerfile 生成镜像,通过 Jenkins 将镜像上传到 DockerHub 或者 阿里云镜像中心,然后就能获取到可用的服务镜像。
可参考:Docker 构建镜像
三,通过pod 控制器创建
可以通过 pod 控制器去创建指定副本数量的 pod,以及配置服务启动相关参数(也可以通过 ConfigMap)和容器卷挂载相关配置。
开始前需要准备已经搭建好的 MySQL 服务,并在 MySQL 中新建 halodb 数据库。
创建并编辑 pod 控制器 yaml 文件:
mkdir /k8s/halo
vim halo-deploy.yaml
halo-deploy.yaml 文件配置:
apiVersion: apps/v1
kind: Deployment
metadata:
name: halo-blog
namespace: halo
labels:
app: halo
spec:
replicas: 2 # 创建2个副本
selector:
matchLabels:
app: halo
template:
metadata:
labels:
app: halo
spec:
containers:
- name: halo
image: halohub/halo:1.5.3
imagePullPolicy: IfNotPresent
volumeMounts:
- name: halo-volume
mountPath: /root/.halo
env:
- name: "SERVER_PORT"
value: "8090"
- name: "SPRING_DATASOURCE_DRIVER_CLASS_NAME"
value: "com.mysql.cj.jdbc.Driver"
- name: "SPRING_DATASOURCE_URL"
value: "jdbc:mysql://mysql地址/halodb?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true"
- name: "SPRING_DATASOURCE_USERNAME"
value: "用户名"
- name: "SPRING_DATASOURCE_PASSWORD"
value: "密码"
- name: "HALO_ADMIN_PATH"
value: "admin"
- name: "HALO_CACHE"
value: "memory"
volumes:
- name: halo-volume
hostPath:
path: /k8s/halo/logs # 挂载到主机/k8s/halo/logs目录
type: DirectoryOrCreate
根据配置文件启动:
kubectl apply -f halo-deploy.yaml
启动后通过命令及查看启动日志检查 pod 是否创建成功:
kubectl get pod -n halo
kubectl logs -f --tail 200 pod全名称 -n halo
四,通过 Service 暴露服务
可以通过 Service 的 NodePort 类型,将 service 的端口映射到Node的一个端口上,然后就可以通过NodeIp:NodePort 来访问 service 了。
创建并编辑 Service 配置文件
vim halo-svc.yaml
halo-svc.yaml 配置:
apiVersion: v1
kind: Service
metadata:
name: halo-svc
namespace: halo
spec:
selector:
app: halo
type: NodePort
ports:
- port: 8090 # service端口
nodePort: 30002 # 主机端口 范围:30000-32767
targetPort: 8090 # pod端口
根据配置文件启动 Service:
kubectl apply -f halo-svc.yaml
启动完成后,在浏览器上访问 服务器ip:暴露端口
看能否成功访问。
至此,已成功通过 K8S 部署。
评论区