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,可以看到镜像拉取没有问题,说明认证成功!
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值