k8s基础入门之敏感数据管理secret

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
  • 我的微信
  • 这是我的微信扫一扫
  • weinxin
  • 我的微信公众号
  • 我的微信公众号扫一扫
  • weinxin
avatar

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: