文章目錄
secret 安全配置參數
configmap 配置文件參數
一:secret概述
加密數據並存放在etcd中,讓pod的容器以掛載volume方式訪問
應用場景:憑據,身份令牌
官方文檔:https://kubernetes.io/docs/concepts/configuration/secret/
Secret
對象類型用來保存敏感信息,例如密碼、OAuth 令牌和 ssh key。 將這些信息放在 secret
中比放在 Pod 的定義或者 容器鏡像 中來說更加安全和靈活
Secret 是一種包含少量敏感信息例如密碼、token 或 key 的對象。這樣的信息可能會被放在 Pod spec 中或者鏡像中;將其放在一個 secret 對象中可以更好地控制它的用途,並降低意外暴露的風險。
1.1 創建secret的方法
用戶可以創建 secret,同時系統也創建了一些 secret。
- 內置secret
Service Account 使用 API 憑證自動創建和附加 secret
Kubernetes 自動創建包含訪問 API 憑據的 secret,並自動修改您的 pod 以使用此類型的 secret。這樣可以安全地訪問apiserver
- 創建您自己的sercet
使用 kubectl 創建 Secret
比如有些pod需要訪問數據庫,這些pod需要使用的用戶名和密碼可以放到本地宿主機的文件裏
資源參數寫入到etcd中
如果有多個pod資源,都可以與一個secret建立關係
1.2 使用secret的方法
要使用 secret,pod 需要引用 secret。
- Pod 可以用兩種方式使用 secret:
作爲 volume 中的文件被掛載到 pod 中的一個或者多個容器裏;
當 kubelet 爲 pod 拉取鏡像時使用。
二:創建Secret
2.1 基於文件創建
[root@master1 ~]# kubectl create secret --help
Create a secret using specified subcommand.
Available Commands:
docker-registry 創建一個用於Docker註冊表的祕密
generic 從本地文件、目錄或文字值創建一個祕密
tls 創建一個TLS祕密
Usage:
kubectl create secret [flags] [options]
Use "kubectl <command> --help" for more information about a given command.
Use "kubectl options" for a list of global command-line options (applies to all commands).
-n 轉行符
注意: 特殊字符(例如 $
, \*
和 !
)需要轉義。 如果您使用的密碼具有特殊字符,則需要使用 \\
字符對其進行轉義。 例如,如果您的實際密碼是 S!B\*d$zDsb
,則應通過以下方式執行命令: kubectl create secret generic dev-db-secret --from-literal=username=devuser --from-literal=password=S\!B\\*d\$zDsb 您無需從文件中轉義密碼中的特殊字符( --from-file
)。
[root@master1 ~]# echo -n 'gsy' > /root/username.txt
[root@master1 ~]# echo -n 'gsy123' > /root/password.txt
[root@master1 ~]# kubectl create secret generic db-user-pass --from-file=/root/username.txt --from-file=/root/password.txt
secret/db-user-pass created
[root@master1 ~]# kubectl get secret
NAME TYPE DATA AGE
db-user-pass Opaque 2 10s
default-token-qm9rm kubernetes.io/service-account-token 3 17d
[root@master1 ~]# kubectl describe secret db-user-pass
Name: db-user-pass
Namespace: default
Labels: <none>
Annotations: <none>
Type: Opaque
Data
====
password.txt: 6 bytes
username.txt: 3 bytes
2.2 基於參數手動創建
參數首先要進行base64編碼
[root@master1 ~]# echo -n 'gsy' | base64
Z3N5
[root@master1 ~]# echo -n 'gsy123' | base64
Z3N5MTIz
2.2.1 編輯yaml文件
[root@master1 ~]# vim secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: mysecret
type: Opaque
data:
username: Z3N5
password: Z3N5MTIz
[root@master1 ~]# kubectl create -f secret.yaml
secret/mysecret created
[root@master1 ~]# kubectl get secret
NAME TYPE DATA AGE
db-user-pass Opaque 2 15m
default-token-qm9rm kubernetes.io/service-account-token 3 17d
mysecret Opaque 2 4s
[root@master1 ~]# kubectl describe secret mysecret
Name: mysecret
Namespace: default
Labels: <none>
Annotations: <none>
Type: Opaque
Data
====
password: 6 bytes
username: 3 bytes
2.3 總結
第一種,使用參數文件,使用secret中的變量導入到pod中
[root@master1 ~]# kubectl get secret mysecret -o yaml
apiVersion: v1
data:
password: Z3N5MTIz
username: Z3N5
kind: Secret
metadata:
creationTimestamp: 2020-05-17T07:02:12Z
name: mysecret
namespace: default
resourceVersion: "1022741"
selfLink: /api/v1/namespaces/default/secrets/mysecret
uid: 55036ebf-980c-11ea-a668-000c29db840b
type: Opaque
注意:通過對內容進行序列化後,生成一個後綴作爲 Secrets 的名稱。這樣可以確保每次修改內容時都會生成一個新的 Secret。
備註:解碼方法
[root@master1 ~]# echo 'Z3N5' | base64 --decode
gsy[root@master1 ~]#
三:使用secret
-
Secret 可以作爲數據卷被掛載,
-
或作爲環境變量 暴露出來以供 pod 中的容器使用。
它們也可以被系統的其他部分使用,而不直接暴露在 pod 內。 例如,它們可以保存憑據,系統的其他部分應該用它來代表您與外部系統進行交互。
3.1 作爲環境變量暴露出來
key: username賦值給SECRET_USERNAME
key: password 賦值給SECRET_PASSWORD
gsy[root@master1 ~]# vim secret-env.yaml
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: nginx
image: nginx
env:
- name: SECRET_USERNAME
valueFrom:
secretKeyRef:
name: mysecret
key: username
- name: SECRET_PASSWORD
valueFrom:
secretKeyRef:
name: mysecret
key: password
- exec進入測試env
[root@master1 ~]# kubectl apply -f secret-env.yaml
pod/mypod created
[root@master1 ~]# kubectl get pods -w
NAME READY STATUS RESTARTS AGE
dns-test 1/1 Running 0 4h16m
mypod 1/1 Running 0 9s
[root@master1 ~]# kubectl exec -it mypod bash
root@mypod:/# echo $SECRET_USERNAME
gsy
root@mypod:/# echo $SECRET_PASSWORD
gsy123
root@mypod:/# exit
exit
3.2 以volume的形式掛載到pod的某個目錄下
[root@master1 ~]# vim secret-volume.yaml
apiVersion: v1
kind: Pod
metadata:
name: mypod-1
spec:
containers:
- name: nginx
image: nginx
volumeMounts:
- name: foo
mountPath: "/etc/foo" #容器內掛載路徑
readOnly: true
volumes:
- name: foo
secret:
secretName: mysecret
[root@master1 ~]# kubectl create -f secret-volume.yaml
pod/mypod-1 created
[root@master1 ~]# kubectl exec -it mypod-1 bash
root@mypod-1:/# cd /etc/foo
root@mypod-1:/etc/foo# ls
password username
root@mypod-1:/etc/foo# cat password
gsy123root@mypod-1:/etc/foo# cat username
gsyroot@mypod-1:/etc/foo# ll
bash: ll: command not found
root@mypod-1:/etc/foo# ls -l
total 0
lrwxrwxrwx. 1 root root 15 May 17 07:24 password -> ..data/password
lrwxrwxrwx. 1 root root 15 May 17 07:24 username -> ..data/username
四:configmap
與secret類似,區別在於configmap保存的是不需要加密配置的信息
應用場景:應用配置
4.1 創建方式
-
kubectl、編寫yaml文件
-
變量參數形式
4.2 使用kubectl創建
[root@master1 ~]# vim redis.txt
redis.host=127.0.0.1
redis.port=6379
redis.password=123456
常見configmap資源
[root@master1 ~]# kubectl create configmap redis-config --from-file=redis.txt
configmap/redis-config created
查看資源
[root@master1 ~]# kubectl get configmap
NAME DATA AGE
redis-config 1 30s
查看描述信息
configmap可以簡寫成cm
[root@master1 ~]# kubectl describe configmap redis-config
Name: redis-config
Namespace: default
Labels: <none>
Annotations: <none>
Data
====
redis.txt:
----
redis.host=127.0.0.1
redis.port=6379
redis.password=123456
Events: <none>
configmap的這種方式是鬆耦合處理,這種處理方式可以減輕運維壓力
簡化分工
4.3 創建yaml文件
[root@master1 ~]# vim cm.yaml
apiVersion: v1
kind: Pod
metadata:
name: mypod-cm
spec:
containers:
- name: busybox
image: busybox
command: [ "/bin/sh","-c","cat /etc/config/redis.txt" ]
volumeMounts:
- name: config-volume
mountPath: /etc/config
volumes:
- name: config-volume
configMap:
name: redis-config
restartPolicy: Never
[root@master1 ~]# kubectl apply -f cm.yaml
pod/mypod-cm created
[root@master1 ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
dns-test 1/1 Running 0 4h57m
mypod 1/1 Running 0 41m
mypod-1 1/1 Running 0 32m
mypod-cm 0/1 ContainerCreating 0 14s
查看驗證結果
[root@master1 ~]# kubectl logs mypod-cm
redis.host=127.0.0.1
redis.port=6379
redis.password=123456
[root@master1 ~]#
4.4 使用變量參數形式
創建configmap資源
[root@master1 ~]# vim myconfig.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: myconfig
namespace: default
data:
special.level: info
special.type: hello
[root@master1 ~]# kubectl create -f myconfig.yaml
configmap/myconfig created
[root@master1 ~]# kubectl get cm
NAME DATA AGE
myconfig 2 19s
redis-config 1 23m
創建測試pod,測試pod中輸出configmap變量參數
[root@master1 ~]# vim ceshicmpod.yaml
apiVersion: v1
kind: Pod
metadata:
name: ceshicmpod
spec:
containers:
- name: busybox
image: busybox
command: [ "/bin/sh", "-c", "echo $(LEVEL) $(TYPE)" ]
env:
- name: LEVEL
valueFrom:
configMapKeyRef:
name: myconfig
key: special.level
- name: TYPE
valueFrom:
configMapKeyRef:
name: myconfig
key: special.type
restartPolicy: Never
[root@master1 ~]# kubectl apply -f ceshicmpod.yaml
pod/ceshicmpod created
查看變量輸出結果
[root@master1 ~]# kubectl logs ceshicmpod
info hello