1 secret概述
Secret对象存储数据以键值方式存储数据,在Pod资源中通过环境变量或存储卷进行数据访问。Secret对象仅会被分发至调用了此对象的Pod资源所在的工作节点,且只能由节点将其存储于内存中。Secret对象的数据的存储及打印格式为Base64编码的字符串,因此用户在创建Secret对象时也要提供此种编码格式的数据。
Secret对象主要有两种用途,一是作为存储卷注入到Pod上由容器应用程序所使用,二是用于kubelet为Pod里的容器拉取镜像时向私有仓库提供认证信息。使用ServiceAccount资源自建的Secret对象是一种更具安全性的方式。
Secret 对象类型用来保存敏感信息,例如密码、OAuth 令牌和 SSH 密钥。 将这些信息放在 secret 中比放在 Pod 的定义或者 容器镜像 中来说更加安全和灵活。
2 secret应用场景
- https证书
- secret存放docker registry认证信息
- 存放文件内容或者字符串,如用户名密码
3 Secret资源类型组成
Opaque:自定义数据内容;base64编码,用来存储密码、密钥、信息、证书等数据,类型标识符为generic。
kubernetes.io/service-account-token:Service Account的认证信息,可在创建Service Accout时由Kubernetes自动创建。
kubernetes.io/dockerconfigjson:用来存储Docker镜像仓库的认证信息,类型标识为docker-registry。
kubernetes.io/tls:用于为SSL通信模式存储证书和私钥文件,命令式创建时类型标识为tls。
4 Opaque类型Secret使用
Opaque类型Secret使用有两种使用方式,一种是挂载的方式,一种是变量引用的方式.
创建一个secret
kubectl create secret generic secrettest --from-literal=username=admin --from-literal=password=123456
[root@k8s-master01 ~]# kubectl get secret
NAME TYPE DATA AGE
default-token-zjprc kubernetes.io/service-account-token 3 96d
secrettest Opaque 2 9s
[root@k8s-master01 ~]# kubectl get secret secrettest -o yaml
apiVersion: v1
data:
password: MTIzNDU2
username: YWRtaW4=
kind: Secret
metadata:
creationTimestamp: "2021-03-17T09:10:26Z"
managedFields:
- apiVersion: v1
fieldsType: FieldsV1
fieldsV1:
f:data:
.: {}
f:password: {}
f:username: {}
f:type: {}
manager: kubectl
operation: Update
time: "2021-03-17T09:10:26Z"
name: secrettest
namespace: default
resourceVersion: "20530235"
selfLink: /api/v1/namespaces/default/secrets/secrettest
uid: 2129a658-85f5-4f4d-a547-f7dcbfb3a8a1
type: Opaque
通过对帐号密码使用base64编码可以看出 opaque是通过base64进行存储相关信息的.
[root@k8s-master01 ~]# echo -n "admin" |base64
YWRtaW4=
[root@k8s-master01 ~]# echo -n "123456" |base64
MTIzNDU2
a.将secret挂载到volume中
[root@k8s-master01 ~]# cat secretuse.yaml
apiVersion: v1
kind: Pod
metadata:
name: secretuse
spec:
volumes:
- name: secrets
secret:
secretName: secrettest
containers:
- name: nginx
image: nginx
volumeMounts:
- name: secrets
mountPath: "/etc/secrets"
readOnly: true
[root@k8s-master01 ~]# kubectl apply -f secretuse.yaml
pod/secretuse configured
验证
[root@k8s-master01 ~]# kubectl exec -it secretuse bash
root@secretuse:/etc/secrets# ls
password username
root@secretuse:/etc/secrets# pwd
/etc/secrets
root@secretuse:/etc/secrets# cat password
123456root@secretuse:/etc/secrets# cat username
adminroot@secretuse:/etc/secrets#
b.将secret导入到环境变量中
[root@k8s-master01 ~]# cat secretuse.yaml
apiVersion: v1
kind: Pod
metadata:
name: secretuseenv
spec:
containers:
- name: nginx
image: nginx
env:
- name: SECRET_USERNAME
valueFrom:
secretKeyRef:
name: secrettest
key: username
- name: SECRET_PASSWORD
valueFrom:
secretKeyRef:
name: secrettest
key: password
[root@k8s-master01 ~]# kubectl apply -f secretuse.yaml
pod/secretuseenv created
验证
[root@k8s-master01 ~]# kubectl exec -it secretuseenv /bin/bash
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl kubectl exec [POD] -- [COMMAND] instead.
root@secretuseenv:/# env |grep SECRET
SECRET_USERNAME=admin
SECRET_PASSWORD=123456
5 Service Account
Service Account 用来访问 Kubernetes API,由 Kubernetes自动创建,并且会自动挂载到Pod的/run/secrets/kubernetes.io/serviceaccount目录中
6 docker config json
使用 Kuberctl 创建 docker registry 认证的 secret
kubectl create secret docker-registry myregistrykey --docker-server=DOCKER_REGISTRY_SERVER --docker-username=DOCKER_USER --docker-password=DOCKER_PASSWORD --docker-email=DOCKER_EMAIL
在创建 Pod 的时候,通过imagePullSecrets来引用刚创建的 myregistrykey
apiVersion: v1
kind: Pod
metadata:
name: foo
spec:
containers:
- name: foo
image: 192.168.1.100:5000/test:v1
imagePullSecrets:
- name: myregistrykey
7 TLS
使用“kubectl create secret tls —cert=—key=”命令加载TLS文件内容并生成secret对象
将TLS密钥认证文件创建secret对象
# kubectl create secret tls nginx-ssl --key=nginx.key --cert=nginx.crt