漫畫:Kubernetes中的ConfigMap和Secret
- 我們可以直接在打包鏡像的時候寫在應用配置文件裡面,但是這種方式的壞處顯而易見而且非常明顯。
- 我們可以在配置文件裡面通過 env 環境變數傳入,但是這樣的話我們要修改env就必須去修改 yaml 文件,而且需要重啟所有的 Container 才行。
- 我們可以在應用啟動的時候去資料庫或者某個特定的地方拿,沒問題!但是第一,實現起來麻煩;第二,如果配置的地方變了怎麼辦?
而且,還有一個問題就是,如果說我的一個配置,是要多個應用一起使用的,以上除了第三種方案,都沒辦法進行配置的共享,就是說我如果要改配置的話,那得一個一個手動改。假如我們有100個應用,就得改100份配置,以此類推……
那就沒有其他方法解決這些問題嘛?
| ConfigMap
ConfigMap讓我們能夠從容器鏡像中把配置的詳細信息給解耦出來。通過ConfigMap 我們能夠把配置以 key-value 對的形式傳遞到 Container 或者別的系統組件(比如Controller)裡面。
如何創建ConfigMap?
我們可以通過兩種方式來創建 ConfigMap:
From Literal Values和From Configuration File;
From Literal Values 方法:
我們可以用 kubectl create 來創建一個 ConfigMap,然後通過 kubectl get 來獲取:
# Create the ConfigMapn$ kubectl create configmap my-config --from-literal=key1=value1 --from-literal=key2=value2nconfigmap "my-config" created nn# Get the ConfigMap Details for my-confign$ kubectl get configmaps my-config -o yamlnapiVersion: v1ndata:n key1: value1n key2: value2nkind: ConfigMapnmetadata:n creationTimestamp: 2017-05-31T07:21:55Zn name: my-confignnamespace: defaultn resourceVersion: "241345"n selfLink: /api/v1/namespaces/default/configmaps/my-confign uid: d35f0a3d-45d1-11e7-9e62-080027a46057n
-o yaml 的作用是通過 yaml 的形式來返回我們所要求的配置信息。
From Configuration File 方法:
除了上面的方式,我們還可以直接通過配置文件來創建(好吧,雖然我感覺是同一種,只不過是放到文件裡面了而已……),首先,我們得有一個配置文件,假設名字叫做 myconfigmap.yaml:
apiVersion: v1nkind: ConfigMapnmetadata:n name: customer1ndata:n TEXT1: Customer1_Companyn TEXT2: Welcomes Youn COMPANY: Customer1 Company Technology Pct. Ltd.n
然後,我們可以通過 kubectl create -f 來創建:
$ kubectl create -f myconfigmap.yamlnconfigmap "customer1" created n
同時也有兩種使用方法,通過 env 和通過 Volume。
通過 env 方法:
我們可以設置 env從ConfigMap 讀取:
....ncontainers:n- name: rsvp-appn image: teamcloudyuga/rsvpappn env:n- name: MONGODB_HOSTn value: mongodbn- name: TEXT1n valueFrom:n configMapKeyRef:n name: customer1n key: TEXT1n- name: TEXT2n valueFrom:n configMapKeyRef:n name: customer1n key: TEXT2n- name: COMPANYn valueFrom:n configMapKeyRef:n name: customer1n key: COMPANYnn....n
這樣,我們的 Container 就可以讀取到 ConfigMap 裡面存儲的信息了。
不過一般情況下,我個人推薦使用另一種方式:
通過Volume
這種方式我比較推薦,因為隨著 ConfigMap 被修改(比如你想要更新一些設置),Container 裡面對應的文件內容也會被修改,這樣可以不用重啟Container 就讓應用能夠得到最新的配置信息。
這個內容需要一些 Volume 相關的知識,在此不做更多講解,大家可以去參考官方文檔。
https://kubernetes.io/docs/tasks/configure-pod-container/configure-pod-configmap/#adding-configmap-data-to-a-volume
通過上面的部分,我們可以看到 ConfigMap 是用來做一些配置信息。
| 就是我們介紹的 Secret 方法:
看到這個名字大家應該就明白了吧,Kubernetes 提供了 Secret 來存儲相關的信息。具體為什麼要存在 Secret 裡面,Secret 和 ConfigMap 有什麼區別,後面會講到。
先介紹如何創建和使用 Secret。
創建Secret
我們可以通過 kubectl create secret 來通過一個文件創建一個 Secret,如下:
# Create a file with passwordn$ echo mysqlpassword > password.txtnn# Make sure there is no trailing newline in the file, after our password. n# To remove any newline, we can use the tr command:n$ tr -Ccsu n < password.txt > .strippedpassword.txt && mv .strippedpassword.txt password.txtnn# Create the Secret n$ kubectl create secret generic my-password --from-file=password.txtnsecret "my-password" createdn
我們也可以手動創建一個 Secret,不過要注意,所有的 Secret 的 data 都要以 base64 進行加密:
$ cat password.txt | base64nbXlzcWxwYXN3b3JkCg==nn# and then use it in the configuration file:nnapiVersion: v1nkind: Secretnmetadata:n name: my-passwordntype: Opaquendata:n password: bXlzcWxwYXN3b3JkCg==n
使用Secret
獲取 Secret
我們可以通過 get 和 describe 來獲取 Secret,不過我們發現,kubectl 並沒有向我們返回 Secret 具體的內容:
$ kubectl get secret my-passwordnNAME TYPE DATA AGE nmy-password Opaque 1 8mnn$ kubectl describe secret my-passwordnName: my-passwordnNamespace: defaultnLabels: <none>nAnnotations: <none>nnType OpaquennDatan====npassword.txt: 13 bytesn
在 Pod 裡面使用
和 ConfigMap 一樣,我們可以通過設置成 env 或者掛載成 volume 來使容器可以使用我們的 Secret。
具體格式如下:
.....n spec:n containers:n- image: wordpress:4.7.3-apachen name: wordpressn env:n- name: WORDPRESS_DB_HOSTn value: wordpress-mysqln- name: WORDPRESS_DB_PASSWORDn valueFrom:n secretKeyRef:n name: my-passwordn key: password.txtn.....n
關於如何在 Volume 中使用的還是需要自行查詢文檔學習。
其實目前 Secret 的實現,就是 ConfigMap 把 value 用 base64 encode了一下,所以,其實不存在任何安全性,只要 decode 一下就能出現原來結果,相當於明文存儲。
base64 這玩意兒都不能叫做加密,只能叫做編碼,所以我們都不說 encrypt,而是 encode 和 decode。
當然,Kubernetes 社區有在計劃對 Secret 進行下一步的安全性增強,當然這是後話了,截止目前為止,Secret 基本和 ConfigMap一樣是明文存儲。
好了,大家理解了 ConfigMap 和 Secret 了嘛?由於時間關係,更多內容下節課在講。
文章作者:吳迪 個人博客 / 整編:K8S中文社區 微信公眾號 ID:k8schina
推薦閱讀:
※這一百多歲的老罐子,為啥還這麼潮?
※Linux 容器輕鬆應對性能工程
※如何在 Windows 上運行 Linux 容器
TAG:Kubernetes | Docker | 容器 |