在腾讯云轻量服务器上构建 Kubernetes 集群和部署云原生应用的过程中,由于低配的轻量服务器无法很好的发挥云原生存储应用的性能,导致共享存储一直是一个避而不谈的话题,这也严重影响了集群中一些有状态应用的故障迁移能力。然而,最近腾讯云轻量对象存储的悄然上线为我们提供了一种新的可能性,很大程度上填补了这一环节的不足。
本文将引导读者使用轻量对象存储作为共享存储,部署一个高可用的 Typecho 博客。
购买轻量对象存储
轻量对象存储 Lighthouse-COS 是腾讯云 Lighthouse 服务基于对象存储 COS 服务提供的分布式存储服务。
值得一提的是,轻量对象存储的计费策略非常简单,购买一个资源包就可以覆盖容量和流量两种计费属性,并且接口请求数是免费的。具体购买方式请参阅购买指南。
准备服务器操作环境
1、轻量服务器 Kubernets 集群
如果你还没有可用的集群,可参阅之前的文章快速搭建:腾讯云同地域组建Kubernetes集群。
2、挂载轻量对象存储桶到 /srv/lhcos
目录
创建存储桶后,可参阅官方文档挂载存储桶一章,将其挂载到所有k8s节点服务器上。需要注意的是:所有节点上的存储桶挂载目录、服务器挂载目录必须一致,以确保pod迁移后可以恢复之前的状态。
本文中约定,存储桶挂载目录全部填写 /k8s
,服务器挂载目录全部填写 /srv/lhcos
,两者的命名并没有什么强关联性。
创建 kubernetes 部署文件
使用 OrcaTerm 将下面的代码保存到主节点服务器上,文件路径/srv/myblog.yml
,请注意修改配置文件中的域名 myblog.example.org
。
此部署使用了我为云原生场景定制的 Typechoy 镜像,基于 rehiy/webox:nginx-php8
构建,支持 x86_64 和 arm64 构架;每周日拉取 Typecho 主分支代码更新镜像。
yaml
kind: Deployment
apiVersion: apps/v1
metadata:
name: &name myblog
labels:
app: *name
spec:
selector:
matchLabels:
app: *name
template:
metadata:
labels:
app: *name
spec:
containers:
- name: typecho
image: rehiy/typecho
ports:
- containerPort: 80
- containerPort: 443
volumeMounts:
- name: *name
subPath: usr
mountPath: /var/www/default/usr
volumes:
- name: *name
hostPath:
path: /srv/lhcos/myblog
type: DirectoryOrCreate
---
kind: Service
apiVersion: v1
metadata:
name: &name myblog
labels:
app: *name
spec:
selector:
app: *name
ports:
- name: http
port: 80
targetPort: 80
- name: https
port: 443
targetPort: 443
---
kind: Ingress
apiVersion: networking.k8s.io/v1
metadata:
name: &name myblog
annotations:
traefik.ingress.kubernetes.io/router.entrypoints: web,websecure
spec:
rules:
- host: blog.example.org
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: *name
port:
name: http
tls:
- secretName: default
部署 Typecho 服务
使用 OrcaTerm终端,执行以下命令完成部署。
shell
kubectl apply -f /srv/myblog.yml
测试和验证
浏览器打开 http://blog.example.org
,看到博客初始页面即表示部署成功。为了验证其是否高可用,可以关闭正在运行该服务的节点,观察是否可以自动切换到其他节点继续提供服务。
测试过程中,有些步骤可能需要长时间的等待,这是由于拉取镜像比较耗时导致的,并没有太好的解决办法。大家可以尝试使用一些国内的docker镜像来缓解这个问题。
总结
轻量对象存储简单易用,作为附件存储(即一次写入多次读取的场景)非常合适,可以在一定程度上解决轻量K8s集群的云原生应用带状态迁移难题。