k8s配置管理——secret与configmap

配置管理原理:

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

一、Secret

1.1 secret 简介

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:

作为挂载到一个或多个容器上的卷 中的文件。

作为容器的环境变量。

由 kubelet 在为 Pod 拉取镜像时使用。

应用场景:

凭据

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.3 secret资源的使用方式

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.1 configmap 简介

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 即可。

相关推荐
yBmZlQzJ1 小时前
财运到内网穿透域名解析技术机制与中立评估
运维·经验分享·docker·容器·1024程序员节
sim20202 小时前
把某个pod固定到某个节点
kubernetes
yBmZlQzJ3 小时前
内网穿透工具通过端口转发实现内外网通信
运维·经验分享·docker·容器·1024程序员节
DeepHacking3 小时前
Overleaf 本地Docker部署
运维·docker·容器
孤岛悬城4 小时前
46 Docker资源管理
docker·容器·云计算
学Linux的语莫7 小时前
kompose、docker转k8s
docker·容器·kubernetes
阿里云云原生8 小时前
探秘 AgentRun丨流量一大就瘫痪?如何解决 AI 模型调用之痛
云原生
是Yu欸8 小时前
从Ascend C算子开发视角看CANN的“软硬协同”
c语言·开发语言·云原生·昇腾·ascend·cann·开放社区
光头熊8 小时前
一次 nerdctl prune -a 导致 Kubernetes 节点不可用的复盘
kubernetes
码界奇点9 小时前
基于微服务架构的企业身份与访问管理系统设计与实现
微服务·云原生·架构·车载系统·毕业设计·源代码管理