Kubernetes 提供 ConfigMap 和 Secret 物件來管理應用程式組態和敏感資料。ConfigMap 適用於非敏感的組態資料,例如資料函式庫連線資訊,而 Secret 則用於儲存敏感資料,例如密碼和 API 金鑰。TLS 證書和金鑰也需要透過 Secret 物件儲存,並在 Ingress 資源中組態以啟用 HTTPS。此外,Cert-Manager 可自動化 TLS 證書管理,簡化操作流程。Istio 和 Envoy 等服務網格工具則提供更進階的服務間通訊和安全管理功能,包括自動化 TLS 證書管理和服務驗證。RBAC 則提供更細緻的許可權控管機制,限制使用者和服務帳戶對資源的存取。最後,安全掃描工具如 Clair 和 Aqua Security Platform 可協助識別和修復潛在的安全漏洞,確保 Kubernetes 環境的安全性。

生成 TLS 證書和金鑰

您可以使用以下命令生成 TLS 證書和金鑰:

openssl req -x509 -newkey rsa:2048 -nodes -keyout tls.key -out tls.crt -days 365

這將生成一個名為 tls.crt 的證書檔案和一個名為 tls.key 的金鑰檔案。

建立 Secret 資源

在 Kubernetes 中,建立一個 Secret 資源來儲存 TLS 證書和金鑰:

apiVersion: v1
kind: Secret
metadata:
  name: tls-secret
type: Opaque
data:
  tls.crt: <base64 編碼的 tls.crt 檔案內容>
  tls.key: <base64 編碼的 tls.key 檔案內容>

<base64 編碼的 tls.crt 檔案內容><base64 編碼的 tls.key 檔案內容> 替換為實際的 base64 編碼的證書和金鑰內容。

組態 Ingress 資源

在 Ingress 資源中,組態 TLS 證書和金鑰以啟用 HTTPS 連線:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: example-ingress
spec:
  rules:
  - host: example.com
    http:
      paths:
      - path: /
        backend:
          serviceName: example-service
          servicePort: 80
  tls:
  - hosts:
    - example.com
    secretName: tls-secret

在上述示例中,Ingress 資源組態了一個名為 example-ingress 的規則,使用 tls-secret Secret 資源中的 TLS 證書和金鑰啟用 HTTPS 連線。

自動化 TLS 證書管理

Kubernetes 提供了 Cert-Manager 工具來自動化 TLS 證書管理。Cert-Manager 可以自動頒發和更新 TLS 證書,並將其儲存在 Secret 資源中。

Istio 和 Envoy

Istio 和 Envoy 是兩個流行的服務網格工具,可以幫助您管理服務之間的通訊和安全性。Istio 提供了自動化的 TLS 證書管理和服務身份驗證,而 Envoy 提供了高效能的服務代理和安全性功能。

在 Kubernetes 中,TLS 證書和金鑰用於安全地連線到叢集。您可以使用 OpenSSL 生成 TLS 證書和金鑰,然後建立 Secret 資源來儲存它們。Ingress 資源可以組態 TLS 證書和金鑰以啟用 HTTPS 連線。Cert-Manager 工具可以自動化 TLS 證書管理,而 Istio 和 Envoy 提供了服務網格功能來幫助您管理服務之間的通訊和安全性。

Kubernetes 中的組態管理和 Secret 物件

Kubernetes 提供了多種方式來管理應用程式的組態和敏感資料。其中,ConfigMap 和 Secret 是兩種常用的物件,用於儲存和管理組態資料和敏感資訊。

ConfigMap 物件

ConfigMap 是一種用於儲存組態資料的物件。它可以被認為是一個命名的鍵值對集合,儲存組態資料。ConfigMap 可以被用來提供組態資料給應用程式,例如環境變數、組態檔案等。

建立 ConfigMap

可以透過建立一個 YAML 檔案來定義 ConfigMap 物件。例如,以下 YAML 檔案定義了一個名為 demo-config 的 ConfigMap 物件:

apiVersion: v1
data:
  config.yaml: |
    autoSaveInterval: 60
    batchSize: 128
    protocols:
    - http
    - https
kind: ConfigMap
metadata:
  name: demo-config
  namespace: demo

這個 ConfigMap 物件包含一個名為 config.yaml 的鍵,其值是一個 YAML 格式的字串,包含了組態資料。

使用 ConfigMap

可以透過將 ConfigMap 物件作為環境變數或組態檔案提供給應用程式。例如,可以在 Pod 的定義中參照 ConfigMap 物件:

apiVersion: v1
kind: Pod
metadata:
  name: demo-pod
spec:
  containers:
  - name: demo-container
    image: demo-image
    env:
    - name: CONFIG_FILE
      value: /etc/config/config.yaml
    volumeMounts:
    - name: config-volume
      mountPath: /etc/config
  volumes:
  - name: config-volume
    configMap:
      name: demo-config

在這個例子中,ConfigMap 物件 demo-config 被用作環境變數 CONFIG_FILE 的值,並且被掛載到容器的 /etc/config 目錄中。

Secret 物件

Secret 是一種用於儲存敏感資料的物件,例如密碼、令牌等。Secret 物件可以被用來提供敏感資料給應用程式。

建立 Secret

可以透過建立一個 YAML 檔案來定義 Secret 物件。例如,以下 YAML 檔案定義了一個名為 demo-secret 的 Secret 物件:

apiVersion: v1
kind: Secret
metadata:
  name: demo-secret
  namespace: demo
type: Opaque
data:
  password: <base64 encoded password>

這個 Secret 物件包含一個名為 password 的鍵,其值是一個 base64 編碼的字串,包含了敏感資料。

使用 Secret

可以透過將 Secret 物件作為環境變數或組態檔案提供給應用程式。例如,可以在 Pod 的定義中參照 Secret 物件:

apiVersion: v1
kind: Pod
metadata:
  name: demo-pod
spec:
  containers:
  - name: demo-container
    image: demo-image
    env:
    - name: PASSWORD
      valueFrom:
        secretKeyRef:
          name: demo-secret
          key: password

在這個例子中,Secret 物件 demo-secret 被用作環境變數 PASSWORD 的值。

ConfigMap 和 Secret 是 Kubernetes 中用於管理組態資料和敏感資訊的兩種物件。ConfigMap 用於儲存組態資料,而 Secret 用於儲存敏感資料。可以透過將這些物件作為環境變數或組態檔案提供給應用程式,以便應用程式使用這些資料。

使用 Kubernetes 的 ConfigMap 進行組態管理

Kubernetes 的 ConfigMap 是一種用於儲存和管理應用程式組態的資源。它允許您將組態資料儲存在一個單獨的物件中,並且可以輕鬆地更新和管理。

建立 ConfigMap

您可以使用 kubectl create configmap 命令建立一個 ConfigMap。例如:

kubectl create configmap demo-config --from-file=config.yaml

這將建立一個名為 demo-config 的 ConfigMap,並從 config.yaml 檔案中讀取組態資料。

使用 ConfigMap

您可以在 Deployment 或 Pod 中使用 ConfigMap。例如:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: demo
spec:
  selector:
    matchLabels:
      app: demo
  template:
    metadata:
      labels:
        app: demo
    spec:
      containers:
      - name: demo
        image: cloudnatived/demo:hello-config-env
        ports:
        - containerPort: 8888
        env:
        - name: GREETING
          valueFrom:
            configMapKeyRef:
              name: demo-config
              key: greeting

這將從 demo-config ConfigMap 中讀取 greeting 鍵的值,並將其設定為環境變數 GREETING

更新 ConfigMap

您可以使用 kubectl patch 命令更新 ConfigMap。例如:

kubectl patch configmap demo-config -p='[{"op": "replace", "path": "/data/greeting", "value": "Bonjour"}]'

這將更新 demo-config ConfigMap 中的 greeting 鍵的值為 Bonjour

自動更新 Pod

當 ConfigMap 更新時,您可以使用 kubectl rollout restart 命令自動更新 Pod。例如:

kubectl rollout restart deployment demo

這將重新啟動 demo Deployment 中的所有 Pod,並將新的 ConfigMap 值應用到 Pod 中。

使用 VolumeMount

您也可以使用 VolumeMount 將 ConfigMap 中的資料掛載到 Pod 中的檔案系統中。例如:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: demo
spec:
  selector:
    matchLabels:
      app: demo
  template:
    metadata:
      labels:
        app: demo
    spec:
      containers:
      - name: demo
        image: cloudnatived/demo:hello-config-file
        ports:
        - containerPort: 8888
        volumeMounts:
        - name: demo-config-volume
          mountPath: /config/
          readOnly: true
      volumes:
      - name: demo-config-volume
        configMap:
          name: demo-config
          items:
          - key: config
            path: demo.yaml

這將將 demo-config ConfigMap 中的 config 鍵的值掛載到 Pod 中的 /config/demo.yaml 檔案中。

Kubernetes 中的機密資料管理

在 Kubernetes 中,機密資料(如密碼或 API 金鑰)需要特別處理,以確保其安全性。為此,Kubernetes 提供了一種名為 Secret 的物件,專門用於儲存和管理機密資料。

Secret 物件

Secret 物件是一種 Kubernetes 資源,用於儲存和管理機密資料。它可以包含多個鍵值對,例如密碼或 API 金鑰。Secret 物件可以被用作環境變數或檔案,供容器使用。

建立 Secret 物件

建立 Secret 物件的過程與建立 ConfigMap 物件類別似。以下是建立一個名為 demo-secret 的 Secret 物件的範例:

apiVersion: v1
kind: Secret
metadata:
  name: demo-secret
stringData:
  magicWord: xyzzy

在這個範例中,我們定義了一個名為 demo-secret 的 Secret 物件,其中包含一個鍵值對:magicWord 的值為 xyzzy

使用 Secret 物件

Secret 物件可以被用作環境變數或檔案,供容器使用。以下是使用 Secret 物件作為環境變數的範例:

spec:
  containers:
  - name: demo
    image: cloudnatived/demo:hello-secret-env
    ports:
    - containerPort: 8888
    env:
    - name: GREETING
      valueFrom:
        secretKeyRef:
          name: demo-secret
          key: magicWord

在這個範例中,我們定義了一個容器,該容器使用 demo-secret Secret 物件中的 magicWord 鍵值作為環境變數 GREETING 的值。

存取 Secret 物件

Secret 物件可以被存取為檔案或環境變數。以下是存取 Secret 物件作為檔案的範例:

spec:
  containers:
  - name: demo
    image: cloudnatived/demo:hello-secret-file
    ports:
    - containerPort: 8888
    volumeMounts:
    - name: demo-secret-volume
      mountPath: "/secrets/"
      readOnly: true
  volumes:
  - name: demo-secret-volume
    secret:
      secretName: demo-secret

在這個範例中,我們定義了一個容器,該容器存取 demo-secret Secret 物件作為檔案,檔案路徑為 /secrets/

編碼和解碼

Secret 物件中的資料會被編碼為 Base64 格式,以確保其安全性。以下是編碼和解碼的範例:

echo "xyzzy" | base64
eHl6enk=
echo "eHl6enk=" | base64 --decode
xyzzy

在這個範例中,我們使用 base64 命令將 xyzzy 編碼為 Base64 格式,然後使用 base64 --decode 命令解碼回原始資料。

Kubernetes 中的 Secret 物件與安全性

Kubernetes 中的 Secret 物件是一種用於儲存和管理敏感資料的機制,例如密碼、API 金鑰和憑證。Secret 物件可以被用於提供給 Pod 或容器使用,讓它們可以存取敏感資料而不需要將其硬編碼到應用程式中。

Secret 物件的安全性

Kubernetes 中的 Secret 物件具有多層次的安全保護機制,以確保敏感資料的安全性:

  1. 加密儲存:Secret 物件在 etcd 中儲存時會被加密,確保即使攻擊者獲得了 etcd 的存取權,也無法直接讀取敏感資料。
  2. 存取控制:Kubernetes 中的 Role-Based Access Control (RBAC) 機制可以控制哪些使用者或服務帳戶可以存取 Secret 物件。
  3. 有限的存取權:Secret 物件只能被授權的 Pod 或容器存取,減少了敏感資料被洩露的風險。

Secret 物件的型別

Kubernetes 中的 Secret 物件有多種型別,包括:

  1. Opaque:用於儲存任意的敏感資料。
  2. kubernetes.io/service-account-token:用於儲存服務帳戶的 token。
  3. kubernetes.io/dockerconfigjson:用於儲存 Docker 組態檔案。
  4. kubernetes.io/basic-auth:用於儲存基本驗證用的使用者名稱和密碼。

Secret 物件的建立和管理

Secret 物件可以透過 kubectl 命令或 Kubernetes API 建立和管理。以下是一個簡單的範例:

# 建立一個名為 my-secret 的 Secret 物件
kubectl create secret generic my-secret --from-literal=password=my-password

# 檢視 my-secret 的內容
kubectl get secret my-secret -o yaml

Secret 物件的使用

Secret 物件可以被用於提供給 Pod 或容器使用。以下是一個簡單的範例:

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
  - name: my-container
    image: my-image
    env:
    - name: MY_PASSWORD
      valueFrom:
        secretKeyRef:
          name: my-secret
          key: password

在這個範例中,my-pod 的 my-container 容器會從 my-secret 的 password 鍵中讀取敏感資料,並將其設定為環境變數 MY_PASSWORD。

第10章:組態和Secret物件

在開始討論Kubernetes的組態和Secret物件之前,瞭解如何將組態資料與程式碼分離是非常重要的。這可以透過Kubernetes的ConfigMap和Secret物件來實作。

什麼是ConfigMap?

ConfigMap是一種Kubernetes物件,允許您將組態資料儲存為鍵值對。這些資料可以是簡單的文字、JSON或YAML檔案等。您可以使用kubectl命令將現有的檔案轉換為ConfigMap物件。

什麼是Secret?

Secret是一種Kubernetes物件,允許您將敏感資料儲存為鍵值對。與ConfigMap不同,Secret的資料會被加密儲存。您可以使用kubectl命令建立Secret物件,並將其用於您的應用程式。

如何使用ConfigMap和Secret?

您可以使用kubectl命令建立ConfigMap和Secret物件,並將其掛載到容器中。這樣,您就可以在程式碼中使用這些組態資料,而不需要將其硬編碼到程式碼中。

實際案例

假設您有一個Web應用程式,需要連線到一個資料函式庫。您可以建立一個ConfigMap物件,儲存資料函式庫的連線設定,例如資料函式庫名稱、使用者名稱和密碼等。然後,您可以將這個ConfigMap物件掛載到容器中,讓您的Web應用程式可以使用這些設定。

第11章:安全性和備份

在本章中,我們將討論Kubernetes的安全性和備份機制。瞭解如何保護您的Kubernetes叢集和應用程式是非常重要的。

安全性

Kubernetes提供了多種安全性機制,包括網路政策、角色基礎存取控制(RBAC)和秘密管理等。網路政策可以幫助您控制叢集內的流量,而RBAC可以幫助您控制使用者的存取許可權。秘密管理可以幫助您保護敏感資料。

備份

備份是保護您的資料的重要機制。Kubernetes提供了多種備份工具,包括kubectl命令和第三方備份工具等。您可以使用這些工具備份您的叢集和應用程式資料。

實際案例

假設您有一個Kubernetes叢集,需要備份您的應用程式資料。您可以使用kubectl命令備份您的叢集和應用程式資料。然後,您可以將這些備份資料儲存到一個安全的位置,例如雲端儲存服務等。

Kubernetes 中的 RBAC 和安全掃描

Kubernetes 中的 RBAC(Role-Based Access Control)是一種用於控制使用者存取資源的機制。它允許您定義角色和繫結角色到使用者或服務帳戶,從而控制他們可以存取哪些資源。

RBAC 的工作原理

RBAC 的工作原理是透過定義角色和繫結角色到使用者或服務帳戶。角色定義了一組許可權,例如建立、讀取、更新和刪除資源。繫結角色到使用者或服務帳戶後,該使用者或服務帳戶就可以存取相應的資源。

RBAC 的優點

RBAC 有以下優點:

  • 細粒度的存取控制:RBAC 允許您控制使用者存取資源的細粒度,從而提高系統的安全性。
  • 簡單的管理:RBAC 的管理相對簡單,您只需要定義角色和繫結角色到使用者或服務帳戶即可。
  • 靈活的擴充套件:RBAC 支援動態更新角色和繫結,從而可以隨著系統的變化進行調整。

安全掃描工具

安全掃描工具是用於掃描系統中潛在的安全風險的工具。以下是兩種常見的安全掃描工具:

  • Clair:Clair 是一個開源的安全掃描工具,支援掃描 Docker 容器映象和 Kubernetes 叢集。它可以檢測出映象和叢集中的安全風險,例如已知的漏洞和組態錯誤。
  • Aqua Security Platform:Aqua Security Platform 是一個商業的安全掃描工具,支援掃描 Docker 容器映象和 Kubernetes 叢集。它可以檢測出映象和叢集中的安全風險,例如已知的漏洞和組態錯誤,並提供詳細的報告和建議。

從系統安全與穩定性視角來看,妥善管理 Kubernetes 中的 Secret 和組態至關重要。上述文章涵蓋了 ConfigMap 和 Secret 的建立、使用、更新以及與 Pod 的整合,同時也探討了安全性議題,例如 RBAC 和安全掃描工具。然而,文章較少著墨於不同 Secret 型別的應用場景以及如何有效結合外部 Secret 管理方案,例如 HashiCorp Vault 或 AWS Secrets Manager。

實務上,除了基本的使用方式外,更需考量 Secret 的生命週期管理、版本控制以及輪替策略,才能有效降低安全風險。此外,針對不同型別的敏感資料,選擇合適的 Secret 型別和加密方式也至關重要。例如,TLS 憑證應使用 kubernetes.io/tls 型別,而 Docker 登入憑證應使用 kubernetes.io/dockerconfigjson 型別。

展望未來,隨著 GitOps 等現代化佈署方法的普及,將 Secret 和組態管理整合到 Git 流程中,並結合自動化工具進行佈署和更新,將成為主流趨勢。同時,更精細化的 RBAC 許可權控制和更全面的安全掃描工具,也將持續強化 Kubernetes 的安全防護能力。對於追求高安全性和穩定性的企業而言,深入理解和應用這些最佳實務,才能充分發揮 Kubernetes 的優勢。