Kubernetes(k8s)之Secret私密凭据

Posted Tuki_a

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Kubernetes(k8s)之Secret私密凭据相关的知识,希望对你有一定的参考价值。

什么是Secret

Secret的主要作用是保管私密数据,例如密码、OAuth令牌和ssh key。

Secret从属于Service Account资源对象,属于Service Account的一 部分,在一个Service Account对象里面可以包括多个不同的Secret对象,分别用于不同目的的认证活动。

敏感信息放在 secret 中比放在 Pod 的定义或者容器镜像中来说更加安全和灵活。

Secret的类型

1、Service Account:Kubernetes自动创建包含访问 API 凭据的 secret,并自动修改pod以使用此类型的 secret
2、Opaque:使用base64编码存储信息,可以通过base64 --decode解码获得原始数据,因此安全性弱。
3、kubernetes.io/dockerconfigjson:用于存储docker registry的认证信息。

Secret使用方式

一旦Secret被创建,就可以通过下面三种方式使用它:
1、在创建Pod时,通过为Pod指定Service Account来自动使用该Secret。
2、通过挂载该Secret到Pod来使用它。作为 volume 中的文件被挂载到 pod 中的一个或者多个容器里。
3、当 kubelet 为 pod 拉取镜像时使用。通过指定Pod的spc.ImagePullSecrets来引用它。

演示环境

server1:172.25.38.1	harbor仓库端
server2:172.25.38.2	k8s master端
server3:172.25.38.3	k8s node端
server4:172.25.38.4	k8s node端

Service Account

serviceaccout 创建时 Kubernetes 会默认创建对应的 secret。对应的 secret 会自动挂载到 Pod 的 /run/secrets/kubernetes.io/serviceaccount 目录中。

进入pod可以看到有证书token等

每个namespace下有一个名为default的默认的ServiceAccount对象

ServiceAccount里有一个名为Tokens的可以作为Volume一样被Mount到Pod里的Secret,当Pod启动时这个Secret会被自动Mount到Pod的指定目录下,用来协助完成Pod中的进程访问API Server时的身份鉴权过程。

从文件中创建Secret

先写入用户名和密码文件,使用文件创建一个名为db-user-pass的secret

yaml格式查看可以看到经过base64位编码的用户名和密码(默认情况下 kubectl get和kubectl describe 为了安全是不会显示密码的内容)

编写一个 secret 对象

文件内容如下:

apiVersion: v1
kind: Secret
metadata:
  name: mysecret
type: Opaque
data:
  username: YWRtaW4=
  password: d2VzdG9z

用下面命令可以将想编码的内容编码,然后可以写入文件

[root@server2 configmap]# echo redhat | base64
cmVkaGF0Cg==

用下图的命令可以解码

创建secret并查看

直接查看看不到内容

将Secret挂载到Volume中

在上面secret.yaml文件中加入创建pod的内容,将secret挂载到volume

apiVersion: v1
kind: Secret
metadata:
  name: mysecret
type: Opaque
data:
  username: YWRtaW4=
  password: d2VzdG9z
---
apiVersion: v1
kind: Pod
metadata:
  name: mysecret
spec:
  containers:
  - name: nginx
    image: nginx
    volumeMounts:
    - name: secrets
      mountPath: "/secret"		#pod挂载点
      readOnly: true			#只读
  volumes:
  - name: secrets
    secret:
      secretName: mysecret		#应填充此卷的secret为mysecret

前台运行mysecret,进入挂载点可以看到用户名和密码,说明挂载成功

向指定路径映射secret密钥

在上面最新的secret.yaml文件的基础上在指定mysecret最后加入以下内容:
只指定挂载用户名

items:
      - key: username
        path: my-group/my-username

如下,挂载成功,查看成功

将Secret设置为环境变量

修改secret.yaml文件,修改后的内容如下:

apiVersion: v1
kind: Secret
metadata:
  name: mysecret
type: Opaque
data:
  username: YWRtaW4=
  password: d2VzdG9z
---
apiVersion: v1
kind: Pod
metadata:
  name: secret-env		#创建的pod名
spec:
  containers:
  - name: nginx
    image: nginx
    env:
      - name: SECRET_USERNAME
        valueFrom:
          secretKeyRef:
            name: mysecret		#指定secert
            key: username		#指定键
      - name: SECRET_PASSWORD
        valueFrom:
          secretKeyRef:
            name: mysecret
            key: password

重新应用后,调到前台运行pod,执行env命令查看环境变量(用户名在最后,太长我就没截图)

环境变量读取Secret很方便,但无法支撑Secret动态更新

创建registry的认证信息

kubernetes.io/dockerconfigjson用于存储docker registry的认证信息。

先在仓库创建一个不公开的项目,这样匿名是无法拉取该项目下的镜像的

创建secret,域名、用户名、密码要写自己仓库的,别写错了

kubectl create secret docker-registry myregistrykey --docker-server=reg.westos.org --docker-username=admin --docker-password=westos --docker-email=yang@163.com


存储docker registry的认证信息的secret就创建好了

在server1仓库端给那个不公开的项目上传一个镜像

写一个用secret完成认证的创建pod的配置文件

apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
    - name: game2048
      image: reg.westos.org/test/game2048:latest	#镜像地址写那个不公开的项目下的镜像
  imagePullSecrets:
    - name: myregistrykey	#拉取镜像时用的镜像文件

应用文件创建pod,可以看到镜像拉取没有问题,说明认证成功!

以上是关于Kubernetes(k8s)之Secret私密凭据的主要内容,如果未能解决你的问题,请参考以下文章

k8s数据持久化之Secret

k8s之安全信息(secret)及配置信息(configmap)管理

【k8s】kubernetes实战篇之创建密钥自动拉取私服镜像

Kubernetes(k8s)配置管理ConfigMap&Secret

k8s医生k8s安全机制之新版rbac详解及排错

使用vault管理Kubernetes Secret