Linux企业运维——Kubernetes存储之Secret配置管理

Posted 是大姚呀

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux企业运维——Kubernetes存储之Secret配置管理相关的知识,希望对你有一定的参考价值。

Linux企业运维——Kubernetes(十)存储之Secret配置管理

1、Secret简介

Secret对象类型用来保存敏感信息,例如密码、OAuth 令牌和 ssh key。
敏感信息放在secret 中比放在 Pod 的定义或者容器镜像中来说更加安全和灵活。

Pod 可以用两种方式使用secret:

  • 作为volume 中的文件被挂载到 pod 中的一个或者多个容器里。
  • 当kubelet 为 pod 拉取镜像时使用。

Secret的类型:

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

2、ServiceAccount

Service account是为了方便Pod里面的进程调用Kubernetes API或其他外部服务而设计的。它与User account不同:

  • User account是为人设计的,而service account则是为Pod中的进程调用Kubernetes API而设计;

  • User account是跨namespace的,而service account则是仅局限它所在的namespace;

  • 每个namespace都会自动创建一个default service account

  • Token controller检测service account的创建,并为它们创建secret

  • 开启ServiceAccount Admission Controller后
    1.每个Pod在创建后都会自动设置spec.serviceAccount为default(除非指定了其他ServiceAccout)
    2.验证Pod引用的service account已经存在,否则拒绝创建
    3.如果Pod没有指定ImagePullSecrets,则把service account的ImagePullSecrets加到Pod中
    4.每个container启动后都会挂载该service account的token和ca.crt到/var/run/secrets/kubernetes.io/serviceaccount/

3、Opaque Secret

3.1、从文件中创建secret

在configmap目录下创建并编写username和password文本文件,用命令指定这两个文本文件创建secret,查看到新创建的db-user-pass

查看信息看到的用户和密码经过base64编码,看不到明文,使用-d参数就可以解码。
默认情况下 kubectl get和kubectldescribe 为了安全是不会显示密码的内容,可以通过以下方式查看:

3.2、使用yaml文件创建secret

创建secret.yaml配置文件并应用,查看列表信息可以看到mysecret被创建

3.3、将Secret挂载到Volume中

编辑secret.yaml文件,将mysecret数据挂载到名为mysecret的Pod的/secret目录下,设置为只读

应用配置,查看pod信息,mysecret被创建

连接到mysecret容器,切换到secret目录下,可以看到两个文本文件

3.4、向指定路径映射 secret 密钥

编辑secret.yaml文件,指定key为username,其值为指定路径/secret/my-group/my-username

应用配置,看到mysecret被创建,连接到mysecret切换到secret目录,查看my-username内容

3.5、将Secret设置为环境变量

编辑secret.yaml文件,为pod设置环境变量,把mysecret的username对应的值作为SECRET_USERNAME变量,把mysecret的password对应的值作为SECRET_PASSWORD变量

应用配置,可以看到secret-env内被创建,连接到该容器,查看环境变量,可以看到刚才配置的SECRET_USERNAME变量和SECRET_USERNAME变量


环境变量读取Secret很方便,但无法支撑Secret动态更新,比如我们现在更改下SECRET_PASSWORD的值

修改密码为redhat(经过Base64编码后的)

再次查看环境变量,SECRET_PASSWORD的值还是westos,没有改变

3.6、kubernetes.io/dockerconfigjson存储docker registry的认证信息

创建myregistrykey,通过命令参数指定仓库名字、用户名和密码。查看secret信息,可以看到新创建的myregistrykey

创建westos仓库,设置为私有,这样就需要用户名和密码

编辑registry.yaml文件,配置镜像地址

应用配置文件,查看pod信息,看到mypod没有运行成功,因为仓库权限问题

修改registry.yaml文件,加上secret认证信息

现在查看pod状态,看到已经正常运行

以上是关于Linux企业运维——Kubernetes存储之Secret配置管理的主要内容,如果未能解决你的问题,请参考以下文章

Linux企业运维——Kubernetes存储之Volumes配置管理

Linux企业运维——Kubernetes(十三)访问控制

Linux企业运维——Kubernetes(二十)Prometheus监控

Linux企业运维——Kubernetes(二十)Prometheus监控

Linux企业运维——Kubernetes(十四)PSP安全策略

Linux企业运维——Kubernetes(十六)容器资源监控