Kubernetes中的Configmap和Secret
本文的試驗環境為CentOS 7.3,Kubernetes叢集為1.11.2,安裝步驟參見
應用場景:映象往往是一個應用的基礎,還有很多需要自定義的引數或配置,例如資源的消耗、日誌的位置級別等等,這些配置可能會有很多,因此不能放入映象中,Kubernetes中提供了Configmap來實現向容器中提供配置檔案或環境變數來實現不同配置,從而實現了映象配置與映象本身解耦,使容器應用做到不依賴於環境配置。
向容器傳遞引數
Docker | Kubernetes | 描述 |
---|---|---|
ENTRYPOINT | command | 容器中的可執行檔案 |
CMD | args | 需要傳遞給可執行檔案的引數 |
如果需要向容器傳遞引數,可以在Yaml檔案中透過command和args或者環境變數的方式實現。
kind: Podspec: containers: - image: docker.io/nginx command: ["/bin/command"] args: ["arg1", "arg2", "arg3"] env: - name: INTERVAL value: "30" - name: FIRST_VAR value: "foo" - name: SECOND_VAR value: "$(FIRST_VAR)bar"
可以看到,我們可以利用env標籤向容器中傳遞環境變數,環境變數還可以相互引用。這種方式的問題在於配置檔案和部署是繫結的,那麼對於同樣的應用,測試環境的引數和生產環境是不一樣的,這樣就要求寫兩個部署檔案,管理起來不是很方便。
什麼是ConfigMap
上面提到的例子,利用ConfigMap可以解耦部署與配置的關係,對於同一個應用部署檔案,可以利用valueFrom
欄位引用一個在測試環境和生產環境都有的ConfigMap(當然配置內容不相同,只是名字相同),就可以降低環境管理和部署的複雜度。
image
ConfigMap有三種用法:
生成為容器內的環境變數
設定容器啟動命令的引數
掛載為容器內部的檔案或目錄
ConfigMap的缺點
ConfigMap必須在Pod之前建立
ConfigMap屬於某個NameSpace,只有處於相同NameSpace的Pod才可以應用它
ConfigMap中的配額管理還未實現
如果是volume的形式掛載到容器內部,只能掛載到某個目錄下,該目錄下原有的檔案會被覆蓋掉
靜態Pod不能用ConfigMap
ConfigMap的建立
$ kubectl create configmap <map-name> --from-literal=<parameter-name>=<parameter-value>$ kubectl create configmap <map-name> --from-literal=<parameter1>=<parameter1-value> --from-literal=<parameter2>=<parameter2-value> --from-literal=<parameter3>=<parameter3-value>$ kubectl create configmap <map-name> --from-file=<file-path>$ kubectl apply -f <configmap-file.yaml># 還可以從一個資料夾建立configmap $ kubectl create configmap <map-name> --from-file=/path/to/dir
Yaml 的宣告方式
apiVersion: v1data: my-nginx-config.conf: | server { listen 80; server_name gzip on; gzip_types text/plain application/xml; location / { root /usr/share/nginx/html; index index.html index.htm; } } sleep-interval: | 25kind: ConfigMap
ConfigMap的呼叫
環境變數的方式
apiVersion: v1kind: Podmetadata: name: env-configmapspec: containers: - image: nginx env: - name: INTERVAL valueFrom: configMapKeyRef: name: <map-name> key: sleep-interval
如果引用了一個不存在的ConfigMap,則建立Pod時會報錯,直到能夠正常讀取ConfigMap後,Pod會自動建立。
一次傳遞所有的環境變數
spec: containers: - image: nginx envFrom: - prefix: CONFIG_ configMapRef: name: <map-name>
命令列引數的方式
apiVersion: v1kind: Podmetadata: name: env-configmapspec: containers: - image: nginx env: - name: INTERVAL valueFrom: configMapKeyRef: name: <map-name> key: sleep-interval args: ["$(INTERVAL)"]
以配置檔案的方式
apiVersion: v1kind: Podmetadata: name: nginx-testspec: containers: - image: nginx name: web-server volumeMounts: - name: config mountPath: /etc/nginx/conf.d readOnly: true volumes: - name: config configMap: name: <map-name>
將Configmap掛載為一個資料夾後,原來在映象中的資料夾裡的內容就看不到,這是什麼原理?這是因為原來資料夾下的內容無法進入,所以顯示不出來。為了避免這種掛載方式影響應用的正常執行,可以將configmap掛載為一個配置檔案。
spec: containers: - image: nginx volumeMounts: - name: config mountPath: /etc/someconfig.conf subPath: myconfig.conf
image
Configmap的更新
$ kubectl edit configmap <map-name>
confgimap更新後,如果是以資料夾方式掛載的,會自動將掛載的Volume更新。如果是以檔案形式掛載的,則不會自動更新。
但是對多數情況的應用來說,配置檔案更新後,最簡單的辦法就是重啟Pod(殺掉再重新拉起)。如果是以資料夾形式掛載的,可以透過在容器內重啟應用的方式實現配置檔案更新生效。即便是重啟容器內的應用,也要注意configmap的更新和容器內掛載檔案的更新不是同步的,可能會有延時,因此一定要確保容器內的配置也已經更新為最新版本後再重新載入應用。
什麼是Secret
Secret與ConfigMap類似,但是用來儲存敏感資訊。在Master節點上,secret以非加密的形式儲存(意味著我們要對master嚴加管理)。從Kubernetes1.7之後,etcd以加密的形式儲存secret。secret的大小被限制為1MB。當Secret掛載到Pod上時,是以tmpfs的形式掛載,即這些內容都是儲存在節點的記憶體中,而不是寫入磁碟,透過這種方式來確保資訊的安全性。
Kubernetes helps keep your Secrets safe by making sure each Secret is only distributed to the nodes that run the pods that need access to the Secret. Also, on the nodes themselves, Secrets are always stored in memory and never written to physical storage, which would require wiping the disks after deleting the Secrets from them.
每個Kubernetes叢集都有一個預設的secrets
image
建立和呼叫的過程與configmap大同小異,這裡就不再贅述了。
作者:GreenWang
連結:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2819/viewspace-2820840/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Kubernetes利用Volume掛載ConfigMap與Secret
- Kubernetes 實戰——配置應用(ConfigMap、Secret)
- kubernetes系列12—二個特色的儲存卷configmap和secret
- Secret、ConfigMap
- Kubernetes學習筆記(六):使用ConfigMap和Secret配置應用程式筆記
- Kubernetes 的 secret 並不是真正的 secret
- k8s叢集ConfigMap和Secret儲存卷K8S
- Kubernetes裡的ConfigMap的用途
- Kubernetes-Secret
- ConfigMap 使用 | kubernetes 篇
- k8s配置中心-configmap,Secret密碼K8S密碼
- 3.k8s儲存之ConfigMap、SecretK8S
- Kubernetes 漫遊:理解 ConfigMap
- Kubernetes裡的secret最基本的用法
- k8s env、configmap、secret外部資料載入配置K8S
- 容器編排系統K8s之ConfigMap、Secret資源K8S
- kubernetes系列(十二) - 儲存之Secret
- 簡述Kubernetes Secret有哪些使用方式
- 如何在Kubernetes裡給PostgreSQL建立secretSQL
- Kubernetes(k8s)配置檔案管理:ConfigMapK8S
- 在Spring Boot應用程式中使用Kubernetes ConfigMapSpring Boot
- Kubernetes(k8s)密碼管理:SecretK8S密碼
- kubernetes實踐之十四:Service Account與Secret
- kubernetes實踐之六十二:Secret 使用
- Kubernetes K8S之儲存ConfigMap詳解K8S
- kubernetes實踐之三十五:Pod配置管理ConfigMap
- k8s階段03 持久卷, PV和PVC, CSI儲存方案示例csi-driver-nfs, OpenEBS, ConfigMap, Secret, DownwardAPI和ProjectedK8SNFSAPIProject
- 『中級篇』Docker-Secret管理和使用(51)Docker
- 如何使用Kubernetes的configmap通過環境變數注入到pod裡變數
- k8s中ConfigMap的timezone使用K8S
- ConfigMap
- secret
- ConfigMap掛載與Subpath在Nginx容器中的應用Nginx
- Secret Sport
- Serverless Kubernetes 和 Serverless on Kubernetes 的區別Server
- phpMyAdmin配置檔案中的密文(blowfish_secret)太短PHP
- 傲視Kubernetes(三):Kubernetes中的Pod
- 使用kubeseal加密和管理k8s叢集的secret加密K8S