kubernetes-ConfigMap和Secret、环境变量、卷挂载示例

666 阅读8分钟

背景

  • 需要定义应用的配置 所以需要外接一个存储 但又不能是存储卷 因为要考虑稳定性和可靠性
  • 能够动态的修改配置文件 并且可以让应用动态的生效

image.png

ConfigMap介绍

ConfigMap和Secret是Kubernetes系统上两种特殊类型的存储卷

  • ConfigMap是抽象出一个volume 是一个特殊类型的存储卷(通过apiserver存放在etcd)
  • ConfigMap用于为容器中的应用提供配置数据以定制程序的行为,而敏感的配置信息,例如密钥、证书等则通常由Secret来配置
  • ConfigMap和Secret将相应的配置信息保存于资源对象中,而后在Pod对象上支持以存储卷 的形式将其挂载并加载相关的配置,从而降低了配置与镜像文件的耦合关系,提高了镜像复用能力
  • Kubernetes借助于ConfigMap对象实现了将配置文件从容器镜像中解耦,从而增强了工作 负载的可移植性,使其配置更易于更改和管理,并避免了将配置数据硬编码到Pod配置清单中
  • 明文信息存储
  • 1MB 的限制

ConfigMap和Secret 特性

  • 都是数据存储类型的资源 是k8s的一等公民
  • 数据储存在etcd中
  • 支持两种访问方式
    • env 环境变量赋值(修改ConfigMap和Secret 不会修改ENV)
    • volume 基于卷的方式 引用配置信息(修改ConfigMap和Secret 容器内的配置文件会修改)
      • 容器内部 会以时间戳命名生成一个目录 然后软链到实际的配置文件
  • 配置和应用解耦
  • 主要负责提供key-value格式的数据项
    • 单行字符串:常用于保存环境变量值
    • 多行字串:常用于保存配置文件的内容

yml示例

    apiVersion: v1 
    kind: ConfigMap 
    metadata: 
        name: myapp-confs 
    data: 
    PORT: "8080" 
    myserver-status.cfg: | 
        location /nginx-status { 
        stub_status on;
        access_log off; 
        }

ConfigMap支持使用data或binaryData字段嵌套一至多个键值数据项

Secret支持使用data或stringData(非base64编码的明文格式)字段嵌套一至多个键值数据项

从Kubernetes v1.19版本开始,ConfigMap和Secret支持使用immutable字段创建不可变实例

创建ConfigMap 资源

创建ConfigMap对象的方法有两种

命令式命令

字面量

kubectl create configmap NAME --from-literal=os_version="el8" 

从文件加载:

kubectl create configmap NAME --from-file=[key=]/PATH/TO/FILE 

从目录加载:

kubectl create configmap NAME --from-file=[key=]/PATH/TO/DIR/

目录下每个文件的基名就是key 内容就是values

查看configmap资源

root@k8s-master01:~# kubectl get cm -n kube-system
NAME                                 DATA   AGE
coredns                              1      6d4h
extension-apiserver-authentication   6      6d4h
kube-proxy                           2      6d4h
kube-root-ca.crt                     1      6d4h
kubeadm-config                       1      6d4h
kubelet-config                       1      6d4h

查看key的详细配置

kubectl get cm kube-proxy -n kube-system -o yaml

image.png

创建configmap

root@k8s-master01:~# kubectl create configmap demoapp-cfg --from-literal=port=8080 --from-literal=host='127.0.0.1'
configmap/demoapp-cfg created

root@k8s-master01:~# kubectl get cm
NAME               DATA   AGE
demoapp-cfg        2      8s
kube-root-ca.crt   1      6d4h

root@k8s-master01:~# kubectl get cm demoapp-cfg -o yaml
apiVersion: v1
data:
  host: 127.0.0.1
  port: "8080"
kind: ConfigMap
metadata:
  creationTimestamp: "2023-03-08T05:15:19Z"
  name: demoapp-cfg
  namespace: default
  resourceVersion: "39847"
  uid: a37b5408-2bab-4862-8611-243031b25e24

创建configmap-从文件中创建

image.png

创建configmap-从目录中创建

image.png

使用场景

nginx配置文件全部从configmap中读取

github.com/iKubernetes…

apiVersion: v1
kind: Pod
metadata:
  name: configmaps-volume-demo
  namespace: default
spec:
  containers:
  - image: nginx:alpine
    name: nginx-server
    volumeMounts:
    - name: ngxconfs
      mountPath: /etc/nginx/conf.d/
      readOnly: true
  volumes:
  - name: ngxconfs
    configMap:
      name: nginx-config-files
      optional: false

通过环境变量env的方式 去引用configmap

image.png

通过卷接口的方式 去引用configmap

image.png

配置文件

  • 命令式:kubectl create -f
  • 声明式:kubectl apply -f

Secret介绍

  • Secret 用于存储敏感数据 只是对数据进行base64编码 而非加密
  • 环境变量可以存放到ConfigMap
  • pod只负责运行进程 配置从ConfigMap加载 或者 从 存储卷加载
  • 存储私密

支持类似于ConfigMap的创建方式,但Secret有类型子命令,而且不同类型在data或stringData字段中支持嵌套使用的key亦会有所有 同;

类型

  • generic 类型
  • tls类型 (ssl通信证书 私钥)

generic 类型

命令行

kubectl create secret generic NAME [--type=string] [--from-file=[key=]source] [--from-literal=key1=value1] 

示例 注意会自动执行base64编码

root@k8s-master01:~# kubectl create secret generic mysql-pass --from-literal=mysqlpassword=rootroot --dry-run=client -o yaml
apiVersion: v1
data:
  mysqlpassword: cm9vdHJvb3Q=
kind: Secret
metadata:
  creationTimestamp: null
  name: mysql-pass

解码

root@k8s-master01:~# echo cm9vdHJvb3Q=|base64 -d
rootrootroot@k8s-master01:~# 

除了后面docker-registry和tls命令之外的其它类型,都可以使用该命令中的--type选项进行定义,但有些类型有key的特定要求

tls类型

kubectl create secret tls NAME --cert=path/to/cert/file --key=path/to/key/file 

准备好 /root/certs.d 参考github.com/iKubernetes…

示例

/root
root@k8s-master01:~# kubectl create secret tls nginx-ssl-secret --cert=/root/certs.d/nginx.crt --key=/root/certs.d/nginx.key --dry-run=client -o yaml   
apiVersion: v1
data:
  tls.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURsVENDQW4yZ0F3SUJBZ0lVR2Zya05FeGZiS2N5Yy9LYkpLUXJ5MzRTcHI0d0RRWUpLb1pJaHZjTkFRRUwKQlFBd1dqRUxNQWtHQTFVRUJoTUNRMDR4RURBT0JnTlZCQWdNQjBKbGFXcHBibWN4RURBT0JnTlZCQWNNQjBKbAphV3BwYm1jeER6QU5CZ05WQkFvTUJrUmxkazl3Y3pFV01CUUdBMVVFQXd3TmQzZDNMbWxzYVc1MWVDNXBiekFlCkZ3MHlNREEwTVRVd05UQXdORE5hRncweU1EQTFNVFV3TlRBd05ETmFNRm94Q3pBSkJnTlZCQVlUQWtOT01SQXcKRGdZRFZRUUlEQWRDWldscWFXNW5NUkF3RGdZRFZRUUhEQWRDWldscWFXNW5NUTh3RFFZRFZRUUtEQVpFWlhaUApjSE14RmpBVUJnTlZCQU1NRFhkM2R5NXBiR2x1ZFhndWFXOHdnZ0VpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCCkR3QXdnZ0VLQW9JQkFRRE1pNSsyUStZTlNxeS9vVVhNQzAraklqc2puS2M5SzdjVzYweFhrQzZOa3lSY3BZSmwKdWM4ckFYRUxyZjUxMmJUWGhxb0hqVG5JeFExVFROeDNRbE9oTHBYVjJCbGtObVNzY0w0Uy9IL1VEWTlQayt0cwpiOGlEZSszdlBEQ1ZiQytvOEFYYUhUaktaQ0pXc0oxY0RJY0JGenQ0MFQzUWswL1hQcVYrM1pERWFNcW9LYklJCmRvbENLLzZiN1BlaElXVVFWeFVDK3NoZ0xVbjJReXJmK0UrRC9TQmZFOVd3UGp0YXdCeHdxaDZOczV1dEVsL0cKVmltbEMxM2tsWTNGQ1RMWEhFU3hNKzdGNlU2VUdpYm1CWFRsLzZlV1I2bmlVdW1kMjhyU2NneXVDTnA1NGY2cAp1VGFMK0ZNbG0wN0NiS3lLWHhDZHpVNXVrSFlOYXlqa3p3ck5BZ01CQUFHalV6QlJNQjBHQTFVZERnUVdCQlE1ClhNbkhJanZYZFVCb1BEd3BpbjdiVWN6SHJqQWZCZ05WSFNNRUdEQVdnQlE1WE1uSElqdlhkVUJvUER3cGluN2IKVWN6SHJqQVBCZ05WSFJNQkFmOEVCVEFEQVFIL01BMEdDU3FHU0liM0RRRUJDd1VBQTRJQkFRQlVwU1pSNUE5Rgo2bVZhSU16TUl0anZadXFpRDNpeG9PN3NEdEZCcGVsYVZNV0dIaTZ3cFlTL21kNkNmS0hQQ3pySDhnNmpWTGhaClRpRWd5OVREUG5wMmU0VWNBUzdYMVBPM21GWTVscGpVakxJZjR4bUZrUy9FdFQ1ZE5TbUF1NGxGN2ZrRkEraEYKc244b2s5bk9DNk05OVBxbmQ1SlpVR1pwRFJCK1NQblpIVzZ3R2JiSVd3R3hPQmNtejBBMHNJNTkyVm9POThYKwoxK2w4MEVmdkhjRDJQRmdmSzhqS3g5eEl0UjEwcnBtVE4yQmtPQlBiREZ4SHZEcTNjRlRBSVVhMGhWS04xT0xJCk1oSEsvVnJmRUxHanJvY0pTZEFxcGpPTFl0R2JQN09sWURHTzFPRDk2ZEVTYStWWTRXYnFqYzc5S0luREQrWnkKWVlqbkJKR2F5VExyCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K
  tls.key: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFb2dJQkFBS0NBUUVBekl1ZnRrUG1EVXFzdjZGRnpBdFBveUk3STV5blBTdTNGdXRNVjVBdWpaTWtYS1dDClpiblBLd0Z4QzYzK2RkbTAxNGFxQjQwNXlNVU5VMHpjZDBKVG9TNlYxZGdaWkRaa3JIQytFdngvMUEyUFQ1UHIKYkcvSWczdnQ3end3bFd3dnFQQUYyaDA0eW1RaVZyQ2RYQXlIQVJjN2VORTkwSk5QMXo2bGZ0MlF4R2pLcUNteQpDSGFKUWl2K20rejNvU0ZsRUZjVkF2cklZQzFKOWtNcTMvaFBnLzBnWHhQVnNENDdXc0FjY0tvZWpiT2JyUkpmCnhsWXBwUXRkNUpXTnhRa3kxeHhFc1RQdXhlbE9sQm9tNWdWMDVmK25sa2VwNGxMcG5kdkswbklNcmdqYWVlSCsKcWJrMmkvaFRKWnRPd215c2lsOFFuYzFPYnBCMkRXc281TThLelFJREFRQUJBb0lCQUNjeWpvMndIMUxtdjRvTgpqc0dXWFZHR3lzeDlSYk04UUY3ZEFvazVNU0tpVXZLS0tSM3phSmIyTk1Lbk9qODlWQ0dGUmVvaWp6TkJSOWR4CndFSCtiT1pUZGhVL3owWGNBcGpsRmhldldaTzZjWDh2ZW9zU05OdTFrUmdxY2FrQXpYVlRZZHUxZzkrTkp1TnoKL3dQWHhydFh4MmJVdWtMUktCaTRnYUI1TnpmY0FSdzBIWG9aUjExbVRydkhLSWRSQUx4Q21KR09aTlg5RjhGMQpsQ1dCN2hjWVNkRVg5MTBkT2VFTlRzUUNMeVJvaDdXWkJSejBEUVBYNnNJd2FJTGtFT0puSVQ0K3JYNldCZGdkCmRkRjN3L0ZYcGxFdW9BSVplSDJmZnkvMzNyTFpSSXlSZWFEVnJUeHFUMnVOQlVkbkJPN1NFa2VYV25kUEh2V2MKaUpRUGxTRUNnWUVBOXdGQmpzOGk2a0YrWDM1N09ueFpuZXB4WnVZMGhqRk5BcVdPSGlUMWsvcWt6T2pRSG1kMgpHSnJZZjc0OUc3VHB2R2Y2TytzalIvZm96ODVsdFViSnh5Wk1IK2JqQzgwM0VUeXp2TmlXZzE2MVp6Nyt5NGpKClI5dlhCS05vd0NlazVFYVRyZ3owZkp5bjJ1WlRDak1aUE1WVVFBRmlYc0RtUTAybUp6dVdwTmtDZ1lFQTAvNkkKTjg2a2szalRzaHhvTEM5VUR0K0x4VTVaUE8vS0t0a21SUEorYU1IbS9uUXJYazZ6a1pJVUF2OHIrOWZXVXdHbQpYUmd2QjVlaHAvT1htdkxLWEhSVmhhVjc3QTZvMEVQVFRrcU5iZU5GSHg1cVFObU85ZHdIVTNSTW5PeWk0TnluCmFJNlljNGIvMWJXdXlBYlVlc0tEdXI3L0FMOFo5UU1XVUVUb2pSVUNnWUF2bzY1aFBOSWZIRUtqYUdHY0JoL0MKdFZUcDQ3eDlwVVNWSGhrcTl6WG1OSkZVZEJLdnlvU2Nla0VIWWttbTdsMm1XT2VLWnUrSEVlbDFLdm15M05STgo5TFQ1OGk0WU9KeEdWczdUdlhKS0pCb1lyNjIwMDh6K2J3Z3BmTnJYTk00NHVPUUN6YnpaeTkwVCt4aEkvMUgrCnhwQlpSK3NSRzJOTjE4d1VCUW9wQVFLQmdFdnNHWDdiRytmUTJ3Z3Iwa2NZd0NML2ZvQXdPaGR2elZpaEltcUkKNmlxOFh1ejhUOWZibWNYbHFoTVVyZnpvNU5JZmdpUlBGL0RCSmwwUENWbXQ0RGxTVkpxamxJa0xDdnhqZmhiSQo3blBQZEI3YjlyTzQ5dEVvZHRzMWlJYWUzUXBwRys5L09pd055aXdRZ0VNVTV4Mzc4Yzk4dmJqWHVBVWVrT3c0CmNZeXRBb0dBTEtNazBwMUUrZHJtVzVuS3VMa2dyNDYzbmtlenBld2Y4eVJ2UHZQcUo4UkdobTBGblphOW1mQ0YKd1JCMDh1MkZ6YTRHSldEY0p2VG9kV3NtSmpCVHRMQ0wzaFlCSmNNQXNVNEdEbXBCZDdQMVBQQ1ZCb0JMeVJjbApyK2VTOFJzZTRwTERjOWdpQk9ZSGp4Q2hsVktSdVhESmh2V2k0azZVNGY5bStBNmp4STg9Ci0tLS0tRU5EIFJTQSBQUklWQVRFIEtFWS0tLS0tCg==
kind: Secret
metadata:
  creationTimestamp: null
  name: nginx-ssl-secret
type: kubernetes.io/tls
root@k8s-master01:~# 

通常,其保存cert文件内容的key为tls.crt,而保存private key的key为tls.key

docker-registry 类型

kubectl create secret docker-registry NAME --docker-username=user --docker-password=password --docker-email=email [--docker-server=string] [--from-file=[key=]source] 

示例 登录registry的账号保存 去私有仓库下载镜像·上传镜像的时候使用

kubectl create secret docker-registry NAME --docker-username=user --docker-password=password --docker-email=email
[--docker-server=string] [--from-file=[key=]source]

通常,从已有的json格式的文件加载生成的就是dockerconfigjson类型,命令行直接量生成的也是该类型

Secret根据其用途等,还有类型上的区分

image.png

常见示例 github.com/iKubernetes…

Image Pull Secret

dockercfg及dockerconfigjson类型的Secret主要用于从私有Image Registry中下载容器镜像

其引用定义在pod.spec.imagePullSecrets字段上

image.png