K8S - 配置資源管理

citywalk發表於2024-03-07

配置資源管理

ConfigMap資源(簡稱給cm)

用於儲存配置檔案,環境變數等不需要加密的資訊。它可以實現將配置資訊與應用程式解耦

kubectl run pod-demo --image=soscscs/myapp --port=80 --dry-run=client -o yaml > pod-demo.yaml

kubectl create cm cm-demo1 --from-file=./hanbao.txt --from-file=./index.html --from-literal=myname=hanbao

apiVersion: v1
kind: Pod
metadata:
  labels:
    run: pod-demo1
  name: pod-demo1
spec:
  volumes:
  - name: vol-cm
    configMap:
      name: cm-demo1
  containers:
  - image: soscscs/myapp:v1
    name: pod-demo
    ports:
    - containerPort: 80
    volumeMounts:
    - name: vol-cm
      mountPath: /var/www/html
    resources: {}
  dnsPolicy: ClusterFirst
  restartPolicy: Always
status: {}

#實現動態更新(熱更新)

Pod 中使用 ConfigMap

apiVersion: v1
kind: ConfigMap
metadata:
  name: special-config
  namespace: default
data:
  special.how: very
  special.type: good
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: env-config
  namespace: default
data:
  log_level: INFO

apiVersion: v1
kind: Pod
metadata:
  name: test-pod
spec:
  containers:
  - name: busybox
    image: busybox:1.28.4
    command: [ "/bin/sh", "-c", "env" ]
    env:
      - name: SPECIAL_HOW_KEY
        valueFrom:
          configMapKeyRef:
            name: special-config
            key: special.how
      - name: SPECIAL_TYPE_KEY
        valueFrom:
          configMapKeyRef:
            name: special-config
            key: special.type
    envFrom:
      - configMapRef:
          name: env-config
  restartPolicy: Never

透過資料卷外掛使用ConfigMap

在資料卷裡面使用 ConfigMap,就是將檔案填入資料卷,在這個檔案中,鍵就是檔名,鍵值就是檔案內容

apiVersion: v1
kind: Pod
metadata:
  name: test-pod3
spec:
  containers:
  - name: busybox
    image: busybox:1.28.4
    command: [ "/bin/sh", "-c", "sleep 36000" ]
    volumeMounts:
    - name: config-volume
      mountPath: /etc/config
  volumes:
    - name: config-volume
      configMap:
        name: special-config
  restartPolicy: Never

Secret

Secret 是用來儲存密碼、token、金鑰等敏感資料的 k8s 資源,這類資料雖然也可以存放在 Pod 或者映象中,但是放在 Secret 中是為了更方便的控制如何使用資料,並減少暴露的風險。

Secret 有四種型別: 
●kubernetes.io/service-account-token:由 Kubernetes 自動建立,用來訪問 APIServer 的 Secret,Pod 會預設使用這個 Secret 與 APIServer 通訊, 並且會自動掛載到 Pod 的 /run/secrets/kubernetes.io/serviceaccount 目錄中;
●Opaque :base64 編碼格式的 Secret,用來儲存使用者自定義的密碼、金鑰等,預設的 Secret 型別;
●kubernetes.io/dockerconfigjson :用來儲存私有 docker registry 的認證資訊。
●kubernetes.io/tls :用來儲存 TLS 證書和私鑰資訊。

Pod 需要先引用才能使用某個 secret,Pod 有 3 種方式來使用 secret:
●作為掛載到一個或多個容器上的卷 中的檔案。
●作為容器的環境變數。
●由 kubelet 在為 Pod 拉取映象時使用。

應用場景:憑據
https://kubernetes.io/docs/concepts/configuration/secret/

kubectl create secret generic mysecret --from-file=username.txt --from-file=password.txt

kubectl describe secret mysecret

內容用 base64 編碼,建立Secret

echo -n zhangsan | base64

echo -n abc1234 | base64

apiVersion: v1
kind: Secret
metadata:
  name: mysecret1
type: Opaque
data:
  username: emhhbmdzYW4=
  password: YWJjMTIzNA==

使用方式

將 Secret 掛載到 Volume 中,以 Volume 的形式掛載到 Pod 的某個目錄下

apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
  - name: nginx
    image: nginx
    volumeMounts:
    - name: secrets
      mountPath: "/etc/secrets"
      readOnly: true
  volumes:
  - name: secrets
    secret:
      secretName: mysecret

將 Secret 匯出到環境變數中

apiVersion: v1
kind: Pod
metadata:
  name: mypod1
spec:
  containers:
  - name: nginx
    image: nginx
    env:
      - name: TEST_USER
        valueFrom:
          secretKeyRef:
            name: mysecret1
            key: username
      - name: TEST_PASSWORD
        valueFrom:
          secretKeyRef:
            name: mysecret1
            key: password
    envFrom:
    - secretRef:
        name: mysecret1

總結

ConfigMap資源(簡稱給cm): #用於儲存配置檔案,環境變數等不需要加密的資訊。它可以實現將配置資訊與應用程式解耦
#建立cm資源
kubectl create cm <資源名稱> --from-file=檔案|目錄 --from-literal=<鍵名>=<鍵值>
#檢視cm資源資料
kubectl get -n <名稱空間> cm <cm資源名稱> -o yaml
kubectl describe -n <名稱空間> cm <cm資源名稱>

#使用cm資源
作為儲存卷掛載的方式:
在Pod資源配置中spec.volumes欄位設定configMap型別的卷
在容器配置中用volumeMounts將卷掛載到容器的指定的目錄,cm資源資料的鍵名會作為檔名,cm資源資料的鍵值會作為檔案內容(支援熱更新)
在容器中用volumeMounts.subFath欄位指定檔名,實現將卷掛載到容器中指定的檔案上(不支援熱更新)    --以檔案形式掛載

作為容器環境變數方式(不支援熱更新)
在容器配置中用env.name欄位自定義容器的環境變數名,用env.valueFrom.configMapKeyRef.key/name欄位指定環境變數的值從哪個cm資源的鍵獲取
在容器配置中用envFrom.configMapRef.name欄位指定cm資源的名稱,使得cm資源資料的鍵名和鍵值直接作為容器的環境變數名和值


--------------------------------------
Secret資源  #用於儲存密碼檔案、ssl證書/私鑰檔案、token令牌字串、映象私有倉庫認證資訊等需要加密的敏感資訊
Secret的主要目的是將民昂資料與應用程式程式碼分離,提供一種安全的方式來儲存和傳遞這些敏感資料給容器化的應用程式。它們已加密的形式儲存,並且只能在需要時才能被解密和使用

#Secret的4種型別:
kubernetes.io/service-account-token: 當建立serviceaccount賬戶資源後K8S會自動建立同名的secert資源,用於Pod訪問apiserver時會使用此Secret卷中的token做認證

Opaque: 預設的Secret資源型別,可以透過選項引用檔案、目錄、鍵值隊的方式建立Secret資源,並且資源資料的鍵值會被自動轉換為base64編碼格式加密


kubernetes.io/dockerconfigjson: 使用者儲存K8S從Harbor等映象私有倉庫拉取映象時做認證的資訊


#建立Secret資源
kubectl create secret generic <資源名稱> --from-file=檔案|目錄 --from-literal=<鍵名>=<鍵值>
kubectl create secret docker-registry secret-harbor -dockear-server=<私有倉庫URL路徑> --docker-username=<倉庫使用者名稱> --docker-pasword-<使用者密碼> --docker-email=<郵箱地址>
kubectl create secret tls<資源名稱> --cert=證書檔案 --key=私鑰檔案


#檢視Secret資源(鍵值會以base64編碼格式加密顯示)
kubectl get -n <名稱空間> secret <secret資源名稱> -o yaml
kubectl describe -n <名稱空間> secret <secret資源名稱>



#使用Secret資源
作為儲存卷掛載的方式:
在Pod資源配置中用spec.volumes欄位設定secret型別的卷
在容器配置中用volumeMounts將卷掛載到容器的指定的目錄,secret資源資料的鍵名會作為檔名,secret資源資料的鍵值會作為檔案內容

#作為容器環境變數的方式:
在容器配置中用env.name欄位自定義容器的環境變數名,用env.volueFrom.secretKeyRef.key/name欄位指定環境變數的值從哪個Secret資源的鍵獲取
在容器配置中用envFrom.secretRef.name欄位指定secret資源的名稱,使得secret資源資料的鍵名和鍵值直接作為容器的環境變數名和值

#Pod配置從私有倉庫拉取映象:
在Pod資源配置中用spec,imagePullsecrets.name欄位指定kubernetes.io/dockerconfigjson型別的secret資源名稱

相關文章