文章目录

  • 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

k8s中部署harbor k8s中部署letsencrypt_docker


1.

k8s中部署harbor k8s中部署letsencrypt_docker_02


k8s中部署harbor k8s中部署letsencrypt_k8s中部署harbor_03


k8s中部署harbor k8s中部署letsencrypt_Pod_04


k8s中部署harbor k8s中部署letsencrypt_nginx_05


k8s中部署harbor k8s中部署letsencrypt_Pod_06


k8s中部署harbor k8s中部署letsencrypt_nginx_07

k8s中部署harbor k8s中部署letsencrypt_nginx_08


k8s中部署harbor k8s中部署letsencrypt_k8s中部署harbor_09


k8s中部署harbor k8s中部署letsencrypt_nginx_10

作为存储卷注入到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

k8s中部署harbor k8s中部署letsencrypt_docker_11


k8s中部署harbor k8s中部署letsencrypt_nginx_12


k8s中部署harbor k8s中部署letsencrypt_docker_13


k8s中部署harbor k8s中部署letsencrypt_nginx_14


k8s中部署harbor k8s中部署letsencrypt_nginx_15


k8s中部署harbor k8s中部署letsencrypt_Pod_16


k8s中部署harbor k8s中部署letsencrypt_docker_17


k8s中部署harbor k8s中部署letsencrypt_Pod_18

3.

k8s中部署harbor k8s中部署letsencrypt_docker_19


k8s中部署harbor k8s中部署letsencrypt_docker_20


k8s中部署harbor k8s中部署letsencrypt_Pod_21


k8s中部署harbor k8s中部署letsencrypt_Pod_22

编写一个 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

k8s中部署harbor k8s中部署letsencrypt_Pod_23


1.

k8s中部署harbor k8s中部署letsencrypt_Pod_24


k8s中部署harbor k8s中部署letsencrypt_docker_25

k8s中部署harbor k8s中部署letsencrypt_k8s中部署harbor_26


k8s中部署harbor k8s中部署letsencrypt_Pod_27

将secret挂载在volume中

k8s中部署harbor k8s中部署letsencrypt_k8s中部署harbor_28

将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.

k8s中部署harbor k8s中部署letsencrypt_nginx_29

k8s中部署harbor k8s中部署letsencrypt_nginx_30

k8s中部署harbor k8s中部署letsencrypt_Pod_31

k8s中部署harbor k8s中部署letsencrypt_docker_32


k8s中部署harbor k8s中部署letsencrypt_Pod_33


k8s中部署harbor k8s中部署letsencrypt_docker_34

k8s中部署harbor k8s中部署letsencrypt_k8s中部署harbor_35

向指定路径映射 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.

k8s中部署harbor k8s中部署letsencrypt_Pod_36

k8s中部署harbor k8s中部署letsencrypt_Pod_37

k8s中部署harbor k8s中部署letsencrypt_k8s中部署harbor_38


k8s中部署harbor k8s中部署letsencrypt_nginx_39


k8s中部署harbor k8s中部署letsencrypt_k8s中部署harbor_40

将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

k8s中部署harbor k8s中部署letsencrypt_Pod_41


1.

k8s中部署harbor k8s中部署letsencrypt_docker_42


k8s中部署harbor k8s中部署letsencrypt_k8s中部署harbor_43


k8s中部署harbor k8s中部署letsencrypt_nginx_44


k8s中部署harbor k8s中部署letsencrypt_nginx_45


k8s中部署harbor k8s中部署letsencrypt_nginx_46


k8s中部署harbor k8s中部署letsencrypt_Pod_47


k8s中部署harbor k8s中部署letsencrypt_Pod_48


k8s中部署harbor k8s中部署letsencrypt_Pod_49


k8s中部署harbor k8s中部署letsencrypt_docker_50

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仓库设置为私有

k8s中部署harbor k8s中部署letsencrypt_nginx_51


k8s中部署harbor k8s中部署letsencrypt_nginx_52


2.为私有仓库添加yx用户

k8s中部署harbor k8s中部署letsencrypt_nginx_53


k8s中部署harbor k8s中部署letsencrypt_docker_54


测试当没有登录,且没有授权时

k8s中部署harbor k8s中部署letsencrypt_k8s中部署harbor_55


k8s中部署harbor k8s中部署letsencrypt_nginx_56


将用户授权

k8s中部署harbor k8s中部署letsencrypt_k8s中部署harbor_57


k8s中部署harbor k8s中部署letsencrypt_nginx_58


k8s中部署harbor k8s中部署letsencrypt_nginx_59

k8s中部署harbor k8s中部署letsencrypt_docker_60

k8s中部署harbor k8s中部署letsencrypt_docker_61


k8s中部署harbor k8s中部署letsencrypt_nginx_62


k8s中部署harbor k8s中部署letsencrypt_Pod_63


k8s中部署harbor k8s中部署letsencrypt_Pod_64


k8s中部署harbor k8s中部署letsencrypt_k8s中部署harbor_65