Secret 存在意义
Secret 解决了密码、token、密钥等敏感数据的配置问题,而不需要把这些敏感数据暴露到镜像或者 Pod Spec中。
Secret 可以以 Volume 或者环境变量的方式使用.
(环境变量无法感知 secret 和 configmap 的更新 )
Secret 有三种类型
Service Account:用来访问Kubernetes API,由Kubernetes自动创建,并且会自动挂载到Pod的/run/secrets/kubernetes.io/serviceaccount目录中Opaque:base64编码格式的Secret,用来存储密码、密钥等 # 也可用别的加密方式kubernetes.io/dockerconfigjson:用来存储私有docker registry的认证信息 (也是用base64加密)
secret 可选参数有三种:
- generic: 通用类型,通常用于存储密码数据。
- tls:此类型仅用于存储私钥和证书。
- docker-registry: 若要保存 docker 仓库的认证信息的话,就必须使用此种类型来创建。
Service Account
Service Account 用来访问 Kubernetes API,由 Kubernetes 自动创建,并且会自动挂载到 Pod 的 /run/secrets/kubernetes.io/serviceaccount 目录中
示例1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30[root@k8s01 storage]# kubectl run nginx --image nginx:1.7.9
pod/nginx created
[root@k8s01 storage]# kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx 1/1 Running 0 14s
[root@k8s01 storage]# kubectl exec nginx -it -- ls /run/secrets/kubernetes.io/serviceaccount
ca.crt namespace token
[root@k8s01 storage]# kubectl exec nginx -it -- cat /run/secrets/kubernetes.io/serviceaccount/ca.crt
-----BEGIN CERTIFICATE-----
MIICyDCCAbCgAwIBAgIBADANBgkqhkiG9w0BAQsFADAVMRMwEQYDVQQDEwprdWJl
cm5ldGVzMB4XDTIwMDcyNzE3MzQxNFoXDTMwMDcyNTE3MzQxNFowFTETMBEGA1UE
AxMKa3ViZXJuZXRlczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMOG
z5wpcDPU642BeC/fj6IHUatrxJIu0xyvhXfK9NAA6qKenl0qiiKIWD2grSg6X8le
d0CRJuslM+WGnq6d68G6NMZ3/MDpPwgXM0k4MttYyfo3mngBmtvEbFryoKoeulkq
VSszYmNozsffjniH+tAEp7yitM5U0YrrnQFGozpiz2mQ+2RTvIBG0YOrQ1xjTnDW
VSk+zqsNwpsCR18ebd1rrewatW0QZxOs1yGjNmNv+4lXodHLPKwUUewHRNnZn3vS
jTf1cz77F0RHtel6bmZ8uhQ+SzpL6lT3/eykJvtGrIEpp1Vg2AfHU9Hc6IP3WYMl
MG88R8kjgjRaAMz8khMCAwEAAaMjMCEwDgYDVR0PAQH/BAQDAgKkMA8GA1UdEwEB
/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBALi84N2GXQ6Qs3X3SKHfBumNJzb1
sK38r0+w34r+Gzlr+kRictSyv/wTc8KUHTUGXaGCRyrZOWmreDhA7ilRNN6OzRCp
TgaI9bSWbgVbszroXPg12arri+ixytW1iZAZj0FIqi8v0oyIH6YIAS+U5d8npAy9
FyWBnzfg0StMjyLmh5f3pUQoxWNWRy5YOYGWZSsAhqBD3dNg+2Uor69Q0fmyJC1y
rZlsUDYl4A70KWKNXfTtiRs6JfB3N9haWxmnkliC7sJ8A6bjAhgrVJYpEBThNdik
hLeJhX8fCW/EyGeYNc3qPbrzza++sIZ5acSKKsX4I/vbhaqhVI/LYb9Imc4=
-----END CERTIFICATE-----
[root@k8s01 storage]# kubectl exec nginx -it -- cat /run/secrets/kubernetes.io/serviceaccount/token
eyJhbGciOiJSUzI1NiIsImtpZCI6InZoTHNXRWwtZWU0NmswNnNvV3c0YWlyYVpZLUNaWm9sMWY5OGhzSkxveFUifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJkZWZhdWx0Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZWNyZXQubmFtZSI6ImRlZmF1bHQtdG9rZW4tcnI3N2MiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiZGVmYXVsdCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6ImNjNzUwZGVjLTY4ZTYtNDcxYi1hMmVmLWZhZjFiMDYxYzFhZCIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDpkZWZhdWx0OmRlZmF1bHQifQ.UJYnr8KaB59ZF0wefTnh-3W3b20ftBBSw-46ghkl20aWVeK7pFxwjlcCWgp_3dG2jHn9dHtWa1DTemr05rpse0Xu_C029sJ4NlYSIwfR3lZ_K3lOuei6svAg2Aal_M5F8RdlcAvVvHn6TDEEH1VViM1-0uYQNF3p88vCKVFAkbRxQj6b-viAXeF1rlmLSgcB3qpU_xpKtFTqTJ6VvMQEw90eC2RwIxNhQgZPnNaeQsanoOlPC9DRkLPeA_ZYdys-e1_me3Gm5NeYsCBAbyfofufQ3BLMkXw0bfpiWK4VesfX-9Z7p1t3tKxYCZrsLIuSuj-O7Sc5qef89lwxYvcfKw
[root@k8s01 storage]# kubectl exec nginx -it -- cat /run/secrets/kubernetes.io/serviceaccount/namespace
default
Opaque Secret
创建说明Opaque 类型的数据是一个 map 类型,要求 value 是 base64 编码格式:
1 | [root@k8s01 storage]# echo -n "admin" | base64 # 加密,并不牢靠 |
secrets.yaml1
2
3
4
5
6
7
8apiVersion: v1
kind: Secret
metadata:
name: mysecret
type: Opaque
data:
password: cGFzc3dvcmQ=
username: YWRtaW4=
1 | [root@k8s01 storage]# kubectl apply -f secrets.yaml |
补: 也可以使用 stringData, 避免 手动 使用 base64 加密
1 | apiVersion: v1 |
使用方式
- 将
Secret挂载到Volume中
Secret-Volume.yaml1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18apiVersion: v1
kind: Pod
metadata:
labels:
name: seret-test
name: seret-test
spec:
volumes:
- name: secrets
secret:
secretName: mysecret
containers:
- image: nginx:1.7.9
name: db
volumeMounts:
- name: secrets
mountPath: "/etc/secrets"
readOnly: true
1 | [root@k8s01 storage]# kubectl apply -f Secret-Volume.yaml |
- 将
Secret导出到环境变量中
test-secert-deployment.yaml1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30apiVersion: apps/v1
kind: Deployment
metadata:
name: pod-deployment
spec:
replicas: 2
selector:
matchLabels:
app: pod-deployment
template:
metadata:
labels:
app: pod-deployment
spec:
containers:
- name: pod-1
image: nginx:1.7.9
ports:
- containerPort: 80
env:
- name: TEST_USER
valueFrom:
secretKeyRef:
name: mysecret
key: username
- name: TEST_PASSWORD
valueFrom:
secretKeyRef:
name: mysecret
key: password
1 | [root@k8s01 storage]# kubectl apply -f test-secert-deplyment.yaml |
kubernetes.io/dockerconfigjson
1 | [root@k8s01 storage]# docker pull imwl/test:0.14 # 我自己的私有镜像 不登录 pull 失败 |
使用
Kuberctl创建docker registry认证的secret1
2
3kubectl create secret docker-registry myregistrykey --docker-server=DOCKER_REGISTRY_SERVER --docker-username=DOCKER_USER --docker-password=DOCKER_PASSWORD --docker-email=DOCKER_EMAIL
secret "myregistrykey" created.在创建
Pod的时候,通过imagePullSecrets来引用刚创建的myregistrykey
pod-dockerconfigjson.yaml1
2
3
4
5
6
7
8
9
10apiVersion: v1
kind: Pod
metadata:
name: foo
spec:
containers:
- name: foo
image: imwl/test:0.14
imagePullSecrets:
- name: myregistrykey
- 查看信息
1
2
3
4
5
6
7
8
9
10
11[root@k8s01 storage]# kubectl create secret docker-registry myregistrykey --docker-username=imwl --docker-password=********** [email protected]
secret/myregistrykey created
[root@k8s01 storage]# ls
configMap secrets.yaml special-config.yaml test-pod02.yaml test-pod.yaml
env-config.yaml Secret-Volume.yaml test04.yaml test-pod03.yaml test-secert-deplyment.yaml
[root@k8s01 storage]# vi pod-dockerconfigjson.yaml
[root@k8s01 storage]# kubectl apply -f pod-dockerconfigjson.yaml
pod/foo created
[root@k8s01 storage]# kubectl get pod # 可以看到镜像已被下载
NAME READY STATUS RESTARTS AGE
foo 0/1 Completed 2 79s