Kubernetes:(十三)secret与configmap的那些事

目录

一:Secret

1.1secret 简介

1.2创建及使用

1.2.1基于文件形式 

1.2.2基于参数创建secret 

1.2.3secret资源的使用方式 

二:configmap 

2.1configmap 简介

2.2创建 ConfigMap  

2.2.1基于kubectl形式

2.2.2基于变量参数形式

前言:配置管理原理

当需要修改很多配置文件时,创建一个配置资源,将配置资源挂载到各个pod当中,给pod所使用,这样就只要修改配置资源就可以了


一:Secret

1.1secret 简介

Secret 解决了密码、token、秘钥等敏感数据的配置问题,而不需要把这些敏感数据暴露到镜像或者 Pod Spec 中。Secret 可以以 Volume 或者环境变量的方式使用。

Secret:保存加密文件 ;加密数据并存放在Etcd中,让Pod的容器以挂载Volume方式访问

secret 可选参数有三种:

  • generic: 通用类型,通常用于存储密码数据。
  • tls:此类型仅用于存储私钥和证书。
  • docker-registry: 若要保存 docker 仓库的认证信息的话,就必须使用此种类型来创建。

Secret 类型:

  • Service Account:用于被 service  account 引用。service accout 创建时 Kubernetes 会默认创建对应的 secret。Pod 如果使用了 serviceaccount,对应的 secret 会自动挂载到 Pod 的/run/secrets/kubernetes.io/serviceaccount 目录中。
  • Opaque:base64 编码格式的 Secret,用来存储密码、秘钥等。可以通过 base64 --decode 解码获得原始数据,因此安全性弱。
  • kubernetes.io/dockerconfigjson:用来存储私有 docker registry 的认证信息

Pod 需要先引用才能使用某个 secret,Pod 有 3 种方式来使用 secret:

  1. 作为挂载到一个或多个容器上的卷 中的文件。
  2. 作为容器的环境变量。
  3. 由 kubelet 在为 Pod 拉取镜像时使用。

应用场景:凭据

官方网站:

Secrets | Kubernetes

1.2创建及使用

1.2.1基于文件形式 

1.创建用户名和密码文件

[root@master ~]# echo -n 'admin' > username.txt    ##创建username文件存放用户名admin;-n:不转行输出
[root@master ~]# echo -n '123456' > password.txt   ##创建password文件存放密码123456

2.查看资源 

[root@master ~]# kubectl create secret generic db-user-pass --from-file=username.txt --from-file=password.txt    ##创以数据库形式的资源,以文件形式导入凭据存放
secret/db-user-pass created
[root@master ~]# kubectl get secret     ##查看secret资源

[root@master ~]# kubectl describe secret db-user-pass 
##查看资源详细信息

1.2.2基于参数创建secret 

1.创建变量参数,先通过64位编码方式,明文转密文

[root@master ~]# echo -n 'admin' | base64    ##基于用户名生成64位编码
YWRtaW4=   ##生成的编码
[root@master ~]# echo -n '123456' | base64   ##基于密码生成64位编码
MTIzNDU2    ##生成的编码

2.编写yaml文件,引用密文创建secret

[root@master ~]# cd demo/
[root@master demo]# vim secret.yaml
apiVersion: v1
kind: Secret   ##资源格式
metadata:
  name: mysecret   ##资源名称
type: Opaque   ##opa凭证类型
data:  
  username: YWRtaW4=    ##复制生成的用户名编码
  password: MTIzNDU2    ##复制生成的密码编码

3.创建secret资源并查看信息

[root@master demo]# kubectl create -f secret.yaml     ##创建了配置资源
secret/mysecret created
[root@master demo]# kubectl get secret

1.2.3secret资源的使用方式 

1.使用secret中的变量导入到pod中

示例:将上面secret资源中的username和password重新赋值
key:username赋值给SECRET_USERNAME
key:password 赋值给SECRET_PASSWORD

[root@master demo]# vim secret-var.yaml
apiVersion: v1
kind: Pod   ##类型为pod
metadata:
  name: mypod
spec:
  containers:
  - name: nginx    ##名字为nginx
    image: nginx   ##镜像为nginx
    env:     ##环境代理
      - name: SECRET_USERNAME   ##username赋值给SECRET_USERNAME
        valueFrom:   ##值来自于谁
          secretKeyRef:
            name: mysecret     ##值来自于mysecret资源
            key: username   ##资源的值:username
      - name: SECRET_PASSWORD  ##password 赋值给SECRET_PASSWORD
        valueFrom:
          secretKeyRef:
            name: mysecret
            key: password
[root@master demo]# kubectl apply -f secret-var.yaml   ##创建资源
pod/mypod created
[root@master demo]# kubectl get pods    ##查看pod资源
NAME    READY   STATUS    RESTARTS   AGE
mypod   1/1     Running   0          29s
[root@master demo]# kubectl exec -it mypod bash    ##进入资源
root@mypod:/# echo $SECRET_USERNAME    ##输出username变量
admin
root@mypod:/# echo $SECRET_PASSWORD   ##输出PASSWORD变量
123456

进入pod查看环境变量 SECRET_PASSWORD 的值为 password

2.  以volume的形式挂载到pod的某个目录下

[root@master demo]# vim secret-vol.yaml    ##编写secret-vol文件
apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
  - name: nginx
    image: nginx
    volumeMounts:  ##容器卷挂载
    - name: foo    ##指明挂载卷的名称
      mountPath: "/etc/foo"   ##挂载的路径在容器中的/etc/foo
      readOnly: true   ##设置权限为只读模式
  volumes:   ##被挂载的外部资源
  - name: foo    ##创建挂载卷名称
    secret:
      secretName: mysecret     ## secret资源
[root@master demo]# kubectl delete -f secret-var.yaml       ##删除之前的secret资源
pod "mypod" deleted
[root@master demo]# kubectl create -f secret-vol.yaml      ##创建资源
pod/mypod created
[root@master demo]# kubectl get pods    ##查看资源
NAME    READY   STATUS    RESTARTS   AGE
mypod   1/1     Running   0          50s   ##创建成功
[root@master ~]# kubectl exec -it mypod bash   ##进入mypod资源
root@mypod:/# ls /etc/foo
password  username    ##挂载成功
root@mypod:/# cat /etc/foo/password 
123456     ##看到password对应的值
root@mypod:/etc/foo# cat username 
admin     ##看到username对应的值

二:configmap 

2.1configmap 简介

Configmap 是 k8s 中的资源对象,用于保存非机密性的配置的,数据可以用 key/value 键值对
形式保存,也可通过文件的形式保存。

作用:
我们在部署服务的时候,每个服务都有自己的配置文件,如果一台服务器上部署多个服务:nginx、tomcat、apache 等,那么这些配置都存在这个节点上,假如一台服务器不能满足线上高并发的要求,需要对服务器扩容,扩容之后的服务器还是需要部署多个服务:nginx、tomcat、apache,新增加的服务器上还是要管理这些服务的配置,如果有一个服务出现问题,需要修改配置文件,每台物理节点上的配置都需要修改,这种方式肯定满足不了线上大批量的配置变更要求。 所以,k8s 中引入了 Configmap资源对象,可以当成 volume 挂载到 pod 中,实现统一的配置管理。

ConfigMap 的主要作用就是为了让镜像和配置文件解耦,以便实现镜像的可移植性和可复用性。

特点:

Configmap 是 k8s 中的资源, 相当于配置文件,可以有一个或者多个 Configmap;
Configmap 可以做成 Volume,k8s pod 启动之后,通过 volume 形式映射到容器内部指定目录上;
容器中应用程序按照原有方式读取容器特定目录上的配置文件;
在容器看来,配置文件就像是打包在容器内部特定目录,整个过程对应用没有任何侵入。

应用场景:应用配置

使用 ConfigMap 的限制条件:

  • ConfigMap 需要在 Pod 启动前创建出来;
  • 并且只有当 ConfigMap 和 Pod 处于同一命名空间时,才可以被 Pod 引用;
  • 当 Pod 挂载 ConfigMap 绑定的目录时,目录下的目录并不会挂载到 Pod 内,只有目录下的文件会被挂载。

知识结构图:

2.2创建 ConfigMap  

2.2.1基于kubectl形式

[root@master demo]# vim redis.properties    ##创建redis的配置文件中需要的参数文件
redis.host=127.0.0.1    ##主机地址
redis.port=6379     ##端口
redis.password=123456    ##密钥
[root@master demo]# kubectl create configmap redis-config --from-file=redis.properties  ##创建configmap资源,名称为redis-config文件来自于redis.properties文件
configmap/redis-config created
[root@master demo]# kubectl get configmap    ##查看资源
NAME           DATA   AGE
redis-config   1      69s
[root@master demo]# kubectl get cm    ##缩写查看资源
NAME           DATA   AGE
redis-config   1      95s
[root@master demo]# kubectl describe cm redis-config    ##查看参数信息

--from-file指定在目录下的所有文件都会被用在 ConfigMap 里边创建一个键值对,键的名字就是文件名,值就是文件里内容。 

创建mypod资源查看文件导入

[root@master demo]# kubectl delete pod/mypod   ##先将原先创建的mypod资源删除
pod "mypod" deleted
[root@master demo]# vim cm.yaml
apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
    - name: busybox  
      image: busybox     ##镜像为linux最小内核
      command: [ "/bin/sh","-c","cat /etc/config/redis.properties" ]   ##执行在pod中查看 /etc/config/redis.properties文件中的数据信息
      volumeMounts:
      - name: config-volume    ##使用指定资源的标签
        mountPath: /etc/config    ##挂载点
  volumes:  
    - name: config-volume   ##指定资源标签
      configMap:
        name: redis-config    ##指定的资源名称
  restartPolicy: Never
[root@master demo]# kubectl apply -f cm.yaml    ##创建资源
pod/mypod created
[root@master demo]# kubectl get pods    ##查看pod资源
NAME    READY   STATUS      RESTARTS   AGE
mypod   0/1     Completed   0          25s   ##执行完任务状态就为Completed
[root@master demo]# kubectl logs mypod     ##查看mypod的日志信息
redis.host=127.0.0.1
redis.port=6379
redis.password=123456

2.2.2基于变量参数形式

[root@master demo]# vim myconfig.yaml    ##创建变量资源
apiVersion: v1
kind: ConfigMap
metadata:
  name: myconfig
  namespace: default
data:
  special.level: info     ##定义两个键值
  special.type: hello
[root@master demo]# kubectl create -f myconfig.yaml    ##创建资源
configmap/myconfig created

创建mypod使用configmap资源输出变量参数

[root@master demo]# vim config-var.yaml
apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
    - name: busybox
      image: busybox
      command: [ "/bin/sh", "-c", "echo $(LEVEL) $(TYPE)" ]    ##输出LEVEL和TYPE两个变量
      env:     ##定义环境变量
        - name: LEVEL     ##定义LEVEL变量
          valueFrom:    ##值来自于
            configMapKeyRef:   ##来自于configMap类型资源
              name: myconfig    ##创建的configMap的资源
              key: special.level    ##key来自于configMap中的special.level
        - name: TYPE    ##定义TYPE变量
          valueFrom:
            configMapKeyRef:
              name: myconfig
              key: special.type
  restartPolicy: Never
[root@master demo]# kubectl delete pod mypod     ##删除重复的名称的资源
pod "mypod" deleted
[root@master demo]# kubectl apply -f config-var.yaml    ##创建mypod资源
pod/mypod created
[root@master demo]# kubectl logs mypod    ##通过查看日志查看变量的输出
info hello

在 K8s 1.6 版本后引入新字段 envFrom,可以实现 ConfigMap 中所有的 key:value 自动生成为环境变量。
env 和 envFrom 的区别:前者是可以自定义变量名,但需要重复性操作;后者是不能自定义变量名,但是很便捷。
configMapKeyRef 和 configMapRef 的区别:前者是需要指定 key 和 configmap,后者是只需要指定 configMap 即可。

猜你喜欢

转载自blog.csdn.net/ver_mouth__/article/details/126212172