为什么选云原生搭博客?
前阵子朋友问我,想搞个稳定的个人博客,又不想老盯着服务器看,有没有省心的办法。我直接给他推了云原生那套玩法——用容器跑服务,Kubernetes 管调度,CI/CD 自动更新,故障自动恢复。他一开始觉得复杂,可真上手后发现,比传统 LAMP 架构还省事。
我自己这个博客就是个现成例子。最开始放在一台 VPS 上,MySQL 一崩整个网站就挂。后来换成云原生架构,别说重启节点不影响访问,就连我把数据库 Pod 干掉,系统几秒内就拉起新的,用户几乎无感。
技术栈选型
前端用的是 Hugo 静态生成,后端评论系统用的是 Waline,数据存 MongoDB。所有服务都打包成 Docker 镜像,部署在阿里云 ACK(Kubernetes 集群)上。CI/CD 用 GitHub Actions 实现,每次提交代码自动构建并推送镜像,然后触发 K8s 滚动更新。
域名通过 Ingress-Nginx 对外暴露,HTTPS 用 cert-manager 自动申请 Let's Encrypt 证书。整套流程跑通后,基本不用手动干预。
Dockerfile 示例
FROM nginx:alpine
COPY public /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]Kubernetes 部署文件片段
apiVersion: apps/v1
kind: Deployment
metadata:
name: blog-frontend
spec:
replicas: 3
selector:
matchLabels:
app: blog
template:
metadata:
labels:
app: blog
spec:
containers:
- name: hugo-site
image: registry.cn-hangzhou.aliyuncs.com/myblog/site:v1.2
ports:
- containerPort: 80CI/CD 自动化脚本关键段
GitHub Actions 中的部署步骤:
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Deploy to Kubernetes
run: |
echo "${{ secrets.KUBE_CONFIG }}" > kubeconfig.yml
kubectl apply -f k8s/deployment.yaml --kubeconfig=kubeconfig.yml遇到的真实问题和解法
刚开始 MongoDB 偶尔连接不上。排查发现是 Pod 被调度到不同节点,本地存储丢了数据。后来改成云盘持久卷(PersistentVolume),问题立马解决。
还有一次,Ingress 配置写错了路径,导致静态资源404。这时候滚动更新的特性就体现出来了——回滚到上一版本,两分钟恢复正常。
现在这博客扛住过几次小范围流量高峰,包括一次被 V2EX 首页推荐,QPS 到了三百多也没崩。朋友看完说:“原来云原生不是大厂专属,咱普通人也能玩得转。”