Secret
Secret
简述Kubernetes Secret作用
Secret对象,主要作用是保管私密数据,比如密码、OAuth Tokens、SSH Keys等信息。将这些私密信息放在Secret对象中比直接放在Pod或Docker Image中更安全,也更便于使用和分发。
Secret有哪些使用方式
创建完secret之后,可通过如下三种方式使用:
* 在创建Pod时,通过为Pod指定Service Account来自动使用该Secret。
* 通过挂载该Secret到Pod来使用它。secret将作为volume中的文件被挂载到pod中的一个或者多个容器里
* 在Docker镜像下载时使用,通过指定Pod的spec.ImagePullSecrets来引用它。
secret
secret也是键值对的映射
可以作为环境变量传递给容器或将secret条目暴露为卷中的文件
secret只会存储在内存中,不会存在磁盘中
意义
secret解决了密码、token、密钥等敏感数据的配置问题,而不需要把这些敏感数据暴露到镜像或者Pod Spec中
可以将敏感信息写入secret中,容器运行时将其挂载到容器中
secret的构成
* service accout创建时Kubernetes会默认创建对应的secret。对应的secret会自动挂载到Po的/var/run/secrets/kubernetes.io/serviceaccount目录中。
* 目录中包含以下3个文件:
ca.crt
namespace
token
secret的类型
kubernetes.io/service-account-token
它存储了pod进程用来访问Kubernetes API的凭证,由K8s自动创建(也可以手动创建),并且会自动挂载到Pod的/var/run/secrets/kubernetes.io/serviceaccount路径下
它和K8S中的资源Service Account不是同一个对象
Opaque
base64编码格式的secret,用来存储密码、密钥等。该数据是key: value类型的
kubernetes.io/dockerconfigjson
用来存储私有的docker registry的认证信息
kubernetes.io/dockercfg
~/.dockercfg 文件的序列化形式
kubernetes.io/basic-auth
用于基本身份认证的凭据
kubernetes.io/ssh-auth
用于 SSH 身份认证的凭据
kubernetes.io/tls
用于 TLS 客户端或者服务器端的数据
bootstrap.kubernetes.io/token
启动引导令牌数据
Secret(kubernetes.io/service-account-token)与Service Account的区别
Service Account: Service Account 是 Kubernetes 中的一种资源类型,用于为 Pods 提供身份验证和授权。Service Account 具有一个唯一的名称,每个 Pod 可以分配一个 Service Account。Service Account 不包含敏感信息,而是用于标识 Pod,以便控制它们与 Kubernetes API Server的交互权限。Service Account 可以用来限制 Pods 对其他 Kubernetes 资源的访问,但它本身不存储敏感数据。
Secrets: Secrets 是 Kubernetes 中的一种资源类型,用于存储敏感信息,如密码、密钥、证书等。Kubernetes 提供了三种类型的 Secrets:Opaque、kubernetes.io/service-account-token 和 kubernetes.io/dockerconfigjson。其中,kubernetes.io/service-account-token 类型的 Secret 用于存储与 Service Account 关联的访问令牌(Token),以便 Pod 可以使用它来进行身份验证。这个类型的 Secret 包含了与 Service Account 关联的令牌,但令牌本身是敏感信息。
创建
键值对创建
kubectl create secret generic my-secret \
--from-literal=DB_Host=mysql \
--from-literal=DB_User=root
从文件创建
kubectl create secret generic my-secret \
--from-file=app_secret.properties
使用yaml文件创建opaque类型的secret
# 先将用户和密码用base64格式表示
echo -n "admin" | base64 # echo -n 不换行输出,即输出内容的末尾没有换行符
YWRtaW4=
echo -n "82hd9cw30c" | base64
ODJoZDljdzMwYw==
解密
echo "ODJoZDljdzMwYw==" | base64 --decode
vim opaque.yaml
apiVersion: v1
kind: Secret
metadata:
name: mysecret
type: Opaque
data:
password: ODJoZDljdzMwYw==
username: YWRtaW4=
使用secret
将secret挂载到volume中
vim secret-volume.yaml
apiVersion: v1
kind: Pod
metadata:
name: secret-test
labels:
name: secret-test
spec:
volumes:
- name: secrets # 卷名为secrets
secret: # 卷以secret的形式
secretName: mysecret # secret中的键名为文件名,键值为文件内容
containers:
- image: nginx
name: db
volumeMounts:
- name: secrets
mountPath: "/etc/secrets"
readOnly: true
将secret导入到环境变量中
vim secret-env.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: pod-deployment
spec:
replicas: 2
template:
metadata:
labels:
app: pod-deployment
spec:
containers:
- name: pod-1
image: nginx
ports:
- containerPort: 80
env:
- name: TEST_USER
valueFrom:
secretKeyRef:
name: mysecret
key: username
- name: TEST_PASSWORD
valueFrom:
secretKeyRef:
name: mysecret
key: password
envFrom:
- secretRef:
name: app-config
连接容器,echo环境变量
kubernetes.io/dockerconfigjson
先注释掉secret的配置,创建pod会提示没有认证,无法下载镜像
之后解除注释,再创建pod
vim mypod.yaml
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: game2048
image: reg.westos.org/westos/game2048
# imagePullSecrets:
# - name: myregistrykey
kubectl create -f mypod.yaml
kubectl get pod
kubectl describe pod mypod
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!