Kubernetes 那些事 — ConfigMap 與 Secrets
前言
今天要來介紹兩個蠻重要的觀念:ConfigMap 以及 Secrets,通常在本機端練習可能比較少用到這兩個物件,但在實務上這兩個物件可是很常使用的,由於這兩個物件非常的相近,使用方式也非常相近,所以筆者就把這兩個物件的觀念擺在一起了,廢話不多說馬上開始今天的文章吧!
什麼是 ConfigMap?
看到 Config 應該就知道這個物件跟某些設定檔有關,沒錯 ConfigMap 通常都是用來存放設定檔用的,換句話說就是這個物件會直接連結一個或多個檔案,而 ConfigMap 通常都是用來存放偏向部署面的設定檔,像是資料庫的初始化設定、nginx 設定檔等等,這種不用被包進去 image 內但其實也是要讓 container 可以使用的檔案。
ConfigMap 特性
講完了 ConfigMap 基礎介紹後接下來講一下 ConfigMap 的特性。
- 一個 ConfigMap 物件可以存入一個或多個設定檔
上面段落提到 ConfigMap 是用來存放設定檔用的,而且 ConfigMap 會直接連接該設定檔。
- 無需修改程式碼,可以替換不同環境的設定檔
由於設定檔都交由 ConfigMap 管理,並不是包在 image 內,因此可以藉由修改 ConfigMap 的方式來達到不用更新 Pod 內容就可以更換設定檔的作用。
- 統一存放所有的設定檔
一個 ConfigMap 可以連結一個以上的設定檔,因此也可以將該專案會用到的所有設定檔通通存放在同一個 ConfigMap 物件中進行集中管理。
如何建立 ConfigMap?
由於 ConfigMap 可以直接存入整個檔案,因此筆者這邊的範例都會以現有的檔案為基準。
接下來要用 create
這個參數來建立 ConfigMap 物件出來,這時候可能會有讀者疑惑了,之前都是用 apply
這個參數怎麼現在又變成 create
了呢?
雖然兩者都有建立的意思但背後實作的技術完全不同, create
使用的是 Imperative Management,Imperative Management 簡單來說就是告訴 K8s 我目前的動作要做什麼,可能要 create
、 delete
、 replace
某個物件。
而 apply
使用的是 Declarative Management,Declarative Management 簡單來說就是用宣告的方式來建立物件,再更白話一點就是我希望這個物件要長怎麼樣,所以 apply
通常都會搭配一個 yaml 檔,而這份 yaml 檔就會在 kind
這個設定值告訴 K8s 我這個物件要長成什麼樣子。
由於筆者是直接拿現有的檔案建立 ConfigMap,這時候就不能用 apply
的方式只能用 create
的方式建立了,指令也很簡單長得像這樣: kubectl create configmap configmapName --from-file=filePath
。
建立完後就可以下 get
的參數查看 ConfigMap 是否有成功建立出來。
最後可以下 describe
這個參數查看 ConfigMap 的內容,會發現裡面就是設定檔的完整內容。
什麼是 Secrets?
看到 Secrets 這個名字應該就知道這是非常機密的物件,相較於 ConfigMap 是用來存放偏向部署面的檔案,Secrets 通常都是用來存放機密的資料,像是使用者帳密、SSL 憑證等等。
Secrets 特性
上面 ConfigMap 提到的特性 Secrets 一樣也有,所以筆者就不重複講了,這邊筆者想介紹的是只有 Secrets 才有的特性:Secret 會將內部資料進行 base64 編碼。
因為重新編碼所以可以確保資料相較 ConfigMap 下安全一些,所以筆者建議如果是機密性的資料就存在 Secrets 吧!
如何建立 Secrets?
這裡筆者一樣用現有的檔案為基準作為範例,由於上面 ConfigMap 只示範存入一個檔案而已,所以這邊 Secrets 筆者就示範如何存入多個檔案。
一樣用 create
的參數進行 Secrets 建立,但這邊要多加一個 SUBCOMMAND
叫 generic
,generic 代表的意思是從本機檔案、目錄建立 Secrets,接下來只要下: kubectl create secret generic secretName --from-file=filePath
即可建立 Secrets。
接著一樣可以用 get
的參數來查看 Secrets 是否有正確建立起來。
最後一樣可以用 describe
的參數查看 Secrets 內容,可以發現裡面確實有兩個檔案,並且經過加密所以不會顯示原本內容。
Secrets 與 Ingress
最後來點番外篇,剛剛筆者建立一個跟 SSL 憑證有關的 Secrets,這個 Secrets 是用來幫助網頁加密,也就是大家熟悉的 HTTPS,在 Ingress 的文章有提到 Ingress 幫助我們統一對外 port,也就是只要把憑證的 Secrets 寫在 Ingress 內就可以讓網站順利變成 HTTPS 了,寫法也很簡單只要在 spec
內加上 tls
的設定即可。
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: helloworld
spec:
tls:
- secretName: helloworld-secret
rules:
- http:
paths:
- path: /
backend:
serviceName: helloworld
servicePort: 8080
小結
今天介紹了 ConfigMap 以及 Secrets 的基礎說明以及建立,相信讀者應該也很好奇要如何將 ConfigMap 以及 Secrets 跟 Pod 進行連結,由於連結這段需要介紹 Volume,因此筆者下一篇文章就要來介紹 Volume,到時候會連同連結的部分一併介紹完,那我們就下篇文章見嘍~