k8s 敏感数据

| 标签 kubernetes  secret  浏览次数: -

机密信息

Secret

Secret 会以密文的方式存储数据,避免了直接在配置文件中保存敏感信息。Secret 会以 Volume 的形式被 mount 到 Pod,容器可通过文件的方式使用 Secret 中的敏感数据;此外,容器也可以环境变量的方式使用这些数据。

创建Secret

  • 1.通过 --from-literal
kubectl create secret generic mysecret --from-literal=username=admin --from-literal=passsword=123456
  • 2.通过 --from-file
echo -n admin > ./username.txt
echo -n password > ./password.txt

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

kubectl create secret generic mysecret3 --from-env-file=env.txt
  • 4.通过 YAML 配置

mysecrete.yaml

apiVersion: v1
kind: Secret
metadata:
  name: mysecret4
data:
  username: YWRtaW4=
  password: MTIzNDU2

创建Secret

kubectl apply -f mysecrete.yaml
  • 查看创建的 Secret
kubectl get secret
  • 查看Secret中的Key
kubectl describe secret mysecret
  • 查看Secret中的Value
kubectl edit secret mysecret
  • 对内容进行解码
echo -n YWRtaW4= | base64 --decode

使用Secret

  • mypod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
  - name: mypod
    image: busybox
    args:
      - /bin/sh
      - -c
      - sleep 10; touch /tmp/healthy; sleep 30000
    volumeMounts:
    - name: foo
      mountPath: "/etc/foo"
      readOnly: true
  volumes:
  - name: foo
    secret:
      secretName: mysecret

  • 创建Pod并在容器中读取Secret
kubectl apply -f mypod.yaml

kubectl exec -it mypod cat /etc/foo/username
kubectl exec -it mypod cat /etc/foo/password
  • 自定义存放数据文件名 mypod1.yaml
apiVersion: v1
kind: Pod
metadata:
  name: mypod1
spec:
  containers:
  - name: mypod1
    image: busybox
    args:
      - /bin/sh
      - -c
      - sleep 10; touch /tmp/healthy; sleep 30000
    volumeMounts:
    - name: foo
      mountPath: "/etc/foo"
      readOnly: true
  volumes:
  - name: foo
    secret:
      secretName: mysecret
      items:
      - key: username
        path: my-group/my-username
      - key: password
        path: my-group/my-password

  • 查看数据
kubectl apply -f mypod1.yaml

kubectl exec -it mypod1 cat /etc/foo/my-group/my-username

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

环境变量方式使用Secret

  • mypod-env.yaml
apiVersion: v1
kind: Pod
metadata:
  name: mypod2
spec:
  containers:
  - name: mypod2
    image: busybox
    args:
      - /bin/sh
      - -c
      - sleep 10; touch /tmp/healthy; sleep 30000
    env:
      - name: SECRET_USERNAME
        valueFrom:
          secretKeyRef:
            name: mysecret
            key: username
      - name: SECRET_PASSWORD
        valueFrom:
          secretKeyRef:
            name: mysecret
            key: password

  • 创建Pod并读取Secret
ubuntu2@root  k8s-learn kubectl apply -f mypod-env.yaml
pod/mypod2 unchanged
ubuntu2@root  k8s-learn kubectl exec -it mypod2 sh
/ # echo "$SECRET_USERNAME" && echo "$SECRET_PASSWORD"
admin
123456
/ #

环境变量读取 Secret 很方便,但无法支撑 Secret 动态更新。


上一篇 k8s volume实践     下一篇 k8s 普通配置
目录导航