今天來跟大家介紹 k8s 生態鏈裡面,我個人認為很好用的一個工具,也是 Helm ,那到底 Helm 是什麼? 為什麼需要它,讓我們看下去。

我們先架設一個情境,今天我要部署一個公告服務,那首先我會需要一個 service

kind: Service
apiVersion: v1
metadata:
  name: my-service
spec:
  type: ClusterIP
  selector:
    app: announcement
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80

那當然我們會需要一個 Deployment

apiVersion: apps/v1
kind: Deployment
metadata:
  name: announcement-deployment
  labels:
    app: announcement
spec:
  replicas: 
  selector:
    matchLabels:
      app: announcement
  template:
    metadata:
      labels:
        app: announcement
    spec:
      containers:
      - name: announcement
        image: announcement
        env:
        - name: MYSQL_ACCOUNT
          value: root
        - name: MYSQL_PASSWORD
          value: TEST1234
        - name: MYSQL_ADDRESS
          value: 127.0.0.1:3306
        ports:
        - containerPort: 80

不知道大家有沒有注意到,上面我們導入了 env。實務上,我們寫好的服務會因應不同站別(DEV、QA、PROD)而有不同的 DB,那如果像我前天天文章有提到的 namespace 實務分享,這樣子的架構下,我們是否要準備三個實體的 Deployment 檔案?如果未來這個 Deployment 需要調整修改,我們就需要須改三次,這聽起來就有軟體設計裡面所講的壞味道吧?

更何況我們所謂的系統怎麼可能只為了公告服務而使用 k8s 呢? 大家可以想像一下像 PCHOME、MOMO 這類大型商城,如果你用微服務來設計它你會設計多少服務呢?我隨便舉一下,如果我來設計至少會有購物車、會員服務、金流管理服務….,那講到這裡各位有發現問題了嗎? 每個服務都需要自己的 Deployment、Services,假設每個服務又要拆成三個站別(DEV、QA、PROD),那你所要管理的yaml檔就是

PCHOME、MOMO 只是筆者拿來舉例,它們實際架構怎樣,背後有沒有運用 k8s,筆者並不清楚。

服務數量 * 2 (Deployment、Service) * 3

這總數會隨著你拆的微服務粒度拆的越細,數量會越恐怖,到最後就會需要有專人來維護這些數量龐大的服務,而且還很容易出錯。

這就是我們要導入 helm 的原因。這邊先簡單介紹為什麼要使用 Helm,後面幾天,我會再詳細介紹它更多的好處,最後還會跟大家介紹我們公司導入 helm 後所受益的事情。

如果不想當一個 yaml 工程師,就讓我們期待一下接下來幾天的介紹。