網站首頁 編程語言 正文
文章目錄
- configmap
- 示例
- 更新
- Secret
- Pod 用使用 Secret三種方式
- 使用 kubectl 創建 Secret
- 手動創建 Secret
- data
- stringData
- 從生成器創建 Secret
- 從文件生成 Secret
- 基于字符串值來創建 Secret
- 解碼 Secret
- 編輯 Secret
- 使用 Secret
- 在 Pod 中使用存放在卷中的 Secret
- 將 Secret 鍵名映射到特定路徑
- Secret 文件權限
- 掛載的 Secret 會被自動更新
- 以環境變量的形式使用 Secrets
這篇比較輕松,因為我這會兒的時間被稱之為“碎片時間”。
configmap
ConfigMap是一個或多個key/value的形式保存在k8s中,內部可以管理變量也可以管理完整的配置文件內容。
示例
apiVersion: v1
kind: ConfigMap
metadata:
name: configmap
namespace: dev
data:
info: |
username:admin
password:123456
apiVersion: v1
kind: Pod
metadata:
name: pod-configmap
namespace: dev
spec:
containers:
- name: nginx
image: nginx:1.17.1
volumeMounts: # 將configmap掛載到目錄
- name: config
mountPath: /configmap/config
volumes: # 引用configmap
- name: config
configMap:
name: configmap
更新
kubectl edit cm cm-test01
這個我比較關心,因為這個是真的用得到。
通過kubectl describe cm cm-test01查看更新是否生效。
方式二:直接更改yaml文件里面的值,通過kubectl apply -f configmap-test01.yaml重新發布一遍進行更新。
不過目前我對二者細節還沒把握到位。這個系列過去我會著手做一個社群,集思廣益。
Secret
在kubernetes中,還存在一種和ConfigMap非常類似的對象,稱為Secret對象。它主要用于存儲敏感信息,例如密碼、秘鑰、證書等等。這樣的信息可能會被放在 Pod 規約中或者鏡像中。 用戶可以創建 Secret,同時系統也創建了一些 Secret。
要使用 Secret,Pod 需要引用 Secret。
Pod 用使用 Secret三種方式
- 作為掛載到一個或多個容器上的 卷 中的文件。
- 作為容器的環境變量
- 由 kubelet 在為 Pod 拉取鏡像時使用
使用 kubectl 創建 Secret
# 創建本例中要使用的文件
echo -n 'admin' > ./username.txt
echo -n '1f2d1e2e67df' > ./password.txt
#第一種
# kubectl create secret 命令將這些文件打包到一個 Secret 中并在 API server 中創建了一個對象。 Secret 對象的名稱必須是合法的 DNS 子域名。
kubectl create secret generic db-user-pass --from-file=./username.txt --from-file=./password.txt
# 默認的鍵名是文件名。你也可以使用 [--from-file=[key=]source] 參數來設置鍵名。
#第二種
kubectl create secret generic db-user-pass \
--from-file=username=./username.txt \
--from-file=password=./password.txt
#第三種
kubectl create secret generic dev-db-secret \
--from-literal=username=devuser \
--from-literal=password='S!B\*d$zDsb='
kubectl get secrets
kubectl describe secrets/db-user-pass
特殊字符(例如 $、\、*、= 和 !)可能會被你的 Shell 解析,因此需要轉義。 在大多數 Shell 中,對密碼進行轉義的最簡單方式是使用單引號(’)將其擴起來。
您無需對文件中保存(–from-file)的密碼中的特殊字符執行轉義操作。
手動創建 Secret
data
$ echo -n 'admin' | base64
YWRtaW4=
$ echo -n '1f2d1e2e67df' | base64
MWYyZDFlMmU2N2Rm
編寫一個yaml
apiVersion: v1
kind: Secret
metadata:
name: mysecret
type: Opaque
data:
username: YWRtaW4=
password: MWYyZDFlMmU2N2Rm
kubectl apply -f ./secret.yaml
在某些情況下,你可能希望改用 stringData 字段。 此字段允許您將非 base64 編碼的字符串直接放入 Secret 中, 并且在創建或更新 Secret 時將為您編碼該字符串。
stringData
apiVersion: v1
kind: Secret
metadata:
name: mysecret
type: Opaque
stringData:
config.yaml: |-
apiUrl: "https://my.api.com/api/v1"
username: {{username}}
password: {{password}}
$ kubectl get secret mysecret -o yaml
apiVersion: v1
kind: Secret
metadata:
creationTimestamp: 2018-11-15T20:40:59Z
name: mysecret
namespace: default
resourceVersion: "7225"
uid: c280ad2e-e916-11e8-98f2-025000000001
type: Opaque
data:
config.yaml: YXBpVXJsOiAiaHR0cHM6Ly9teS5hcGkuY29tL2FwaS92MSIKdXNlcm5hbWU6IHt7dXNlcm5hbWV9fQpwYXNzd29yZDoge3twYXNzd29yZH19
如果在 data 和 stringData 中都指定了某一字段,則使用 stringData 中的值:
data 和 stringData 的鍵必須由字母數字字符 ‘-’, ‘_’ 或者 ‘.’ 組成.
從生成器創建 Secret
Kubectl 從 1.14 版本開始支持使用 Kustomize 管理對象。 Kustomize 提供資源生成器創建 Secret 和 ConfigMaps。 Kustomize 生成器要在當前目錄內的 kustomization.yaml 中指定。 生成 Secret 之后,使用 kubectl apply 在 API 服務器上創建對象。
從文件生成 Secret
cat <<EOF >./kustomization.yaml
secretGenerator:
- name: db-user-pass
files:
- username.txt
- password.txt
EOF
應用包含 kustomization.yaml 目錄以創建 Secret 對象。
kubectl apply -k .
kubectl get secrets
輸出類似于:
NAME TYPE DATA AGE
db-user-pass-96mffmfh4k Opaque 2 51s
$ kubectl describe secrets/db-user-pass-96mffmfh4k
Name: db-user-pass
Namespace: default
Labels: <none>
Annotations: <none>
Type: Opaque
Data
====
password.txt: 12 bytes
username.txt: 5 bytes
基于字符串值來創建 Secret
cat <<EOF >./kustomization.yaml
secretGenerator:
- name: db-user-pass
literals:
- username=admin
- password=secret
EOF
應用包含 kustomization.yaml 目錄以創建 Secret 對象。
kubectl apply -k .
kubectl get secret mysecret -o yaml
解碼 Secret
輸出類似于:
apiVersion: v1
kind: Secret
metadata:
creationTimestamp: 2016-01-22T18:41:56Z
name: mysecret
namespace: default
resourceVersion: "164619"
uid: cfee02d6-c137-11e5-8d73-42010af00002
type: Opaque
data:
username: YWRtaW4=
password: MWYyZDFlMmU2N2Rm
解碼 password 字段:
echo 'MWYyZDFlMmU2N2Rm' | base64 --decode
輸出類似于:
1f2d1e2e67df
編輯 Secret
kubectl edit secrets mysecret
使用 Secret
在 Pod 中使用存放在卷中的 Secret
- 創建一個 Secret 或者使用已有的 Secret。多個 Pod 可以引用同一個 Secret。
- 修改你的 Pod 定義,在 spec.volumes[] 下增加一個卷。可以給這個卷隨意命名, 它的spec.volumes[].secret.secretName 必須是 Secret 對象的名字。
- 將 spec.containers[].volumeMounts[] 加到需要用到該 Secret 的容器中。 指定 spec.containers[].volumeMounts[].readOnly = true 和spec.containers[].volumeMounts[].mountPath 為你想要該 Secret 出現的尚未使用的目錄。
- 修改你的鏡像并且/或者命令行,讓程序從該目錄下尋找文件。 Secret 的 data 映射中的每一個鍵都對應 mountPath 下的一個文件名。
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: mypod
image: redis
volumeMounts:
- name: foo
mountPath: "/etc/foo"
readOnly: true
volumes:
- name: foo
secret:
secretName: mysecret
將 Secret 鍵名映射到特定路徑
你可以使用 spec.volumes[].secret.items 字段修改每個鍵對應的目標路徑:
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: mypod
image: redis
volumeMounts:
- name: foo
mountPath: "/etc/foo"
readOnly: true
volumes:
- name: foo
secret:
secretName: mysecret
items:
- key: username
path: my-group/my-username
將會發生什么呢:
username Secret 存儲在 /etc/foo/my-group/my-username 文件中而不是
/etc/foo/username 中。
password Secret 沒有被映射
Secret 文件權限
你還可以指定 Secret 將擁有的權限模式位。如果不指定,默認使用 0644
示例:
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: mypod
image: redis
volumeMounts:
- name: foo
mountPath: "/etc/foo"
volumes:
- name: foo
secret:
secretName: mysecret
defaultMode: 256
之后,Secret 將被掛載到 /etc/foo 目錄,而所有通過該 Secret 卷掛載 所創建的文件的權限都是 0400。
你還可以使用映射,如上一個示例,并為不同的文件指定不同的權限,如下所示:
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: mypod
image: redis
volumeMounts:
- name: foo
mountPath: "/etc/foo"
volumes:
- name: foo
secret:
secretName: mysecret
items:
- key: username
path: my-group/my-username
mode: 511
在這里,位于 /etc/foo/my-group/my-username 的文件的權限值為 0777。 由于 JSON 限制,必須以十進制格式指定模式,即 511。
掛載的 Secret 會被自動更新
當已經存儲于卷中被使用的 Secret 被更新時,被映射的鍵也將終將被更新。 組件 kubelet 在周期性同步時檢查被掛載的 Secret 是不是最新的。 但是,它會使用其本地緩存的數值作為 Secret 的當前值。
通過將 Secret 標記為不可變來關閉 kube-apiserver 對其的監視,從而顯著降低 kube-apiserver 的負載,提升集群性能。
使用這個特性需要啟用 ImmutableEmphemeralVolumes 特性開關 并將 Secret 或 ConfigMap 的 immutable 字段設置為 true. 例如:
apiVersion: v1
kind: Secret
metadata:
...
data:
...
immutable: true
說明: 一旦一個 Secret 或 ConfigMap 被標記為不可變,撤銷此操作或者更改 data 字段的內容都是 不可能的。 只能刪除并重新創建這個 Secret。現有的 Pod 將維持對已刪除 Secret 的掛載點 - 建議重新創建這些 Pod。
以環境變量的形式使用 Secrets
將 Secret 作為 Pod 中的環境變量使用:
- 創建一個 Secret 或者使用一個已存在的 Secret。多個 Pod 可以引用同一個 Secret。
- 修改 Pod 定義,為每個要使用 Secret 的容器添加對應 Secret 鍵的環境變量。 使用 Secret 鍵的環境變量應在 env[x].valueFrom.secretKeyRef 中指定 要包含的 Secret 名稱和鍵名。
- 更改鏡像并/或者命令行,以便程序在指定的環境變量中查找值。
apiVersion: v1
kind: Pod
metadata:
name: secret-env-pod
spec:
containers:
- name: mycontainer
image: redis
env:
- name: SECRET_USERNAME
valueFrom:
secretKeyRef:
name: mysecret
key: username
- name: SECRET_PASSWORD
valueFrom:
secretKeyRef:
name: mysecret
key: password
restartPolicy: Never
echo $SECRET_USERNAME
輸出類似于:
admin
echo $SECRET_PASSWORD
輸出類似于:
1f2d1e2e67df
原文鏈接:https://lion-wu.blog.csdn.net/article/details/125984225
- 上一篇:git-lfs 離線安裝
- 下一篇:ansible-playbook 可用參數
相關推薦
- 2022-05-01 sql時間段切分實現每隔x分鐘出一份高速門架車流量_MsSql
- 2022-12-06 C++如何將字符串顛倒輸出_C 語言
- 2022-05-10 bean作用域 設置創建bean是單實例還是多實例
- 2023-10-30 配置阿里的yum源
- 2022-08-21 python深度學習tensorflow安裝調試教程_python
- 2022-04-19 Python的進程間通信詳解_python
- 2021-11-27 nginx中的兩個模塊的proxy_pass的區別解析_nginx
- 2022-10-31 Python實現將DNA序列存儲為tfr文件并讀取流程介紹_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支