【Kubernetes】Pod 之 Secret 创建

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第5天,点击查看活动详情

一、前言

ConfigMap传递敏感数据,就需要Secret

Secret 对象可以存储和管理敏感信息,比如 passwordsOAuth tokens、以及 ssh keys 等。把敏感信息存储到 Secret 对象中会比放到 Pod 的定义文件或是容器镜像中更加安全、灵活,使用 Secret 对象可以更好的控制数据的使用方式,并且减少意外泄露的风险。

不仅用户可以创建 Secret 对象,kubernetes 系统也会创建一些 Secret 对象。

Secret 被创建以后,可以使用 3 种方式创建它:

  • 创建 Pod 时,通过为 Pod 指定 Service Account 自动使用该 Secret
  • 通过挂载该 SecretPod 来使用它
  • Docker 镜像下载时使用,通过指定 Podspc.ImagePullSecrets 来引用它

在存储数据的时候,如何从 ConfigMapSecret 这两者之间进行选择呢?

  • 使用 ConfigMap 存储非敏感的配置信息
  • 使用 Secret 存储敏感的配置信息
  • 如果配置文件既包含敏感信息、又包含非敏感信息,依然选择 Secret 进行存储

SecretConfigMap 对比,既有相同点、也有不同点,列表如下: 相同点:

  • 存储数据都属于 key-value 键值对形式
  • 属于某个特定的 namespace
  • 可以导出到环境变量
  • 可以通过目录/文件形式挂载(支持挂载所有 key 和部分 key

不同点:

  • Secret 可以被 ServerAccount 关联使用
  • Secret 可以存储 Register 的鉴权信息,用于 ImagePullSecret 参数中,用于拉取私有仓库的镜像
  • Secret 支持 Base64 加密
  • Secret 分为 Opaquekubernetes.io/Service Accountkubernetes.io/dockerconfigjson 三种类型,ConfigMap 不区分类型
  • Secret 文件存储在 tmpfs 文件系统中,Pod 删除后 Secret 文件也会对应被删除

二、默认令牌Secret

Service Accounts使用API证书自动创建并且绑定Secret

kubernetes 系统可以自动创建用于访问 API 证书的 Secret,并且可以自动绑定到 Pod 中使用这种类型的 Secret

可以根据需要禁用或覆盖重写这类 Secret,但是通常情况下如果考虑到安全性,更加推荐使用系统默认创建的 Secret

  1. 查看系统默认创建的Secret: kubectl get secrets

  2. 查看Secrets详细信息:kubectl describe secrets

  3. 新建yaml

apiVersion: v1
kind: Pod
metadata:
  name: nginx-manual
spec:
  containers:
    - image: registry.cn-hangzhou.aliyuncs.com/chenshi-kubernetes/nginx:1.9.1
      name: nginx
      ports:
        - containerPort: 80
          protocol: TCP
复制代码
  1. 执行创建
$ kubectl create -f nginx-manual.yaml
pod/nginx-manual created
复制代码
  1. 查看详细信息
$ kubectl describe pod nginx-manual


# 这里显示了 default-token-sz72t Secret 被挂载到了容器中的 /var/run/secrets/kubernetes.io/serviceaccount 目录下
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-sz72t (ro)
复制代码
  1. 查看容器该目录下的文件名是否符合
$ kubectl exec nginx-manual ls /var/run/secrets/kubernetes.io/serviceaccount
ca.crt
namespace
token
复制代码

**Tips: **

  1. podAPI Service创建时,API Service不会校验该pod引用的Secret是否存在

  2. 一旦这个pod被调度,则kubelet将试着获取Secret的值

  3. 如果Secret不存在或暂时无法连接到API Secret,则kubelet会按照一定的时间间隔定期重试获取该Secret,并发送一个Event来解释pod没有启动的原因。

  4. 一旦 SecretPod 获取,则 kubelet 将创建并挂载包含 SecretVolume,只有所有 Volume 都挂载成功,Pod 中的 Container 才会被启动。



三、创建Secret

创建Secret三种方式:

  • kubectl
  • yaml配置文件
  • 生成器创建secret

(1)使用kubectl创建secret

  1. 定义帐号和密码
echo -n 'admin' > /home/donald/username.txt
echo -n '1f2d1e2e67df' > /home/donald/password.txt
复制代码
  1. 创建
$ kubectl create secret generic db-user-pass --from-file=/home/donald/username.txt --from-file=/home/donald/password.txt
secret/db-user-pass created
复制代码
  1. 查看Secret
kubectl get secrets
复制代码

(2)yaml配置文件

文件可以是jsonyaml

定义Secret有两种字段:

  • data:被Base64编码以后的数据
  • stringData:可以纯文本
  1. 定义帐号和密码
echo -n 'admin' | base64
YWRtaW4=
$ echo -n '123' | base64
MTIz
复制代码
  1. 创建secret.yaml
apiVersion: v1
kind: Secret
metadata:
  name: mysecret
type: Opaque
data:
  username: YWRtaW4=
  password: MTIz
复制代码
  1. 执行创建
$ kubeclt create -f secre.yaml
secret/mysecret created
复制代码

(3)生成器创建Secret

kubectl v1.14版本开始支持 Kustomize管理对象

  1. 创建一个kustomization.yaml, 生成器字段secretGenerator
cat <<EOF >/home/donald/kustomization.yaml
secretGenerator:
- name: db-user-pass
  files:
  - username.txt
  - password.txt
EOF
复制代码

或者 key-value形式

cat <<EOF >/home/donald/kustomization.yaml
secretGenerator:
- name: db-user-pass
  literals:
  - username=admin
  - password=secret
EOF
复制代码
  1. 执行创建
kubectl apply -k . 
复制代码
  1. 查看
kubectl get secrets
复制代码

猜你喜欢

转载自juejin.im/post/7082782601093578789