Kubernetes(k8s)之Secret私密凭据

Secret

    • 什么是Secret
    • Secret的类型
    • Secret使用方式
    • 演示环境
    • Service Account
    • 从文件中创建Secret
    • 编写一个 secret 对象
    • 将Secret挂载到Volume中
    • 向指定路径映射secret密钥
    • 将Secret设置为环境变量
    • 创建registry的认证信息

什么是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来引用它。

Kubernetes(k8s)之Secret私密凭据_第1张图片

演示环境

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等
Kubernetes(k8s)之Secret私密凭据_第2张图片
每个namespace下有一个名为default的默认的ServiceAccount对象
Kubernetes(k8s)之Secret私密凭据_第3张图片
ServiceAccount里有一个名为Tokens的可以作为Volume一样被Mount到Pod里的Secret,当Pod启动时这个Secret会被自动Mount到Pod的指定目录下,用来协助完成Pod中的进程访问API Server时的身份鉴权过程。
Kubernetes(k8s)之Secret私密凭据_第4张图片

从文件中创建Secret

先写入用户名和密码文件,使用文件创建一个名为db-user-pass的secret
Kubernetes(k8s)之Secret私密凭据_第5张图片
yaml格式查看可以看到经过base64位编码的用户名和密码(默认情况下 kubectl get和kubectl describe 为了安全是不会显示密码的内容)
Kubernetes(k8s)之Secret私密凭据_第6张图片

编写一个 secret 对象

文件内容如下:

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

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

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

用下图的命令可以解码
在这里插入图片描述
创建secret并查看
Kubernetes(k8s)之Secret私密凭据_第7张图片
直接查看看不到内容
Kubernetes(k8s)之Secret私密凭据_第8张图片

将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,进入挂载点可以看到用户名和密码,说明挂载成功
Kubernetes(k8s)之Secret私密凭据_第9张图片

向指定路径映射secret密钥

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

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

如下,挂载成功,查看成功
Kubernetes(k8s)之Secret私密凭据_第10张图片

将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命令查看环境变量(用户名在最后,太长我就没截图)
Kubernetes(k8s)之Secret私密凭据_第11张图片
环境变量读取Secret很方便,但无法支撑Secret动态更新

创建registry的认证信息

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

先在仓库创建一个不公开的项目,这样匿名是无法拉取该项目下的镜像的
Kubernetes(k8s)之Secret私密凭据_第12张图片
创建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就创建好了
Kubernetes(k8s)之Secret私密凭据_第13张图片
在server1仓库端给那个不公开的项目上传一个镜像
Kubernetes(k8s)之Secret私密凭据_第14张图片
写一个用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私密凭据_第15张图片

你可能感兴趣的:(Docker容器+k8s,docker,kubernetes,安全,运维,运维开发)