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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM