Kubernetes中的Configmap和Secret

2020-12-11 百家號

本文的試驗環境為CentOS 7.3,Kubernetes集群為1.11.2,安裝步驟參見kubeadm安裝kubernetes V1.11.1 集群

應用場景:鏡像往往是一個應用的基礎,還有很多需要自定義的參數或配置,例如資源的消耗、日誌的位置級別等等,這些配置可能會有很多,因此不能放入鏡像中,Kubernetes中提供了Configmap來實現向容器中提供配置文件或環境變量來實現不同配置,從而實現了鏡像配置與鏡像本身解耦,使容器應用做到不依賴於環境配置。

向容器傳遞參數

DockerKubernetes描述ENTRYPOINTcommand容器中的可執行文件CMDargs需要傳遞給可執行文件的參數

如果需要向容器傳遞參數,可以在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(當然配置內容不相同,只是名字相同),就可以降低環境管理和部署的複雜度。

ConfigMap有三種用法:

生成為容器內的環境變量設置容器啟動命令的參數掛載為容器內部的文件或目錄ConfigMap的缺點

ConfigMap必須在Pod之前創建ConfigMap屬於某個NameSpace,只有處於相同NameSpace的Pod才可以應用它ConfigMap中的配額管理還未實現如果是volume的形式掛載到容器內部,只能掛載到某個目錄下,該目錄下原有的文件會被覆蓋掉靜態Pod不能用ConfigMapConfigMap的創建

$ 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/diryaml 文件的方式

apiVersion: v1data: my-nginx-config.conf: | server { listen 80; server_name www.kubia-example.com; 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: v1

kind: Pod

metadata:

name: env-configmap

spec:

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

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

創建和調用的過程與configmap大同小異,這裡就不再贅述了。

相關焦點

  • Kubernetes ELK 日誌收集
    ,只需要在宿主機上收集每個容器中的日誌/var/log和/var/lib/docker/containers (目錄要根據docker info中的dir進行修改)容器會將日誌轉化為JSON格式,是docker中的配置起的作用。
  • Kubernetes RBAC角色權限控制
    Namespace是kubernetes項目中的一個邏輯管理單位。那麼kubernetes的授權系統就能夠從這個文件裡找到對象的用戶Rolebinding對象通過roleRef欄位可以直接通過名字,來引用前面定義的Role對象(example-role),從而定義了」被作用者(Subject)」和」角色(Role)」之間的綁定關係Role和RoleBinding 他們的權限限制規則僅僅在他們自己的
  • Kubernetes 1.17 特性:Kubernetes卷快照移至Beta版
    通過提供一種在KubernetesAPI中觸發快照操作的標準方式,Kubernetes用戶現在可以處理這樣的用例,而不必使用Kubernetes API(並手動執行存儲系統特定的操作)。Kubernetes用戶現在可以使用與群集無關的方式,將快照操作合併到他們的工具和策略中,並輕鬆知道它將在任意Kubernetes群集生效,而與基礎存儲無關。
  • Kubernetes 1.14 二進位集群安裝
    kubectl默認從~/.kube/config讀取kube-apiserver地址和認證信息。;none>443/TCP 31d生成證書和私鑰 cfssl gencert -ca=/opt/k8s/work/ca.pem \-ca-key=/opt/k8s/work/ca-key.pem \-config=/opt/k8s/work/ca-config.json \-profile=kubernetes kubernetes-csr.json | cfssljson
  • 一篇讀懂Kubernetes Scheduler擴展功能
    前言Scheduler是Kubernetes組件中功能&邏輯相對單一&簡單的模塊,它主要的作用是:watch kube-apiserver,監聽PodSpec.NodeName為空的pod,並利用預選和優選算法為該pod選擇一個最佳的調度節點,最終將pod與該節點進行綁定,使pod調度在該節點上運行。
  • Kubernetes 學習筆記之 ServiceAccount TokensController 源碼解析
    在 Kubernetes 學習筆記之 ServiceAccount AdmissionController 源碼解析 文章中,知道一個 ServiceAccount 對象都會引用一個type="kubernetes.io/service-account-token" 的 secret 對象,這個 secret
  • Kubernetes 入門命令整理及解析
    方便記憶的規律kubernetes命令有一些相通的規律,可以幫助我們快速掌握。-A,無論獲取哪種資源,這個參數代表所有命名空間-o wide 無論獲取哪種資源,代表更詳細的列出資源,一般看pod的ip,和對應的node節點比較常用。
  • vSphere with Kubernetes實戰之:用戶訪問控制 - 文章精選 - CTI...
    這些Namespace管理員還可以在命名空間中直接部署和運行應用程式(在虛擬機和Pod VM上),在這種情況下,它們也稱為「Supervisor 集群開發者」。  默認情況下,「Namespace管理員」將成為新創建的Tanzu Kubernetes群集的「Tanzu群集管理員」。
  • 《蹲坑學kubernetes》之17-14:ServerAccount
    《蹲坑學kubernetes》之17-14:ServerAccountAPI Server作為Kubernetes網關,是訪問和管理資源對象的唯一入口,其各種集群組件訪問資源都需要經過網關才能進行正常訪問和管理。
  • Kubernetes API 安全機制詳解
    它有一個插件列表,所有請求需要經過這個列表中的每個準入控制插件修改、校驗,如果某一個準入控制插件驗證失敗,就拒絕請求。用戶訪問 Kubernetes API時,apiserver認證授權模塊從HTTPS請求中獲取用戶的身份信息、請求資源路徑和業務對象參數。
  • Kubernetes持續部署指南
    集成完成並且所有測試都通過之後,我們就能夠添加持續交付到自動化發布和部署的流程中。使用CI/CD的項目可以更頻繁、更可靠地發布。請注意我們重複使用了checkout和cache的代碼以將初始文件放入job中。最後一個命令用於啟動RSpec測試套件。
  • Kubernetes CRD 自定義控制器
    informers 和 listers 三個目錄,有了這幾個自動生成的客戶端相關操作包,我們就可以去訪問 CRD 資源了,可以和使用內置的資源對象一樣去對 CronTab 進行 List 和 Watch 操作了。
  • 使用 Kubernetes 最易犯的 10 個錯誤
    非 K8s 感知的集群自動伸縮在集群中添加節點或者從集群中刪除節點時,你不應該只是考慮一些簡單的指標:如節點的 CPU 利用率。在調度 Pod 時,你需要根據很多調度約束條件(如 Pod 和節點的親和性,汙點和容忍,資源請求,QoS 等等)來進行決策。
  • 基於 Kubernetes 的 GPU 類型調度實現
    憑藉其特性,Kubernetes 可以無縫將模型訓練、inference 和部署擴展到多雲 GPU 集群,允許數據科學家跨集群節點自動化多個 GPU 加速應用程式容器的部署、維護、調度和操作。在 1.6 版本和 1.9 版本中,Kubernetes 先後提供了對 NVIDIA GPU、AMD GPU 容器集群管理調度的支持,進一步提高了對 GPU 等擴展資源進行統一管理和調度的能力。
  • Kubernetes 學習筆記總結
    比如我有 2 個業務 A 和 B,那麼我可以創建 ns-a 和 ns-b 分別部署業務 A 和 B 的服務,如在 ns-a 中部署了一個 deployment,名字是 hello,返回用戶的是「hello a」;在 ns-b 中也部署了一個 deployment,名字恰巧也是 hello,返回用戶的是「hello b」(要知道,在同一個 namespace 下 deployment 不能同名;但是不同
  • Kubernetes-應用部署問題定位和處理
    根據Kubernetes的架構設計原理,容器化應用對外提供服務出現的主要問題在三個點上:1) 應用本身的問題 :此問題為應用本身的問題,不在此文中進行詳細的闡述;2) 作為容器化應用邏輯主機的Pod的問題 :此部分的問題主要涉及到容器化應用是否在容器雲中正常部署和運行,這裡會涉及到CPU、內存、存儲資源等問題;