k8s 开船记-首航:博客站点从 docker swarm 切换到 k8s
昨天晚上,我们将博客站点的生产环境从 docker swarm 集群切换到了 k8s 集群,开船到目前,航行非常平稳,可以说首航成功!
k8s 集群是我们用10台阿里云服务器自己搭建的,1台 master 配置是2核4G,9台 nodes 配置都是4核8G,kubernetes 版本是 1.16.3 。
博客站点请求入口没有走 ingress ,直接通过 service 监听 30080 端口,阿里云负载均衡转发请求到该端口。
apiVersion: v1 kind: Service metadata: name: blog-web namespace: production spec: type: NodePort selector: app: blog-web ports: - nodePort: 30080 port: 80 targetPort: 80
博客站点(blog-web)是通过 DaemonSet 方式部署的,每个 node 都会运行 blog-web pod ,这样的好处是可以将负载均分到各个 node 进行处理,而且在新服务器添加到集群后可以立即分担负载。
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: blog-web
namespace: production
labels:
name: blog
...
在将部署环境从 docker swarm 切换到 k8s 的过程中,主要遇到2个问题。
一个问题是服务名称包含下划线的问题。docker swarm 服务名称中默认就包含下划线,k8s 坚决不允许服务名称中包含下划线,而我们的博客应用调用的一些 web api 用的是包含下划线的主机名,为了减少代码修改工作,我们采用了变通的解决方法,借助 coredns 在 dns 解析时重写主机名。
rewrite stop { name regex ([a-zA-Z0-9-]+)_([a-zA-Z0-9-]+).$ {1}-{2}.production.svc.cluster.local answer name ([a-zA-Z0-9-]+)-([a-zA-Z0-9-]+)\.production\.svc\.cluster\.local\.$ {1}_{2} }
另一个问题是 k8s 的 yaml 配置文件不支持直接读取环境变量,docker swarm 是直接支持的,通过 envsubst 搞定。
envsubst < daemonset-production-blog-web.yaml | kubectl apply -f -
匆忙之间写了这篇开船首航记,不到之处,望谅解。
最后推荐一篇对于了解 k8s 非常有帮助的英文博文 —— An introduction to Kubernetes 。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
· DeepSeek 解答了困扰我五年的技术问题
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 2分钟学会 DeepSeek API,竟然比官方更好用!
· .NET 使用 DeepSeek R1 开发智能 AI 客户端
· autohue.js:让你的图片和背景融为一体,绝了!
· 10亿数据,如何做迁移?
· 推荐几款开源且免费的 .NET MAUI 组件库
2013-12-13 使用dnspod遭遇的奇特问题以及背后的原因与临时解决方法
2010-12-13 上周热点回顾(12.6-12.12)