Kubernetes(k3s)进阶学习(五) -- Secret应用

通常我们在构建应用(Pod)时,总会传递一些敏感信息到Pod 的容器内。比如建立数据库的用户名、密码等。这些信息保存在Docker的镜像里总不太灵活。这时候我们就可以使用Kubernetes 的Secret 。

Secret的特点是以密文方式存储数据,避免直接在配置文件中保存敏感信息,Secret会以Volume的形式被mount到Pod,容器可以通过文件又或者是环境变量的方式使用Secret中的敏感数据。

使用Secret

  1. 通过--form-literal
#创建一个叫form-secret 的secret ,并且添加两个键(account、password),值为(admin、123456)
ubuntu@server:~$ sudo kubectl create secret generic form-secret --from-literal=account=admin --from-literal=password=123456

secret/form-secret created


#验证form-secret是否创建成功 
ubuntu@server:~$ sudo kubectl get secret
NAME                  TYPE                                  DATA   AGE
default-token-2tjxh   kubernetes.io/service-account-token   3      38d
form-secret           Opaque                                2      18m

  1. 通过 --from-file
#先创建account.dat 和password.dat 文件
ubuntu@server:~$ echo 'file-account' >> account.dat
ubuntu@server:~$ echo 'abcdefg' >> password.dat

#创建一个叫file-secret 的secret ,把account.dat 和password.dat 文件导进去。
ubuntu@server:~$ sudo kubectl create secret generic file-secret --from-file=account.dat --from-file=password.dat

secret/file-secret created

  1. 通过--from-env
#创建文件 vim secret-env.dat
#secret-env.dat. 内容

account=env-account
password=654321

#把secret-env.dat 导进去
ubuntu@server:~$ sudo kubectl create secret generic secret-env --from-env-file=secret-env.dat

secret/secret-env created

  1. 通过yaml 文件引入

#首先需要把值转换成base64
echo -n yamlAdmin|base64
eWFtbEFkbWlu

echo -n 222222|base64
MjIyMjIy


#创建文件vim secret-file.yaml 
#secret-file.yaml 内容

apiVersion: v1
kind: Secret
metadata:
  name: yaml-secret
data:
  account: eWFtbEFkbWlu
  password: MjIyMjIy

引入

ubuntu@server:~$ sudo kubectl apply -f secret-file.yaml 
secret/yaml-secret created

查看Secret

#查看已经创建的Secret 列表
ubuntu@server:~$ sudo kubectl get secrets
NAME                  TYPE                                  DATA   AGE
default-token-2tjxh   kubernetes.io/service-account-token   3      39d
form-secret           Opaque                                2      3h56m
file-secret           Opaque                                2      3h34m
yaml-secret           Opaque                                2      42s


#查看某一个Secret 
ubuntu@server:~$ sudo kubectl describe secret yaml-secret
Name:         yaml-secret
Namespace:    default
Labels:       
Annotations:  

Type:  Opaque

Data
====
password:  6 bytes
account:   9 bytes

在Pod中使用Secret

1、通过Volume 获得Secret
#vim secret-pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: secret-pod
spec:
  containers:
  - name: secret-pod
    image: busybox
    args:
      - /bin/sh
      - -c
      - sleep 10;sleep 300000
    volumeMounts:
      - name: volume
        mountPath: "/etc/volume" #将volume mount到容器路径/etc/volume    
  volumes:
  - name: volume  
    secret:
      secretName: yaml-secret

引入并且查看结果

#引入并创建Pod
ubuntu@server:~$ sudo kubectl apply -f secret-pod.yaml 
pod/secret-pod created

#进入到容器内部
ubuntu@server:~$ sudo kubectl exec -it secret-pod /bin/sh

/etc/volume # ls /etc/volume/
account   password

#执行如下命令并查看结果
cat /etc/volume/account

#结果
yamlAdmin

cat /etc/volume/password

#结果
222222

结果:Kubenetes会在指定的路径/etc/volume 下为每条敏感数据创建一个文件,以明文存放在文件中。
当Secret 有需要更新时,可以通过如下命令进行更新。 更新后将会自动反馈到Pod容器内。

#获得gg2022 的base64值
ubuntu@server:~$ echo -n gg2022|base64
Z2cyMDIy

#vi secret-file.yaml
apiVersion: v1
kind: Secret
metadata:
  name: yaml-secret
data:
  account: eWFtbEFkbWlu
  password: Z2cyMDIy               #这里把Z2cyMDIy 赋值到password里


#重新引入到Pod
ubuntu@server:~$ sudo kubectl apply -f secret-file.yaml 
secret/yaml-secret configured

#大约数秒后,我们再进入到容器去查看结果
ubuntu@server:/etc$ sudo kubectl exec -it secret-pod /bin/sh

cat /etc/volume/password
#输出的结果已经变为gg2022
gg2022

2、通过环境变量读取Secret
#vim env-pod.yaml

#env-pod 的内容
apiVersion: v1
kind: Pod
metadata:
  name: env-pod
spec:
  containers:
  - name: env-pod
    image: busybox
    args:
      - /bin/sh
      - -c
      - sleep 10; sleep 300000
    env:
      - name: SECRET_ACCOUNT
        valueFrom:
          secretKeyRef:
            name: yaml-secret
            key: account
      - name: SECRET_PASSWORD
        valueFrom:
          secretKeyRef:
            name: yaml-secret
            key: password

对env-pod.yaml 文件进行引入并创建Pod

ubuntu@server:~$ sudo kubectl apply -f env-pod.yaml 
pod/env-pod created

进入到Pod容器内,读取自动加载好的环境变量

ubuntu@server:~$ sudo kubectl exec -it env-pod /bin/sh

#读取环境变量的值
echo $SECRET_ACCOUNT
yamlAdmin

echo $SECRET_PASSWORD
gg2022

在实际场景中,我会偏向通过yaml方式创建Secret。
除了Secret,Kubenetes 还提供了ConfigMap的方式来创建容器数据。ConfigMap 与Secret 的用法非常相似,区别点在于ConfigMap可以通过明文方式存储数据,适合存放非敏感数据,例如配置信息。
基于两者用法是一致,只是命令的关键字不同,此文就不再详述ConfigMap的用法。

你可能感兴趣的:(Kubernetes(k3s)进阶学习(五) -- Secret应用)