美文网首页
Kubernetes资源对象--Secret

Kubernetes资源对象--Secret

作者: 张氏小毛驴 | 来源:发表于2022-04-23 19:29 被阅读0次

    Secret是为了解决密码,token或秘钥等比较敏感的数据的配置问题,避免了直接将这些数据暴露在镜像或者Pod Spec中。

    1.Secret的类型

    Secret有三种类型:

    • Opaque
      基于base64编码,用来存储密码等,但是可以通过base64 --decode解码,加密性很弱。
    • kubernetes.io/dockerconfigjson
      用来存储私有docker registry的认证信息。
    • kubernetes.io/service-account-token
      用于被serviceaccount引用,用于集群间组件通信的令牌。
      以下以Opaque类型为主做记录。

    2.创建Secret

    有四种方式可以创建Secret

    • 通过--from-literal
      kubectl create secret generic mysecret --from-literal=username=admin --from--literal=password=123456
      一个--from-literal对应一个条目
    • 通过--from-file
    echo -n admin > ./username
    echo -n 123456 > ./password
    kubectl create secret generic mysecret1 --from-file=./username --from-file=./password
    

    一个文件对应一个条目

    • 通过--from-env-file
    cat << EOF > env.txt
    username=admin
    password=123456
    EOF
    
    kubectl create secret generic mysecret2 --from-env-file=env.txt
    

    env.txt中每一行key=value对应一个条目

    • 通过yaml文件
    apiVersion: v1
    kind: Secret
    metadata:
      name: mysecret3
    data:
      username: YWRtaW4=
      password: MTIzNDU2
    

    其中data中的敏感数据必须是base64编码后的结果。


    3.使用Secret

    有两种方式使用Secret,分别为Volume和环境变量

    3.1 Pod中Volume挂载使用Secret

    创建yaml配置文件volume_secret.yaml

    apiVersion: v1
    kind: Pod
    metadata:
      name: volume_secret
    spec:
      containers:
      - name: volume_secret
        image: busybox
        args:
          - /bin/sh
          - -c
          - sleep 10; touch /tmp/test; sleep 30000
        volumeMounts:
        - name: secrets
          mountPath: "/etc/secrets"
          readOnly: true
      volumes:
      - name: secrets
        secret:
          secretName: mysecret3
    

    执行创建应用,然后进入busybox中:
    kubectl exec -it volume_secret sh
    查看/etc/secrets/username,/etc/secrets/password可得到Secret

    可以看出,kubernetes会再指定的路径/etc/secrets为Secret中每一个条目数据创建一个文件,文件名就是条目的key,文件内容就是条目的value。

    也可以指定存放数据的文件名,比如将上面的yaml文件修改为:
    在最后添加:

          secretName: mysecret3
          items:
          - key: username
            path: /etc/test/my_username
          - key: password
            path: /etc/test/my_password
    

    Volume方式使用的Secret支持动态更新,当Secret更新后,容器中的数据也会相应的更新。

    3.2 环境变量方式使用Secret

    创建env_secret.yaml文件:

    apiVersion: v1
    kind: Pod
    metadata:
      name: env-secret
    spec:
      containers:
      - name: env-secret
        image: busybox
        args:
          - /bin/sh
          - -c
          - sleep 10; touch /tmp/test; sleep 30000
        env:
          - name: SECRET_USERNAME
            valueFrom:
              secretKeyRef:
                name: mysecret3
                key: username
          - name: SECRET_PASSWORD
            valueFrom:
              secretKeyRef:
                name: mysecret3
                key: password
    

    执行应用进入容器中查看,通过环境变量SECRET_USERNAME和SECRET_PASSWORD可以读取到Secret的数据。

    与volume不同的是,环境变量的方式读取Secret很方便,但是不能动态更新

    相关文章

      网友评论

          本文标题:Kubernetes资源对象--Secret

          本文链接:https://www.haomeiwen.com/subject/rzeyuftx.html