文章目錄
- 一、Secret
-
- 1.1 變量形式挂載到Pod
- 1.2 資料卷形式挂載
- 二、ConfigMap
-
- 2.1 建立配置檔案
- 2.2 建立ConfigMap
- 2.3 Volume資料卷形式挂載
- 2.4 以變量的形式挂載Pod
一、Secret
Secret的主要作用就是加密資料,然後存在etcd裡面,讓Pod容器以挂載Volume方式進行通路
Secret 解決了密碼、token、密鑰等敏感資料的配置問題,而不需要把這些敏感資料暴露 到鏡像或者 Pod Spec 中。Secret 可以以 Volume 或者環境變量的方式使用
場景:使用者名 和 密碼進行加密
一般場景的是對某個字元串進行base64編碼 進行加密
[[email protected] ~]$ echo -n 'admin' | base64
YWRtaW4=
Secret 有三種類型
- Service Account :用來通路 Kubernetes API,由 Kubernetes 自動建立,并且會自動挂 載到 Pod 的 /run/secrets/kubernetes.io/serviceaccount 目錄中
- Opaque : base64 編碼格式的 Secret,用來存儲密碼、密鑰等
- kubernetes.io/dockerconfigjson :用來存儲私有 docker registry 的認證資訊
1.1 變量形式挂載到Pod
建立secret加密資料的yaml檔案 secret.yaml
[[email protected] ~]$ cat > secret.yaml << EOF
apiVersion: v1
kind: Secret
metadata:
name: mysecret
type: Opaque
data:
username: YWRtaW4=
password: MWYyZDFlMmU2N2Rm
EOF
建立一個pod
[[email protected] ~]$ kubectl create -f secret.yaml
[[email protected] ~]$ kubectl get pods
[[email protected] ~]$ kubectl get secret
NAME TYPE DATA AGE
default-token-wqhjb kubernetes.io/service-account-token 3 27h
mysecret Opaque 2 7m36s
建立一個 secret-val.yaml 檔案
[[email protected] ~]$ cat > secret-val.yaml << EOF
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
EOF
[[email protected] ~]$ kubectl apply -f secret-val.yaml
NAME READY STATUS RESTARTS AGE
ds-test-ljb52 1/1 Running 0 85m
mypod 1/1 Running 0 15s
進入到容器内部
[[email protected] ~]$ kubectl exec -it mypod bash
然後就可以輸出值,這就是以變量的形式挂載到容器中
# 輸出使用者
[email protected]:/# echo $SECRET_USERNAME
admin
# 輸出密碼
[email protected]:/# echo $SECRET_PASSWORD
1f2d1e2e67df
要删除這個Pod,就可以使用這個指令
[[email protected] ~]$ kubectl delete -f secret-val.yaml
1.2 資料卷形式挂載
建立一個 secret-vol.yaml 檔案
[[email protected] ~]$ cat > secret-vol.yaml << EOF
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: nginx
image: nginx
volumeMounts: #挂載
- name: foo
mountPath: "/etc/foo"
readOnly: true
volumes:
- name: foo
secret:
secretName: mysecret
EOF
建立Pod
# 根據配置建立容器
[[email protected] ~]$ kubectl apply -f secret-vol.yaml
# 進入容器
[[email protected] ~]$ kubectl exec -it mypod bash
# 檢視
[email protected]:/# ls /etc/foo
password username
二、ConfigMap
ConfigMap作用是存儲不加密的資料到etcd中,讓Pod以變量或資料卷Volume挂載到容器中
應用場景:配置檔案
2.1 建立配置檔案
建立一個配置檔案 redis.properties
[[email protected] ~]$ kubectl delete Pod --all
[[email protected] ~]$ cat > redis.properties << EOF
redis.host=127.0.0.1
redis.port=6379
redis.password=123456
EOF
2.2 建立ConfigMap
[[email protected] ~]$ kubectl create configmap redis-config --from-file=redis.properties
檢視詳細資訊
[[email protected] ~]$ kubectl get cm
NAME DATA AGE
redis-config 1 7m8s
[[email protected] ~]$ kubectl describe cm redis-config
Name: redis-config
Namespace: default
Labels: <none>
Annotations: <none>
Data
====
redis.properties:
----
redis.host=127.0.0.1
redis.port=6379
redis.password=123456
Events: <none>
2.3 Volume資料卷形式挂載
建立一個 cm.yaml
[[email protected] ~]$ cat > cm.yaml << EOF
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: busybox
image: busybox
command: [ "/bin/sh","-c","cat /etc/config/redis.properties" ]
volumeMounts:
- name: config-volume
mountPath: /etc/config
volumes:
- name: config-volume
configMap:
name: redis-config
restartPolicy: Never
EOF
使用該yaml建立pod
# 建立
[[email protected] ~]$ kubectl apply -f cm.yaml
# 檢視
[[email protected] ~]$ kubectl get pods
NAME READY STATUS RESTARTS AGE
mypod 0/1 Completed 0 6m42s
最後通過指令就可以檢視結果輸出了
[[email protected] ~]$ kubectl logs mypod
redis.host=127.0.0.1
redis.port=6379
redis.password=123456
2.4 以變量的形式挂載Pod
建立一個myconfig.yaml檔案,聲明變量資訊,然後以configmap建立
[[email protected] ~]$ cat > myconfig.yaml << EOF
apiVersion: v1
kind: ConfigMap
metadata:
name: myconfig
namespace: default
data:
special.level: info
special.type: hello
EOF
建立配置檔案
# 建立pod
[[email protected] ~]$ kubectl apply -f myconfig.yaml
# 擷取
[[email protected] ~]$ kubectl get cm
建立完該pod後,我們就需要在建立一個 config-var.yaml 來使用我們的配置資訊
[[email protected] ~]$ cat > config-var.yaml << EOF
apiVersion: v1
kind: Pod
metadata:
name: mypod
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
EOF
檢視輸出
[[email protected] ~]$ kubectl logs mypod