Secret

作者: 会倒立的香飘飘 | 来源:发表于2021-04-01 16:40 被阅读0次

一,Secret

Secret 对象类型用来保存敏感信息,例如密码、OAuth 令牌和 SSH 密钥。 将这些信息放在 secret 中比放在 Pod 的定义或者 容器镜像 中来说更加安全和灵活
Secret 是一种包含少量敏感信息例如密码、令牌或密钥的对象。 这样的信息可能会被放在 Pod 规约中或者镜像中。 用户可以创建 Secret,同时系统也创建了一些 Secret。

注意:

Kubernetes Secret 默认情况下存储为 base64-编码的、非加密的字符串。 默认情况下,能够访问 API 的任何人,或者能够访问 Kubernetes 下层数据存储(etcd) 的任何人都可以以明文形式读取这些数据。 为了能够安全地使用 Secret,我们建议你(至少):

  1. 为 Secret 启用静态加密
  2. 启用 RBAC 规则来限制对 Secret 的读写操作。 要注意,任何被允许创建 Pod 的人都默认地具有读取 Secret 的权限。

Secret类型

Secret 有三种类型:

Opaque:                                 base64 编码格式的 Secret,用来存储密码、密钥等;但数据也通过 base64 —decode 解码得到原始数据,所有加密性很弱。
kubernetes.io/dockerconfigjson:         用来存储私有 docker registry 的认证信息。
kubernetes.io/service-account-token:    用于被 serviceaccount 引用。serviceaccout 创建时 Kubernetes 会默认创建对应的 secret。Pod 如果使用了 serviceaccount,对应的 secret 会自动挂载到 Pod 的 /run/secrets/kubernetes.io/serviceaccount 目录中。

备注:serviceaccount 用来使得 Pod 能够访问 Kubernetes API

创建一个secret

Opaque secret

Opaque 类型的数据是一个 map 类型,要求 value 是 base64 编码格式

root@master:~# echo admin |base64
YWRtaW4K
root@master:~# echo 123456|base64
MTIzNDU2Cg==

vim secret.yaml
apiVersion: v1
kind: Secret
metadata:
  name: mysecret
type: Opaque
data:
  name: YWRtaW4K
  password: MTIzNDU2Cg== 

创建secret

root@master:~# kubectl apply -f secret.yaml 
root@master:~# kubectl apply -f secret.yaml 
secret/mysecret created
root@master:~# kubectl get secret
NAME                  TYPE                                  DATA   AGE
default-token-9ptzj   kubernetes.io/service-account-token   3      6h59m
mysecret              Opaque                                2      8s
root@master:~# kubectl describe secret mysecret 
Name:         mysecret
Namespace:    default
Labels:       <none>
Annotations:  
Type:         Opaque

Data
====
name:      6 bytes
password:  7 bytes

Opaque Secret的使用有两种方式:

1,以 Volume 方式
2,以环境变量方式

将 Secret 挂载到 Volume 中
vim  secret-pod.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: myapp
spec:
  volumes:
  - name: secrets
    secret:
      secretName: mysecret
  containers:
  - image: ikubernetes/myapp:v1
    name: myapp
    volumeMounts:
    - name: secrets
      mountPath: "/etc/secrets"
      readOnly: true
    ports:
    - name: http
      containerPort: 80

root@master:~# kubectl apply -f secret-pod.yaml 
pod/myapp created
root@master:~# kubectl get pods
NAME           READY   STATUS    RESTARTS   AGE
myapp          1/1     Running   0          6s
root@master:~# kubectl exec -it myapp -- /bin/sh 
/ # ls /etc/secrets/
name      password
/ # cat /etc/secrets/name 
admin
/ # cat /etc/secrets/password 
123456
/ #

以环境变量的方式传递

root@master:~# cat secret-pod.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: secret
  namespace: default
spec:
  containers:
  - name: myapp
    image: ikubernetes/myapp:v1
    ports:
    - name: http
      containerPort: 80
    env:
    - name: MYSECRET
      valueFrom:
        secretKeyRef:
          name: mysecret
          key: name
    - name: SECRET
      valueFrom:
        secretKeyRef:
          name: mysecret
          key: password

登录容器查看

root@master:~# kubectl exec -it secret -- /bin/sh
/ # env |grep SECRET
MYSECRET=admin
SECRET=123456

将secret将键名映射到相应的路径

root@master:~# cat pods-secret.yaml 
apiVersion: v1
kind: Pod
metadata:
  labels:
    name: db
  name: db
spec:
  volumes:
  - name: secrets
    secret:
      secretName: mysecret
      items:
      - key: password
        mode: 511
        path: tst/psd
      - key: name
        mode: 511
        path: tst/usr
  containers:
  - image: nginx
    name: db
    volumeMounts:
    - name: secrets
      mountPath: "/etc/secrets"
      readOnly: true
    ports:
    - name: cp
      containerPort: 80

登录容器验证

root@master:~# kubectl exec -it db -- /bin/sh
# cat /etc/secrets/tst/psd
123456
#  cat /etc/secrets/tst/usr
admin
# 
官方文档
https://v1-19.docs.kubernetes.io/zh/docs/concepts/configuration/secret/

相关文章

网友评论

      本文标题:Secret

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