iT邦幫忙

2021 iThome 鐵人賽

DAY 20
0
DevOps

前端工程師學習 DevOps 之路系列 第 20

Day20-Kubernetes 那些事 - ConfigMap 與 Secrets

  • 分享至 

  • xImage
  •  

前言

今天要來介紹兩個蠻重要的觀念: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 我目前的動作要做什麼,可能要 createdeletereplace 某個物件。

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 建立,但這邊要多加一個 SUBCOMMANDgenericgeneric 代表的意思是從本機檔案、目錄建立 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,到時候會連同連結的部分一併介紹完。

如果對於文章有什麼問題都歡迎留言給我,那我們就下篇文章見嘍~


上一篇
Day19-Kubernetes 那些事 - Stateless 與 Stateful
下一篇
Day21-Kubernetes 那些事 - Volume
系列文
前端工程師學習 DevOps 之路30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言