之前已经把博客部署到docker中了,这次是要通过k8s部署。
k8s官方文档使用的kubeadm
,配置需求比较高,我的破虚拟机达不到要求,于是试都没试,而找到了这个轻量级的k3s。
cluster环境搭建
最开始是直接下载的release镜像包,不过不好管理,后来使用了git仓库的安装脚本进行安装。
注:
k3s安装好后,应该是k8s本身的一些配置原因,我的80端口被莫名的转发了,之前docker部署的博客也不能访问,一直提示404 page not found
,原因不明。
博客配置
比起docker启动时,指定配置选项,k8s通过yaml配置文件指定这些选项,对我来说,主要是文件系统的挂载。
k8s整个生态还是比较复杂的,我这里使用了比较简单的形式。
Deployment
- 应用增加
app=myblog
的label,供后面service 引用 - 把数据文件、数据库和日志目录,通过hostPath挂载出来
- 这里没有用localhost,因为hostPath不需要预先创建,比较简单
- replicas 仅有一个
apiVersion: apps/v1
kind: Deployment
metadata:
name: myblog-deployment
labels:
app: myblog
spec:
replicas: 1
selector:
matchLabels:
app: myblog
template:
metadata:
labels:
app: myblog
spec:
containers:
- name: myblog
image: mosakashaka/blog:latest
volumeMounts:
- name: blog-data
mountPath: /app/wwwroot/data
- name: blog-db
mountPath: /data
- name: blog-log
mountPath: /app/Logs
volumes:
- name: blog-data
hostPath:
# directory location on host
path: /root/sync/BlogDatabase/blogdata
# this field is optional
type: Directory
- name: blog-db
hostPath:
# directory location on host
path: /root/sync/BlogDatabase/blogdb
# this field is optional
type: Directory
- name: blog-log
hostPath:
# directory location on host
path: /root/kube/bloglog
# this field is optional
type: Directory
Service
这里选择通过Ingress来使能外界访问,所以需要一个Service,map 80端口即可。
apiVersion: v1
kind: Service
metadata:
name: myblog-service
spec:
selector:
app: myblog
ports:
- protocol: TCP
port: 80
targetPort: 80
Ingress
通过NodePort或者LoadBalancer也可以达到这个目的,不过Ingress在有Ingress Controller
的情况下,似乎是我所了解的最简单的方式。
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: myblog-ingress
spec:
backend:
serviceName: myblog-service
servicePort: 80
启动运行
将以上三个文件存储为yaml格式放在一个目录中,如blog
,在父目录中执行
kubectl apply -f myblog
即可启动。
遗留问题
- 80端口被k3s的哪个服务所占用/拦截?
- 其他方式的网络配置