k8s 開船記-首航:部落格站點從 docker swarm 切換到 k8s
阿新 • • 發佈:2019-12-13
昨天晚上,我們將部落格站點的生產環境從 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 。