k8sSecret资源
Secret资源的功能类似于ConfigMap,但它专用于存放敏感数据,如密码、数字证书、私钥、令牌和ssh key等。
一、概述
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。
二、创建Secret资源
1、命令式创建
$ kubectl -n testing create secrete generic mysql-auth --from-literal=username=root --from-literal=password=123456
[root@master secret]# kubectl -n testing get secret NAME TYPE DATA AGE default-token-hs2jc kubernetes.io/service-account-token 3 24d mysql-auth Opaque 2 15s [root@master secret]# kubectl -n testing describe secret mysql-auth Name: mysql-auth Namespace: testing Labels: <none> Annotations: <none> Type: Opaque Data ==== password: 6 bytes username: 4 bytes
[root@master secret]# kubectl -n testing get secret mysql-auth -o yaml apiVersion: v1 data: password: MTIzNDU2 username: cm9vdA== kind: Secret metadata: creationTimestamp: "2019-08-20T05:38:39Z" name: mysql-auth namespace: testing resourceVersion: "275852" selfLink: /api/v1/namespaces/testing/secrets/mysql-auth uid: c37a3fc1-c30c-11e9-8f53-000c29b9991f type: Opaque
[root@master secret]# echo cm9vdA== | base64 -d
root
对于本身业已存储于文件中的数据,也可在创建generic格式secret对象时使用--from-file选项从文件中直接进行加载,例如创建用于ssh认证的secret对象时:
$ kubectl -n testing create secret generic ssh-key --from-file=prikey=/root/.ssh/id_rsa --from-file=pubkey=/root/.ssh/id_rsa.pub
另外,若要基于私钥和数字证书文件创建用于ssl/tls通信的secret对象,则需要使用--cert=--key=选项来进行,其类型标识符为TLS:
$ kubectl -n testing create secret tls nginx-ssl --key=./nginx.key --cert=./nginx.crt
[root@master secret]# kubectl -n testing describe secret nginx-ssl Name: nginx-ssl Namespace: testing Labels: <none> Annotations: <none> Type: kubernetes.io/tls Data ==== tls.crt: 1233 bytes tls.key: 1675 bytes
无论用户提供的证书和私钥文件使用的是什么名称,它们一律会被转换为分别以tls.key和tls.crt为其键名。
2、清单式创建
secret资源对象除了标准的apiVersion、kind、metadata字段外,还有:
data:key:value格式的数据,通常是敏感信息,数据格式需是以base64格式编码的字符串,因此,需要事先完成编码。
stringData:以明文格式定义的key:value数据,非base64编码,而是在创建为secret对象时自动进行编码并保存于data字段中;stringData字段中的明文不会被api server输出,不过若是使用apply命令创建,那么注解信息中还是可能会直接输出这些信息的
type:仅是为了便于编程方式处理secret数据而提供的类型标识。
apiVersion: v1 kind: Secret metadata: name: redis-sct namespace: testing stringData: username: redis password: 123pass type: Opaque
根据此配置清单,使用apply命令创建后,用describe命令会输出未转换为base64编码的字符,若使用create命令创建,则输出base64编码后的字符。
三、secret存储卷
类似于pod消费configmap对象的方式,secret对象可以注入为环境变量,也可以存储为卷形式挂载使用。不过,容器应用通常会在发生错误时将所有环境变量保存于日志信息中,甚至有些应用在启动时即会将运行环境打印到日志中;另外,容器应用调用第三方程序为子进程时,这些子进程能够继承并使用父进程的所有环境变量。有鉴于此,使用环境变量引用secret对象中的敏感信息实在算不上明智之举。
在pod中使用secret存储卷的方式,除了其类型及引用标识要替换为secret及secretName之外,几乎完全类似于ConfigMap存储卷,包括支持使用挂载整个存储卷、只挂载存储卷中的指定键值以及独立挂载存储卷中的键等使用方式。
apiVersion: v1 kind: Pod metadata: name: vol-sct-pod namespace: testing spec: containers: - name: nginx image: nginx:1.12-alpine volumeMounts: - name: ngx-crt mountPath: /etc/nginx/ssl readOnly: true volumes: - name: ngx-crt secret: secretName: nginx-ssl
/etc/nginx/ssl # ls -l total 0 lrwxrwxrwx 1 root root 14 Aug 20 07:10 tls.crt -> ..data/tls.crt lrwxrwxrwx 1 root root 14 Aug 20 07:10 tls.key -> ..data/tls.key /etc/nginx/ssl # pwd /etc/nginx/ssl
四、imagePullSecret资源对象
imagePullSecret资源可用于辅助kubelet从需要认证的私有镜像仓库获取镜像,它通过将secret提供的密码传递给kubelet从而在拉取镜像前完成必要的认证过程。使用imagePullSecret的方式有两种:一是创建docker-registry类型的secret对象,并在定义pod资源时明确通过imagePullSecret字段给出;另一个是创建docker-registry类型的secret对象,将其添加到某特定的serviceaccount对象中,那些使用该serviceaccount资源创建的pod对象,以及默认使用该serviceaccount的pod对象都将会直接使用imagePullSecret中的认证信息。
kubectl -n testing create secret docker-registry test-reg --docker-username=cabel --docker-password=123456 --docker-email=zhangcaibao@163.com
apiVersion: v1 kind: Pod metadata: name: sct-image namespace: testing spec: imagePullSecrets: - name: test-reg containers: - name: vpn image: cabel/openvpn:v2.4
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通