Secret 存在意义
Secret 解决了密码、token、密钥等敏感数据的配置问题,而不需要把这些敏感数据暴露到镜像或者 Pod Spec中。Secret 可以以 Volume 或者环境变量的方式使用
Secret 有三种类型:
Service Account :用来访问 Kubernetes API,由 Kubernetes 自动创建,并且会自动挂载到 Pod 的/run/secrets/kubernetes.io/serviceaccount 目录中
Opaque :base64编码格式的Secret,用来存储密码、密钥等
kubernetes.io/dockerconfigjson :用来存储私有 docker registry 的认证信息
Service Account
Service Account 用来访问 Kubernetes API,由 Kubernetes 自动创建,并且会自动挂载到 Pod的/run/secrets/kubernetes.io/serviceaccount 目录中
[root@k8s-master01 ~]# kubectl run nginx --image nginx
[root@k8s-master01 ~]# kubectl exec nginx-7bb7cd8db5-w8gfr -it -- /bin/sh
# cd /run/secrets/kubernetes.io/serviceaccount
# ls
ca.crt namespace token
Opaque Secret
创建说明
Opaque 类型的数据是一个 map 类型,要求 value 是 base64 编码格式:
[root@k8s-master01 ~]# echo -n "admin" | base64
YWRtaW4=
[root@k8s-master01 ~]# echo -n "1f2d1e2e67df" | base64
MWYyZDFlMmU2N2Rm
[root@k8s-master01 ~]# base64 --help
Usage: base64 [OPTION]... [FILE]
Base64 encode or decode FILE, or standard input, to standard output.
Mandatory arguments to long options are mandatory for short options too.
-d, --decode 解码数据
-i, --ignore-garbag 解码时忽略非字母字符
-w, --wrap=字符数 在指定的字符数后自动换行(默认为76),0 为禁用自动换行
--help 显示此帮助信息并退出
--version 显示版本信息并退出
如果没有指定文件,或者文件为"-",则从标准输入读取。
数据以 RFC 3548 规定的 Base64 字母格式进行编码。 解码时,输入数据(加密流)可能包含一些非有效 Base64 字符的新行字符。可以尝试用 --ignore-garbage 选项来恢复加密流中任何非 base64 字符。
GNU coreutils online help: http://www.gnu.org/software/coreutils/
请向http://translationproject.org/team/zh_CN.html 报告base64 的翻译错误
要获取完整文档,请运行:info coreutils ‘base64 invocation’
apiVersion: v1
kind: Secret
metadata:
name: mysecret
type: Opaque
data:
password: MWYyZDFlMmU2N2Rm
username: YWRtaW4=
[root@k8s-master01 ~]# kubectl apply -f secret.yaml
secret/mysecret created
[root@k8s-master01 ~]# kubectl get secret
NAME TYPE DATA AGE
default-token-l2627 kubernetes.io/service-account-token 3 7h24m
mysecret Opaque 2 29s
、使用方式
1、将 Secret 挂载到 Volume 中
apiVersion: v1
kind: Pod
metadata:
labels:
name: seret-test
name: seret-test
spec:
volumes:
- name: secrets
secret:
secretName: mysecret
containers:
- image: at.harbor.com/library/nginx:v1
name: db
volumeMounts:
- name: secrets
mountPath: "/etc/secrets"
readOnly: true
[root@k8s-master01 ~]# kubectl apply -f seret.yaml
[root@k8s-master01 ~]# kubectl get pod
seret-test 1/1 Running 0 16s
[root@k8s-master01 ~]# kubectl exec seret-test -it -- /bin/sh
/ # cd /etc/secrets
/etc/secrets # ls
password username
/etc/secrets # cat username
admin/etc/secrets #
将 Secret 导出到环境变量中
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: pod-deployment
spec:
replicas: 2
template:
metadata:
labels:
app: pod-deployment
spec:
containers:
- name: pod-1
image: at.harbor.com/library/nginx:v1
ports:
- containerPort: 80
env:
- name: TEST_USER
valueFrom:
secretKeyRef:
name: mysecret
key: username
- name: TEST_PASSWORD
valueFrom:
secretKeyRef:
name: mysecret
key: password
[root@k8s-master01 ~]# kubectl apply -f servt.yaml
deployment.extensions/pod-deployment created
[root@k8s-master01 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
pod-deployment-8965575c6-d9bxs 1/1 Running 0 25s
pod-deployment-8965575c6-nfcp6 1/1 Running 0 25s
[root@k8s-master01 ~]# kubectl exec pod-deployment-8965575c6-d9bxs -it -- /bin/sh
/ # echo $TEST_USER
admin
/ # echo $TEST_PASSWORD
1f2d1e2e67df
/ #
要想实验的准确性,把每个节点的镜像删除,把仓库设置为私有仓库。

退出
[root@k8s-master01 ~]# docker logout at.harbor.com/
Removing login credentials for at.harbor.com
尝试下载镜像
[root@k8s-master01 ~]# docker pull at.harbor.com/library/nginx:v1
Error response from daemon: pull access denied for at.harbor.com/library/nginx, rep
开始创建一个pod
在创建 Pod 的时候,通过 imagePullSecrets 来引用刚创建的 myregistrykey
apiVersion: v1
kind: Pod
metadata:
name: foo
spec:
containers:
- name: foo
image: at.harbor.com/library/nginx:v1
#引用认证
imagePullSecrets:
- name: myregistrykey
[root@k8s-master01 ~]# kubectl create -f pod.yaml
pod/foo created
[root@k8s-master01 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
foo 0/1 ImagePullBackOff 0 20s
[root@k8s-master01 ~]# kubectl describe pod foo
....
error: code = Unknown desc = Error response from daemon: pull access denied for at.harbor.com/library/nginx, repository does not exist or may require 'docker login': denied: requested access to the resource is denied
Warning Failed 35s (x4 over 2m1s) kubelet, k8s-node01 Error: ErrImagePull
Warning Failed 12s (x6 over 2m) kubelet, k8s-node01 Error: ImagePullBackOff
Normal BackOff 0s (x7 over 2m) kubelet, k8s-node01 Back-off pulling image "at.harbor.com/library/nginx:v1"
下载镜像失败
必须要认证之后才能下载
使用 Kuberctl 创建 docker registry 认证的 secret
[root@k8s-master01 ~]# kubectl create secret docker-registry myregistrykey --docker-server=at.harbor.com --docker-username=admin --docker-password=Harbor12345 --docker-email=admin@example.com
secret/myregistrykey created
docker-server:私有仓库地址
docker-username:用户名
docker-password:密码
docker-email:邮箱
重新创建pod
[root@k8s-master01 ~]# kubectl delete pod --all
[root@k8s-master01 ~]# kubectl create -f pod.yaml
pod/foo created
[root@k8s-master01 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
foo 1/1 Running 0 7s
认证成功
1517

被折叠的 条评论
为什么被折叠?



