[英]How to set secret files to kubernetes secrets by yaml?
我想將文件存儲在 Kubernetes Secrets 中,但我還沒有找到使用yaml
文件的方法。
我已經能夠使用帶有kubectl
的 cli 來實現它:
kubectl create secret generic some-secret --from-file=secret1.txt=secrets/secret1.txt
但是當我在yaml
嘗試類似的東西時:
apiVersion: v1
kind: Secret
metadata:
name: some-secret
type: Opaque
data:
secret1.txt: secrets/secret1.txt
我有這個錯誤:
[pos 73]: json: error decoding base64 binary 'assets/elasticsearch.yml': illegal base64 data at input byte 20
我正在遵循本指南http://kubernetes.io/docs/user-guide/secrets/ 。 它解釋了如何使用yaml
創建機密,但沒有說明如何使用yaml
從文件創建機密。
有可能嗎? 如果是這樣,我該怎么做?
如上一篇文章所述,我們需要向文件提供編碼為 based64 的證書/密鑰。
這是證書的通用示例(在本例中為 SSL):
secret.yml.tmpl
:
apiVersion: v1
kind: Secret
metadata:
name: test-secret
namespace: default
type: Opaque
data:
server.crt: SERVER_CRT
server.key: SERVER_KEY
預處理文件以包含證書/密鑰:
sed "s/SERVER_CRT/`cat server.crt|base64 -w0`/g" secret.yml.tmpl | \
sed "s/SERVER_KEY/`cat server.key|base64 -w0`/g" | \
kubectl apply -f -
請注意,證書/密鑰使用不含空格 (-w0) 的 base64 進行編碼。
對於 TLS 可以簡單地:
kubectl create secret tls test-secret-tls --cert=server.crt --key=server.key
您可以使用 --dry-run 標志來准備包含文件數據的 YAML。
kubectl create secret generic jwt-certificates --from-file=jwt-public.cer --from-file=jwt-private.pfx --dry-run=true --output=yaml > jwt-secrets.yaml
編輯
感謝@Leopd 對 API 棄用的評論,新的 kubectl 使用以下命令:
kubectl create secret generic jwt-certificates --from-file=jwt-public.cer --from-file=jwt-private.pfx --dry-run=client --output=yaml > jwt-secrets.yaml
在我的機器上我還有舊的 kubectl 版本
使用CLI
格式時,基本上是在將 yaml 發布到服務器端之前使用它的生成器。
由於 Kubernetes 是客戶端 - 服務器應用程序,中間有 REST API,並且操作需要是原子的,發布的 YAML 需要包含文件的內容,最好的方法是將其嵌入為 base64 格式的內聯. 如果文件可以以其他方式嵌入(縮進可能用於創建文件的邊界),那就太好了,但直到現在我還沒有看到任何這樣的例子。
話雖如此,在 yaml 上放置文件引用是不可能的,因為沒有預先渲染 yaml 來包含內容。
所以我剛剛學習了一個我錯過的超級有用的 k8s 基礎,然后發現它有一個與之相關的安全漏洞,並想出了一個解決方案。
域名注冊地址:
您可以將明文多行字符串/文本文件作為 secret.yaml 在您的秘密倉庫中! :)
(注意我建議將其存儲在 Hashicorp Vault 中,您可以存儲具有機密的版本化配置文件,並通過 Vault 網頁輕松查看/編輯它們,與 git repo 不同,您可以進行細粒度訪問控制,管道可以使用 REST用於提取更新秘密的 API,這也使密碼輪換變得容易。)
cleartext-appsettings-secret.yaml
appsettings.Dummy.json 是默認文件名(密鑰的密鑰)
(我使用單詞默認文件名,因為您可以在 yaml 掛載中覆蓋它)
明文json代碼是文件內容(秘密的值)
apiVersion: v1
kind: Secret
metadata:
name: appsettings
namespace: api
type: Opaque
stringData:
appsettings.Dummy.json: |-
{
"Dummy": {
"Placeholder": {
"Password": "blank"
}
}
}
當我
kubectl apply -f cleartext-appsettings-secret.yaml
kubectl 獲取秘密 appsettings -n=api -o yaml
秘密在注釋中顯示為明文......
apiVersion: v1
data:
appsettings.Dummy.json: ewogICJEdW1teSI6IHsKICAgICJQbGFjZWhvbGRlciI6IHsKICAgICAgIlBhc3N3b3JkIjogImJsYW5rIgogICAgfQogIH0KfQ==
kind: Secret
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"v1","kind":"Secret","metadata":{"annotations":{},"name":"appsettings","namespace":"api"},"stringData":{"appsettings.Dummy.json":"{\n \"Dummy\": {\n \"Placeholder\": {\n \"Password\": \"blank\"\n }\n }\n}"},"type":"Opaque"}
creationTimestamp: 2019-01-31T02:50:16Z
name: appsettings
namespace: api
resourceVersion: "4909"
selfLink: /api/v1/namespaces/api/secrets/appsettings
uid: f0629027-2502-11e9-9375-6eb4e0983acc
顯然,用於創建注釋中顯示的秘密的 yaml 是 kubectl apply -f secret.yaml 自 2016 年以來的預期行為/已作為錯誤報告發布,但問題未解決而關閉/他們忽略它而不是修復它。
如果你是原始的 secret.yaml 是 base64 的,注釋至少是 base64 的,但在這種情況下,它直接是非 base64 的人類可讀明文。
注意1:它不會發生在命令式秘密創建中
kubectl 創建秘密通用 appsettings --from-file appsettings.Dummy.json --namespace=api
注意 2:支持聲明性 appsettings-secret.yaml 的另一個原因是,當需要編輯時 kubectl apply -f 將配置密鑰,但是如果您運行該 create 命令,它會說錯誤已經存在,您必須刪除它,然后再運行 create 命令。
注意 3: kubectl create secret generic name --from-file file --namespace 的一個原因/反對 secret.yaml 的一個原因是 kubectl show secret 不會在上次編輯機密時向您顯示。 與 create 命令一樣,因為您必須先刪除它,然后才能重新創建它,所以您將根據它存在的時間知道它上次編輯的時間,因此這有利於審計試驗。 (但有更好的審計方法)
kubectl apply -f cleartext-appsettings-secret.yaml
kubectl 注釋秘密 appsettings -n=api kubectl.kubernetes.io/last-applied-configuration-
kubectl 獲取秘密 appsettings -n=api -o yaml
抵消泄漏
apiVersion: v1
data:
appsettings.Dummy.json: ewogICJEdW1teSI6IHsKICAgICJQbGFjZWhvbGRlciI6IHsKICAgICAgIlBhc3N3b3JkIjogImJsYW5rIgogICAgfQogIH0KfQ==
kind: Secret
metadata:
creationTimestamp: 2019-01-31T03:06:55Z
name: appsettings
namespace: api
resourceVersion: "6040"
selfLink: /api/v1/namespaces/api/secrets/appsettings
uid: 43f1b81c-2505-11e9-9375-6eb4e0983acc
type: Opaque
您可以使用secode用base64
編碼的字符串替換秘密值,只需執行以下操作:
secode secrets.yaml > secrets_base64.yaml
當在列表 ( kind: List
) 中定義時,它對所有data
字段進行編碼,並使用每個yaml
文件的多個機密 ( kind:Secret
) 進行處理。
免責聲明:我是作者
對於房間中的 Windows 用戶,對每個 .cer 和 .key 使用它(示例顯示 .key 被編碼以插入到 YAML 文件中):
$Content = Get-Content -Raw -Path C:\ssl-cert-decrypted.key
[Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes($Content)) | Out-File -FilePath C:\ssl-cert-decrypted.key.b64
打開新的.b64
文件並將(單行)輸出粘貼到您的 YAML 文件中 - 請注意,如果將 YAML 文件簽入包含此信息的源代碼存儲庫,則密鑰將有效地受到損害,因為 base64 不是t 加密。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.