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
posted @   立勋  阅读(39)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
点击右上角即可分享
微信分享提示