iT邦幫忙

2024 iThome 鐵人賽

DAY 10
0
DevOps

今天不學遺傳學,跟著Kubernetes種豌豆系列 第 10

Day10. 集中管理配置參數,公開與不公開的秘密

  • 分享至 

  • xImage
  •  

🎭 有關程式的配置參數,可以透過環境變數傳入,和邏輯相關的程式分離,提高管理的彈性及安全性,K8s的物件亦可設置環境變數,但是當多個檔案需管理時就會不好處理,為了方便管理,設計了統一管理參數的物件,將有關環境的參數從container image或是定義檔中提取出來,供其他物件使用,資料為 key/value形式,讓程式更具有可攜性,分有管理一般的參數物件ConfigMap及機密性的參數物件Secret,步驟為建立參數物件,再來將這些參數注入到物件

從environment欄位檢視環境變數
https://ithelp.ithome.com.tw/upload/images/20240814/20168178A4w7AdJtyY.png

這些參數物件沒有spec欄位,內容為datastringData欄位

被直接看到比較沒關係的參數- ConfigMap

基本參數物件,其配置欄位有data(UTF-8字串)或binaryData(base64編碼字串),兩者的key不可重複,只能包含英文字母及標點符號-_.

  1. 建立configMap
# 取自官網文件
apiVersion: v1
kind: ConfigMap
metadata:
  name: game-demo
data:
  # 屬性類型的key: 單一key/value 對
  player_initial_lives: "3"
  ui_properties_file_name: "user-interface.properties"

  # 檔案類型的keys
  game.properties: |
    enemy.types=aliens,monsters
    player.maximum-lives=5    
  user-interface.properties: |
    color.good=purple
    color.bad=yellow
    allow.textmode=true    

ConfigMap操作指令

# 查詢configmaps
kubectl get configmaps
kubectl get cm
kubectl describe configmaps <名稱>
# 建立configmap
kubectl create configmap <config-name> --from-literal=<key>=<value>
kubectl create configmap <config-name> --from-file=<path-to-file 如: app_config.properties>
kubectl create -f <檔案名稱>
  1. 將參數注入物件
apiVersion:
kind: Pod
metadata:
  name: myapp-pod
spec:
  priorityClassName: high-priority
  containers:
    - name: nginx-container
      image: nginx
      # 1. 各別指定環境變數
      env:
      - name: APP_COLOR
          # 1-1. 直接寫入
          value: pink
          # 1-2. 從configMap提取
          valueFrom:  
              configMapKeyRef:
                name: app-config
                key: APP_COLOR
      # 2. 環境變數來自這整個configMap (List)
      envFrom: 
      - configMapRef: 
          name: app-config
      # 3. 放到volume (之後會說到, 儲存區)
      volumeMounts:
      - name: app-config-volume
        mountPath: "/etc/foo"
        readOnly: true
  volumes: 
  - name: app-config-volume
    configMap:
      name: app-config

被直接看到不太行的參數- Secret

ConfigMap用途相同,差別在於Secret屬機密性(credential, sensitive)參數,像是密碼、token或key,需注意Secrets僅有編碼,並且預設存在etcd是未經加密,有權限的人都可以取得或修改secret,另外若有權限建立pod, deployment,都可以存取secret,可以進一步設定存取身分、啟用API data加密或考慮使用外部Secrect管理

  • 記憶體限制: Secret限制為1Mi,避免肥大的Secrects耗盡API server或kubelet資源,當然一堆小Secrets也是會耗盡資源,可以進一步用之前學到的resource quota限制namespace的Secrets數量等
  • Secret可用於物件的環境變數,或系統與外部溝通
  • Secret只在被object需要時取用,並且不會寫入其持久性儲存空間,其它物件也看不到我的秘密

Secret的類型 (列舉部份)
若要自定義類型,要在type欄位填上非空字串,空字串亦視為opaque

Built-in Type Usage 說明
Opaque (不透明的) 使用者定義的任意資料 下指令時,類型名稱為generic
kubernetes.io/service-account-token ServiceAccount token 舊機制,新版建議(1.22+)使用短時效的TokenRequest
kubernetes.io/basic-auth 基礎驗證的credentials data必須包含2個key: username及password(base64編碼),或是改用stringData欄位原文寫入,這些資料可以用Opaque建立,不過定義此類型更有語意並且包含基礎需求限制
kubernetes.io/ssh-auth SSH驗證的credentials data(或stringData)必須包含key: ssh-privatekey,也是可用Opaque建立
kubernetes.io/tls 給TLS client or server的資料 certificate和相關的key,data(或stringData)必須包含tls.key和tls.crt
  1. 建立Secret
  • data欄位都要用base64編碼過,stringData欄位則無限制
    • 不換行編碼echo -n <字串內容> | base64
    • 解碼時 echo -n <字串內容> | base64 -decode 或 -d
  • 半隱藏式,data的key前綴加上點.,一般匯出ls -l時隱藏,需使用ls -la才看的到
apiVersion: v1
kind: Secret
metadata:
  name: app-secret
type: generic # 預設
data:
  .secret-file: dmFsdWUtMg0KDQo=
  DB_Host: c3FsMDE=
  DB_User: cm9vdA==
  DB_Password: Z29vZGdvb2RkZXI=
# 查詢secret
kubectl get secrets
kubectl describe secrets
# 輸出才可看到完整的secrect
kubectl get secrets <secrect_name> -o yaml
# 建立secret, 明文輸入即可, 會自動轉換編碼
kubectl create secret generic db-secret --from-literal=<key1>=<value1> --from-literal=<key2>=<value2> --from-literal=DB_Password=<key3>=<value3>
kubectl create -f <檔案名稱>
  1. 注入參數
apiVersion:
kind: Pod
metadata:
  name: myapp-pod
spec:
  priorityClassName: high-priority
  containers:
    - name: nginx-container
      image: nginx
      # 1. 從secret提取
      env:
      - name: DB_Host
          valueFrom:  
              secretKeyRef:
                name: app-secret
                key: DB_Host
      # 2. 環境變數來自這整個secret (List)
      envFrom: 
      - secretRef: 
          name: app-secret
      # 3. 放到volumn (之後會說到, 儲存區)
      volumeMounts:
      - name: app-secret-volume
        mountPath: "/etc/foo"
  volumes: 
  - name: app-secret-volume
    secret:
      secretName: app-secret # 每個屬性在container各建立一個檔案
      optional: true # 預設為必須取到secret,若取不到將導致pod無法啟動

不同查詢secret指令的顯示內容
https://ithelp.ithome.com.tw/upload/images/20240814/201681780UGGOw5cXX.png
https://ithelp.ithome.com.tw/upload/images/20240814/20168178LP2qBP2NHh.png


上一篇
Day9. I am watching you 👀
下一篇
Day11. 資料不能亡,持久性儲存- Volume(上)
系列文
今天不學遺傳學,跟著Kubernetes種豌豆30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言