k8s之安全信息(Secret)及配置信息(ConfigMap)

Secret

  • secret也是k8s中的一个资源对象,主要用于保存轻量的敏感信息,比如数据库用户名和密码,令牌,认证密钥等。

  • 我们可以将这类敏感信息放在secret对象中,如果把它们暴露到镜像或者pod spec中稍显不妥,将其放在secret对象中可以更好地控制及使用,并降低意外暴露的风险。
    Secret可以使用volume或者环境变量的方式来使用这些轻量级数据。

Secret有三种类型:

Service Account:用来访问kubernetes API,由k8s自动创建,并且会自动挂载到pod的/run/secrets/kubernetes.io/serviceaccount 目录中。
Opaque:base64编码格式的Secret,用来存储密码,密钥等。
kubernetes.io/dockerconfigjson: 用来存储私有docker registry的认证信息。

secret可以通过命令行或YAML文件来创建,假设我们需要存放在secret对象中的信息:

1, 用户名:root
2,密码:123456

1,创建Secret

创建Secret有以下四种方法:
1.1 通过--from-literal(以文字的方法创建)

[[email protected] ~]# kubectl  create secret generic mysecret --from-literal=username=root --from-literal=password=123456
secret/mysecret created

//查看创建的secret:

//查看该secret的详细信息:

特点:每个--from-literal只能对应一条信息。比较繁琐。

1.2 通过--from-file(以文件的方式创建)

[[email protected] ~]# echo root > username
[[email protected] ~]# echo 123456 > password
[[email protected] ~]# kubectl create secret  generic newsecret --from-file=username --from-file=password
secret/newsecret created

//查看创建的secret:

[[email protected] ~]# kubectl  get  secrets  | grep newsecret
newsecret             Opaque                                2      64s

特点:同样是每个文件对应一条信息。每个文件中只能保存一个,为了保证机密性,导入后有必要将本地的文件删除掉。

1.3 通过--from-env-file(以变量的方式创建)

[[email protected] ~]# cat > env.txt <<EOF
> username=root
> password=123456
> EOF
[[email protected] ~]# kubectl  create secret generic env-secret --from-env-file=env.txt
secret/env-secret created

特点:可以在文件里面保存多条信息,文件env.txt中每条key=value对应一条信息条目。

1.4 通过yaml配置文件:
#文件中的敏感数据必须是通过 base64 编码后的结果。

[[email protected] ~]# echo root | base64
cm9vdAo=
[[email protected] ~]# echo 123456 | base64
MTIzNDU2Cg==

#编写yaml文件:

apiVersion: v1
kind: Secret
metadata:
  name: secret-app
data:       #该字段为存放数据的字段,与其他资源对象不同,没有spec字段。
  username: cm9vdAo=
  password: MTIzNDU2Cg==

//创建secert:

[[email protected] ~]# kubectl apply -f  secret.yaml
secret/secret-app created

//反向解析加密数据:

[[email protected] ~]# echo -n  cm9vdAo= | base64 --decode
root
[[email protected] ~]# echo -n MTIzNDU2Cg== | base64  --decode
123456

特点:便于保存,跨主机使用时会非常方便。

2,如何使用secret

一,以volume方式使用secret:
pod通过volume的方式使用secret:
pod的配置文件如下所示:

apiVersion: v1
kind: Pod
metadata:
  name: secret-pod
spec:
  containers:
  - name: secret-pod
    image: busybox
    args:
      - /bin/sh
      - -c
      - sleep 10; touch /tmp/healthy; sleep 3000
    volumeMounts:
    - name: foo
      mountPath: /etc/foo
      readOnly: true
  volumes:
  - name: foo
    secret:
      secretName: secret-app

(1)定义volume foo,来源为secret(secret-app)
(2)将foo mount到容器路径/etc/foo,可指定读写权限为readOnly。

//创建pod并在容器中读取secret:

[[email protected] secret]# kubectl apply -f  secret-pod.yaml
pod/secret-pod created
[[email protected] secret]# kubectl  exec  -it secret-pod /bin/sh
/ # cd /etc/foo/
/etc/foo # ls
password  username
/etc/foo # cat password
123456
/etc/foo # cat username
root

可以看到,k8s会在指定路径/etc/foo下为每条敏感数据创建一个文件,文件名就是数据条目的key,这里是/etc/foo/username和/etc/foo/password,value则以铭文存放在文件中。

(2)我们也可以自定义存放数据的文件名,完整的配置文件如下:

apiVersion: v1
kind: Pod
metadata:
  name: secret-pod
spec:
  containers:
  - name: secret-pod
    image: busybox
    args:
      - /bin/sh
      - -c
      - sleep 10; touch /tmp/healthy; sleep 3000
    volumeMounts:
    - name: foo
      mountPath: /etc/foo
      readOnly: true
  volumes:
  - name: foo
    secret:
      secretName: secret-app
      items:
      - key: username:
        path: my-group/my-username
      - key: password
        path: my-group/my-password

这时数据分别存放在/etc/foo/my-group/my-username和/etc/foo/my-group/my-password中。
//验证数据存放位置:

[[email protected] secret]# kubectl  delete -f secret-pod.yaml
pod "secret-pod" deleted
[[email protected] secret]# kubectl apply -f  secret-pod.yaml
pod/secret-pod created
[[email protected] secret]# kubectl  exec  -it secret-pod /bin/sh
/ # cd /etc/foo/
/etc/foo # ls
my-group
/etc/foo # cd my-group/
/etc/foo/..2020_02_03_05_37_09.892671465/my-group # cat my-password
123456
/etc/foo/..2020_02_03_05_37_09.892671465/my-group # cat my-username
root

(3)以volume方式使用secret支持动态更新:secret更新后,容器中的数据也会更新。
//我们有需求将password更新为“123456.com”

[[email protected] secret]# echo 123456.com | base64
MTIzNDU2LmNvbQo=

修改secret配置文件:

apiVersion: v1
kind: Secret
metadata:
  name: secret-app
data:
  username: cm9vdAo=
  password: MTIzNDU2LmNvbQo=

//更新secret:

[[email protected] secret]# kubectl apply -f  secret.yaml
secret/secret-app configured

//验证password是否更新成功:

[[email protected] secret]# kubectl  exec  -it secret-pod /bin/sh
/ # cd /etc/foo/my-group/
/etc/foo/..2020_02_03_05_40_42.995350019/my-group # cat my-password
123456.com

特点:如果secert的数据发生变化,引用数据的资源对象内的数据也会随之改变,当secret更新-----pod也会更新。

二:以环境变量的方式使用
通过volume使用secret时,容器必须从文件读取数据,会稍嫌麻烦,k8s还支持通过环境变量来使用secret。

pod配置文件示例如下:

apiVersion: v1
kind: Pod
metadata:
  name: secret-pod
spec:
  containers:
  - name: secret-pod
    image: busybox
    args:
      - /bin/sh
      - -c
      - sleep 10; touch /tmp/healthy; sleep 3000
    env:
      - name: SECRET_USERNAME
        valueFrom:
          secretKeyRef:
            name: secret-app
            key: username
      - name: SECRET_PASSWORD
        valueFrom:
          secretKeyRef:
            name: secret-app
            key: password

//创建pod并读取secret:

[[email protected] secret]# kubectl apply -f  secret-pod.yaml
pod/secret-pod created
[[email protected] secret]# kubectl exec  -it secret-pod /bin/sh
/ # echo $SECRET_USERNAME
root
/ # echo $SECRET_PASSWORD
123456.com

(2)验证:接下来我们修改secret中password的值,查看pod内的数据是否会改变?
经过测试,发现pod中的值是不会发生改变的。

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

configMap

  • Secret可以为pod提供密码,Token,私钥等敏感数据。而对于一些非敏感数据,比如应用的配置信息,则可以用ConfigMap。
  • ConfigMap与secret非常相似,主要不同的是,他保存的数据是以明文的方式存放。

假设我们需要存放在ConfigMap对象中的信息:

config1=xxx
config2=yyy

1,创建ConfigMap

同样拥有以下四种方法:
1.1 通过--from-literal创建:

[[email protected] configMap]# kubectl create configmap configmap1 --from-literal=config1=xxx --from-literal=config2=yyy
configmap/configmap1 created

//查看configmap信息:

可以看到保存的数据是以明文的方式存放。

特点:每个--from-literal对应一条信息。

1.2 通过--from-file创建:

[[email protected] configMap]# echo xxx > config1
[[email protected] configMap]# echo yyy > config2
//创建configmap:
[[email protected] configMap]# kubectl create configmap configmap2 --from-file=config1 --from-file=config2
configmap/configmap2 created

特点:每个文件对应一条信息,每个文件中只能保存一个,为了机密性,导入后需要将本地的文件删除掉。

1.3 通过--from-env-file的方式创建:

[[email protected] configMap]# cat > env.txt <<EOF
> config1=xxx
> config2=yyy
> EOF

//创建configmap:

[[email protected] configMap]# kubectl create configmap configmap3 --from-env-file=env.txt
configmap/configmap3 created

特点:可以再文件里面保存多条信息,文件env.txt中每条key=value 对应一条信息条目。

1.4 通过yaml配置文件:
#文件中的敏感数据必须是通过 base64 编码后的结果。
configmap配置文件如下:

apiVersion: v1
kind: ConfigMap
metadata:
  name: configmap-app
data:
  config1: xxx   #文件中的数据直接以明文输入即可
  config2: yyy

//创建configmap:

 [[email protected] configMap]# kubectl apply -f  configmap.yaml
configmap/configmap-app created

特点:便于保存,跨主机使用时会非常方便。

2,数据的引用

与Secret一样,pod也可以通过volume或者环境变量的方式使用secret。
一:volume方式
yaml配置文件如下:

apiVersion: v1
kind: Pod
metadata:
  name: configmap-pod
spec:
  containers:
  - name: configmap-pod
    image: busybox
    args:
      - /bin/sh
      - -c
      - sleep 10; touch /tmp/healthy; sleep 3000
    volumeMounts:
    - name: foo
      mountPath: /etc/foo
  volumes:
  - name: foo
    configMap:
      name: configmap-app

//创建pod,并在pod中读取数据:

[[email protected] configMap]# kubectl apply -f configmap-pod.yaml
pod/configmap-pod created
[[email protected] configMap]# kubectl exec  -it configmap-pod /bin/sh
/ # cd /etc/foo/
/etc/foo # ls
config1  config2
/etc/test # cat config1
xxx
/etc/test # cat config2
yyy

二:env环境变量方式
yaml配置文件内容如下所示:

apiVersion: v1
kind: Pod
metadata:
  name: configmap-pod
spec:
  containers:
  - name: configmap-pod
    image: busybox
    args:
      - /bin/sh
      - -c
      - sleep 10; touch /tmp/healthy; sleep 3000
    env:
      - name: CONFIG1
        valueFrom:
          configMapKeyRef:
            name: configmap-app
            key: config1
      - name: CONFIG2
        valueFrom:
          configMapKeyRef:
            name: configmap-app
            key: config2

//创建pod并查看pod中的数据:

[[email protected] configMap]# kubectl  delete -f  configmap-pod.yaml
pod "configmap-pod" deleted
[[email protected] configMap]# kubectl  apply -f  configmap-pod.yaml
pod/configmap-pod created
[[email protected] configMap]# kubectl exec  -it configmap-pod /bin/sh
/ # echo $CONFIG1
xxx
/ # echo $CONFIG2
yyy

经过测试:同样configmap和secret的两种引用方式一样,volume挂载的方式,如果configmap的数据更新,引用的资源对象内的数据也会更新,而以env环境变量的方式,则不支持动态更新(可自己进行测试验证)。

注意:以上只是例子,要知道在大多数情况下,配置信息都是以文件形式提供,所以创建ConfigMap时一般只采用--from-file或YAML方式,而读取ConfigMap时通常采用volume方式。

小结:
向pod传递配置信息。如果信息需要加密,可使用Secret; 如果是一般的配置信息,则可使用ConfigMap。
Secret和ConfigMap支持四种定义方法,pod在使用它们时,可以选择volume方式或环境变量方式,不过只有volume方式支持动态更新。

原文地址:https://blog.51cto.com/13972012/2468955

时间: 2024-11-02 17:48:16

k8s之安全信息(Secret)及配置信息(ConfigMap)的相关文章

k8s之安全信息(secret)及配置信息(configmap)管理

应用启动过程中可能需要一些敏感信息,比如访问数据库的用户名密码或者秘钥.将这些信息直接保存在容器镜像中显然不妥,Kubernetes 提供的解决方案是 Secret. Secret 会以密文的方式存储数据,避免了直接在配置文件中保存敏感信息.Secret 会以 Volume 的形式被 mount 到 Pod,容器可通过文件的方式使用 Secret 中的敏感数据:此外,容器也可以环境变量的方式使用这些数据. Secret 可通过命令行或 YAML 创建.比如希望 Secret 中包含如下信息: 用

log4net截取配置错误信息,(验证配置信息是否配置正确)

在</system.web>之后 <!--log4错误日志配置:开始--> <system.diagnostics> <trace autoflush="true"> <listeners> <add name="textWriterTraceListener" type="System.Diagnostics.TextWriterTraceListener" initialize

JavaWeb学习之Servlet(四)----ServletConfig获取配置信息、ServletContext的应用

[声明] 欢迎转载,但请保留文章原始出处→_→ 文章来源:http://www.cnblogs.com/smyhvae/p/4140877.html 联系方式:[email protected] [正文] 一.ServletConfig:代表当前Servlet在web.xml中的配置信息(用的不多) String getServletName()  -- 获取当前Servlet在web.xml中配置的名字 String getInitParameter(String name) -- 获取当前S

JavaWeb学习之Servlet(四)----ServletConfig获取配置信息、ServletContext的应用(转)

JavaWeb学习之Servlet(四)----ServletConfig获取配置信息.ServletContext的应用 [声明] 欢迎转载,但请保留文章原始出处→_→ 文章来源:http://www.cnblogs.com/smyhvae/p/4140877.html [正文] 一.ServletConfig:代表当前Servlet在web.xml中的配置信息(用的不多) String getServletName()  -- 获取当前Servlet在web.xml中配置的名字 String

k8s通过configmap管理应用配置信息

Secret 可以为 Pod 提供密码.Token.私钥等敏感数据:对于一些非敏感数据,比如应用的配置信息,则可以用 ConfigMap. ConfigMap 的创建和使用方式与 Secret 非常类似,主要的不同是数据以明文的形式存放. 1.configMap的创建 与 Secret 一样,ConfigMap 也支持四种创建方式: 1.1通过 --from-literal: kubectl create configmap myconfigmap --from-literal=config1=

Yii 配置信息 配置项(Configuration)

1 配置项(Configuration) 2 3 说到配置项,读者朋友们第一反应是不是Yii的配置文件?这是一段配置文件的代码: 4 5 1 6 2 7 3 8 4 9 5 10 6 11 7 12 8 13 9 14 10 15 11 16 12 17 13 18 14 19 15 20 16 21 17 22 18 23 19 24 20 25 21 26 22 27 23 28 24 29 25 30 26 31 27 32 28 33 29 34 30 35 31 36 32 37 33

JavaWEB中读取配置信息

第一种方法是使用java.io和java.util包,缺点是路径的概念要清晰, 例子: Properties prop = new Properties(); InputStream in = getClass().getResourceAsStream("/common.properties"); try { prop.load(in); pool = new JedisPool(config, prop.getProperty("pay.redis.url"))

log4j的配置信息

首先,在项目中的classes 中新建立一个log4j.properties文件即可: 在实际编程时,要使Log4j真正在系统中运行事先还要对配置文件进行定义.定义步骤就是对Logger.Appender及Layout的分别使用.Log4j支持两种配置文件格式,一种是XML格式的文件,一种是java properties(key=value)[Java特性文件(键=值)].(这里只说明properties文件) 1.配置根Logger 其语法为: log4j.rootLogger = [ lev

设置Webdriver启动chrome为默认用户的配置信息

Webdriver 启动Chrome浏览器时,默认是打开一个新用户,而非默认用户,即新用户没有我们安装扩展程序.但在实际应用中,我们会需要 默认用户安装的一些扩展程序,比如对于某些js或者css样式,需要代理才能访问成功,使用默认用户就显得尤为重要(因为你不可能在新用户在安装扩展程序再继续测试). 如图: a)默认用户的扩展: 在锁定chrome的任务栏打开的状态: b) WebDriver打开的新用户的扩展: 在锁定chrome的任务栏打开的状态: ----------------------