返回 导航

Docker / K8s

hangge.com

K8s - Kubernetes使用详解9(使用Secret管理敏感信息)

作者:hangge | 2019-08-07 08:10
    应用启动过程中可能需要一些敏感信息,比如访问数据库的用户名密码或者秘钥。将这些信息如果直接保存在容器镜像中显然不妥,Kubernetes 提供的解决方案是 Secret

九、使用 Secret 管理敏感信息

1,Secret 的功能介绍


2,创建 Secret

一共有有四种方法创建 Secret,这里假设我们需要创建一个包含如下信息的 Secret
  • username:hangge
  • password:123456
(1)使用 --from-literal 方式来创建(每个 --from-literal 对应一个信息条目):
kubectl create secret generic mysecret --from-literal=username=hangge --from-literal=password=123456

(2)使用 --from-file 方式来创建(每个文件内容对应一个信息条目):
echo -n hangge > ./username
echo -n 123456 > ./password
kubectl create secret generic mysecret --from-file=./username --from-file=./password

(3)使用 --from-env-file 方式来创建(文件 env.txt 中每行 Key=Value 对应一个信息条目)
cat << EOF > env.txt
username=admin
password=123456
EOF

kubectl create secret generic mysecret --from-env-file=env.txt

(4)使用 YAML 配置文件方式来创建:
  • 首先创建一个名为 mysecret.yml 的配置文件,内容如下:
apiVersion: v1
kind: Secret
metadata:
  name: mysecret
data:
  username: LSBuIGhhbmdnZQo=
  password: LSBuIDEyMzQ1Ngo=


kubectl apply -f mysecret.yml

3,查看 Secret

(1)执行如下命令可以查看存在的 secret,这里可以看到 mysecret 里有两个数据条目:
kubectl get secret mysecret

(2)执行如下命令可以查看条目的 key
kubectl describe secret mysecret

(3)如果想连同 Value 一起查看,可以执行如下代码:
kubectl edit secret mysecret

(4)然后通过 base64Value 反编码即可:

4,Secret 的使用方式一:通过 Volume 方式

注意:以 Volume 方式使用的 Secret 支持动态更新。也就是说 Secret 更新后,容器中的数据也会更新。
(1)首先我们创建一个 Pod 配置文件 mypod.yml 内容如下:
  • 我们定义了一个名为 fooVolume,来源为 secret mysecret
  • 并且将 foo mount 到容器路径 /etc/foo(指定读写权限为 readOnly
apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
  - image: busybox
    name: app
    volumeMounts:
    - mountPath: /etc/foo
      name: foo
      readOnly: true
    args:
    - /bin/sh
    - -c
    - sleep 10; touch /tmp/healthy; sleep 30000
  volumes:
  - name: foo
    secret:
      secretName: mysecret

(2)Pod 创建以后可以看到 Kubernetes 会在指定的路径 /etc/foo 下为每条敏感数据创建一个文件,文件名就是数据条目的 Key(这里是 /etc/foo/username/etc/foo/password)。而 Value 则以明文存放在文件中。
kubectl apply -f mypod.yml
kubectl exec -it mypod sh
ls /etc/foo
cat /etc/foo/username
cat /etc/foo/password

(3)我们也可以自定义存放数据的文件名,比如将配置文件进行如下修改:
apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
  - image: busybox
    name: app
    volumeMounts:
    - mountPath: /etc/foo
      name: foo
      readOnly: true
    args:
    - /bin/sh
    - -c
    - sleep 10; touch /tmp/healthy; sleep 30000
  volumes:
  - name: foo
    secret:
      secretName: mysecret
      items:
      - key: username
        path: my-group/my-username
      - key: password
        path: my-group/my-password

(4)重新创建 Pod 可以发现这时数据将分别存放在 /etc/foo/my-group/my-username/etc/foo/my-group/my-password 中。

5,Secret 的使用方式二:通过环境变量方式

注意:虽然环境变量读取 Secret 很方便,但无法支撑 Secret 动态更新。
(1)我们对配置文件内容进行修改,将 Secret 读取到环境变量中。
apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
  - image: busybox
    name: app
    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

(2)容器创建后,我们通过环境变量 SECRET_USERNAME SECRET_PASSWORD 成功读取到 Secret 的数据。
评论

全部评论(0)

回到顶部