文章目录
- Secret简介
- secret的创建
- 作为存储卷注入到pod上,由容器应用程序所使用
- 用文件创建
- 编写一个 secret 对象
- 将secret挂载在volume中
- 向指定路径映射 secret 密钥
- 将Secret设置为环境变量
- kubernetes.io/dockerconfigjson用于存储docker registry的认证信息
Secret简介
Secret资源的功能类似于ConfigMap,但它专用于存放敏感数据,如密码、数字证书、私钥、令牌和ssh key等。
敏感信息放在 secret 中比放在 Pod 的定义或者容器镜像中来说更加安全和灵活。
Secret对象存储数据以键值方式存储数据,再pod资源中通过环境变量或存储卷进行数据访问。
Secret对象仅会被分发至调用了此对象的pod资源所在的工作节点,且只能由节点将其存储于内存中。
另外,Secret对象的数据的存储及打印格式为base64编码的字符串,因此用户在创建对象时也要提供此种编码格式的数据。
不过,在容器中以环境变量或存储卷的方式访问时,他们会被自动解码为明文格式。
在master节点上,Secret对象以非加密的格式存储于etcd中,因此管理员必须加以精心管控以确保敏感数据的机密性,必须确保etcd集群节点间以及与APIserver的安全通信,etcd服务的访问授权,还包括用户访问APIServer时的授权,因为拥有创建pod资源的用户都可以使用Secret资源并能够通过pod中的容器访问其数据。
Secret对象主要有两种用途
一是作为存储卷注入到pod上,由容器应用程序所使用,
二是用于kubelet为pod里的容器拉取镜像时向私有仓库提供认证信息。
Secret资源主要有四种类型组成:
1、Opaque:自定义数据内容;base64编码,用来存储密码、密钥、信息、证书
等数据,类型标识符为generic
2、kubernetes.io/service-account-token:ServiceAccount的认证信息,可在创建service account时由kubernetes自动创建
3、kubernetes.io/dockerconfigjson: 用来存储Docker镜像仓库的认证信息,
类型标识符为docker-registry
4、kubernetes.io/tls:用于为ssl通信模式存储证书和私钥文件,
命令式创建时类型标识符为tls。
Pod 可以用两种方式使用 secret:
作为 volume 中的文件被挂载到 pod 中的一个或者多个容器里。
当 kubelet 为 pod 拉取镜像时使用
secret的创建
serviceaccout 创建时 Kubernetes 会默认创建对应的 secret。对应的 secret 会自动挂载到 Pod 的 /run/secrets/kubernetes.io/serviceaccount
目录中。
$ kubectl run nginx --image=nginx
$ kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-6db489d4b7-886wq 1/1 Running 0 4s
$ kubectl exec nginx-6db489d4b7-886wq ls /var/run/secrets/kubernetes.io/serviceaccount
ca.crt
namespace
token
每个namespace下有一个名为default的默认的ServiceAccount对象
$ kubectl get Secret
NAME TYPE DATA AGE
default-token-mmkdj kubernetes.io/service-account-token 3 8d
ServiceAccount里有一个名为Tokens的可以作为Volume一样被Mount到
Pod里的Secret,当Pod启动时这个Secret会被自动Mount到Pod的指定目录下,
用来协助完成Pod中的进程访问API Server时的身份鉴权过程。
$ kubectl get pod -o yaml
1.
作为存储卷注入到pod上,由容器应用程序所使用
用文件创建
Opaque Secret 其value为base64编码后的值。
从文件中创建Secret
$ echo -n 'admin' > ./username.txt
$ echo -n 'westos' > ./password.txt
$ kubectl create secret generic db-user-pass --from-
file=./username.txt --from-file=./password.txt
secret/db-user-pass created
$ kubectl get secrets
NAME TYPE DATA AGE
db-user-pass Opaque 2 5s
如果密码具有特殊字符,则需要使用 \ 字符对其进行转义,执行以下命令:
$ kubectl create secret generic dev-db-secret --from-literal=username=devuser --from-literal=password=S\!B\\*d\$zDsb
3.
编写一个 secret 对象
解码测试
$ echo -n 'admin' | base64
YWRtaW4=
$ echo -n 'westos' | base64
d2VzdG9z
$ vim mysecret.yaml
apiVersion: v1
kind: Secret
metadata:
name: mysecret
type: Opaque
data:
username: YWRtaW4=
password: d2VzdG9z
$ kubectl create -f secret1.yaml
secret/mysecret created
1.
将secret挂载在volume中
将Secret挂载到Volume中
apiVersion: v1
kind: Pod
metadata:
name: mysecret
spec:
containers:
- name: nginx
image: nginx
volumeMounts:
- name: secrets
mountPath: "/secret"
readOnly: true
volumes:
- name: secrets
secret:
secretName: mysecret
$ kubectl exec mysecret cat /secret/password
westos
1.
向指定路径映射 secret 密钥
apiVersion: v1
kind: Pod
metadata:
name: mysecret
spec:
containers:
- name: nginx
image: nginx
volumeMounts:
- name: secrets
mountPath: "/secret"
readOnly: true
volumes:
- name: secrets
secret:
secretName: mysecret
items:
- key: username
path: my-group/my-username
$ kubectl exec mysecret cat /secret/my-group/my-username
admin
1.
将Secret设置为环境变量
apiVersion: v1
kind: Pod
metadata:
name: secret-env
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
1.
kubernetes.io/dockerconfigjson用于存储docker registry的认证信息
imagePullSecret资源可用于辅助kubelet从需要认证的私有镜像仓库获取镜像,它通过将secret提供的密码传递给kubelet从而在拉取镜像前完成必要的认证过程。
使用imagePullSecret的方式有两种:一是创建docker-registry类型的secret对象,并在定义pod资源时明确通过imagePullSecret字段给出
另一个是创建docker-registry类型的secret对象,将其添加到某特定的serviceaccount对象中,那些使用该serviceaccount资源创建的pod对象,以及默认使用该serviceaccount的pod对象都将会直接使imagePullSecret中的认证信息。
$ kubectl create secret docker-registry myregistrykey --docker-server=reg.westos.org --docker-username=admin --docker-password=westos --docker-email=yx@westos.org
secret/myregistrykey created
$ vim mypod.yaml
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: game2048
image: reg.westos.org/westos/game2048
imagePullSecrets:
- name: myregistrykey
$ kubectl create -f mypod.yaml
pod/mypod created
1.将自己的harbor仓库设置为私有
2.为私有仓库添加yx用户
测试当没有登录,且没有授权时
将用户授权