Kubernetes 投射卷

2022-05-07 11:39 更新

介紹 

一個(gè) ?projected ?卷可以將若干現(xiàn)有的卷源映射到同一個(gè)目錄之上。

目前,以下類型的卷源可以被投射:

  • secret
  • downwardAPI
  • configMap
  • serviceAccountToken

所有的卷源都要求處于 Pod 所在的同一個(gè)名字空間內(nèi)。進(jìn)一步的詳細(xì)信息,可參考 一體化卷設(shè)計(jì)文檔。

帶有 Secret、DownwardAPI 和 ConfigMap 的配置示例 

apiVersion: v1
kind: Pod
metadata:
  name: volume-test
spec:
  containers:
  - name: container-test
    image: busybox:1.28
    volumeMounts:
    - name: all-in-one
      mountPath: "/projected-volume"
      readOnly: true
  volumes:
  - name: all-in-one
    projected:
      sources:
      - secret:
          name: mysecret
          items:
            - key: username
              path: my-group/my-username
      - downwardAPI:
          items:
            - path: "labels"
              fieldRef:
                fieldPath: metadata.labels
            - path: "cpu_limit"
              resourceFieldRef:
                containerName: container-test
                resource: limits.cpu
      - configMap:
          name: myconfigmap
          items:
            - key: config
              path: my-group/my-config

帶有非默認(rèn)權(quán)限模式設(shè)置的 Secret 的配置示例

apiVersion: v1
kind: Pod
metadata:
  name: volume-test
spec:
  containers:
  - name: container-test
    image: busybox:1.28
    volumeMounts:
    - name: all-in-one
      mountPath: "/projected-volume"
      readOnly: true
  volumes:
  - name: all-in-one
    projected:
      sources:
      - secret:
          name: mysecret
          items:
            - key: username
              path: my-group/my-username
      - secret:
          name: mysecret2
          items:
            - key: password
              path: my-group/my-password
              mode: 511

每個(gè)被投射的卷源都列舉在規(guī)約中的 ?sources ?下面。參數(shù)幾乎相同,只有兩個(gè)例外:

  • 對(duì)于 Secret,?secretName ?字段被改為 ?name ?以便于 ConfigMap 的命名一致;
  • ?defaultMode ?只能在投射層級(jí)設(shè)置,不能在卷源層級(jí)設(shè)置。不過(guò),正如上面所展示的, 你可以顯式地為每個(gè)投射單獨(dú)設(shè)置 ?mode ?屬性。

serviceAccountToken 投射卷

當(dāng) ?TokenRequestProjection ?特性被啟用時(shí),你可以將當(dāng)前 服務(wù)賬號(hào) 的令牌注入到 Pod 中特定路徑下。例如:

apiVersion: v1
kind: Pod
metadata:
  name: sa-token-test
spec:
  containers:
  - name: container-test
    image: busybox:1.28
    volumeMounts:
    - name: token-vol
      mountPath: "/service-account"
      readOnly: true
  serviceAccountName: default
  volumes:
  - name: token-vol
    projected:
      sources:
      - serviceAccountToken:
          audience: api
          expirationSeconds: 3600
          path: token

示例 Pod 中包含一個(gè)投射卷,其中包含注入的服務(wù)賬號(hào)令牌。 此 Pod 中的容器可以使用該令牌訪問(wèn) Kubernetes API 服務(wù)器, 使用 pod 的 ServiceAccount 進(jìn)行身份驗(yàn)證。?audience ?字段包含令牌所針對(duì)的受眾。 收到令牌的主體必須使用令牌受眾中所指定的某個(gè)標(biāo)識(shí)符來(lái)標(biāo)識(shí)自身,否則應(yīng)該拒絕該令牌。 此字段是可選的,默認(rèn)值為 API 服務(wù)器的標(biāo)識(shí)。

字段 ?expirationSeconds ?是服務(wù)賬號(hào)令牌預(yù)期的生命期長(zhǎng)度。默認(rèn)值為 1 小時(shí), 必須至少為 10 分鐘(600 秒)。管理員也可以通過(guò)設(shè)置 API 服務(wù)器的命令行參數(shù) ?--service-account-max-token-expiration? 來(lái)為其設(shè)置最大值上限。?path ?字段給出 與投射卷掛載點(diǎn)之間的相對(duì)路徑。

以 ?subPath ?形式使用投射卷源的容器無(wú)法收到對(duì)應(yīng)卷源的更新。

與 SecurityContext 間的關(guān)系 

關(guān)于在投射的服務(wù)賬號(hào)卷中處理文件訪問(wèn)權(quán)限的提案 介紹了如何使得所投射的文件具有合適的屬主訪問(wèn)權(quán)限。

Linux

在包含了投射卷并在 ?SecurityContext ?中設(shè)置了 ?RunAsUser ?屬性的 Linux Pod 中,投射文件具有正確的屬主屬性設(shè)置, 其中包含了容器用戶屬主。

Windows

在包含了投射卷并在 ?SecurityContext ?中設(shè)置了 ?RunAsUsername ?的 Windows Pod 中, 由于 Windows 中用戶賬號(hào)的管理方式問(wèn)題,文件的屬主無(wú)法正確設(shè)置。 Windows 在名為安全賬號(hào)管理器(Security Account Manager,SAM) 的數(shù)據(jù)庫(kù)中保存本地用戶和組信息。每個(gè)容器會(huì)維護(hù)其自身的 SAM 數(shù)據(jù)庫(kù)實(shí)例, 宿主系統(tǒng)無(wú)法窺視到容器運(yùn)行期間數(shù)據(jù)庫(kù)內(nèi)容。Windows 容器被設(shè)計(jì)用來(lái)運(yùn)行操作系統(tǒng)的用戶態(tài)部分, 與宿主系統(tǒng)之間隔離,因此維護(hù)了一個(gè)虛擬的 SAM 數(shù)據(jù)庫(kù)。 所以,在宿主系統(tǒng)上運(yùn)行的 kubelet 無(wú)法動(dòng)態(tài)為虛擬的容器賬號(hào)配置宿主文件的屬主。 如果需要將宿主機(jī)器上的文件與容器共享,建議將它們放到掛載于 ?C:\? 之外 的獨(dú)立卷中。

默認(rèn)情況下,所投射的文件會(huì)具有如下例所示的屬主屬性設(shè)置:

PS C:\> Get-Acl C:\var\run\secrets\kubernetes.io\serviceaccount\..2021_08_31_22_22_18.318230061\ca.crt | Format-List

Path   : Microsoft.PowerShell.Core\FileSystem::C:\var\run\secrets\kubernetes.io\serviceaccount\..2021_08_31_22_22_18.318230061\ca.crt
Owner  : BUILTIN\Administrators
Group  : NT AUTHORITY\SYSTEM
Access : NT AUTHORITY\SYSTEM Allow  FullControl
         BUILTIN\Administrators Allow  FullControl
         BUILTIN\Users Allow  ReadAndExecute, Synchronize
Audit  :
Sddl   : O:BAG:SYD:AI(A;ID;FA;;;SY)(A;ID;FA;;;BA)(A;ID;0x1200a9;;;BU)

這意味著,所有類似 ?ContainerAdministrator ?的管理員用戶都具有讀、寫和執(zhí)行訪問(wèn)權(quán)限, 而非管理員用戶將具有讀和執(zhí)行訪問(wèn)權(quán)限。

總體而言,為容器授予訪問(wèn)宿主系統(tǒng)的權(quán)限這種做法是不推薦的,因?yàn)檫@樣做可能會(huì)打開潛在的安全性攻擊之門。
在創(chuàng)建 Windows Pod 時(shí),如過(guò)在其 ?SecurityContext ?中設(shè)置了 ?RunAsUser?, Pod 會(huì)一直阻塞在 ?ContainerCreating ?狀態(tài)。因此,建議不要在 Windows 節(jié)點(diǎn)上使用僅針對(duì) Linux 的 ?RunAsUser ?選項(xiàng)。


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)