背景
- 需要定义应用的配置 所以需要外接一个存储 但又不能是存储卷 因为要考虑稳定性和可靠性
- 能够动态的修改配置文件 并且可以让应用动态的生效
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
创建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-从文件中创建
创建configmap-从目录中创建
使用场景
nginx配置文件全部从configmap中读取
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
通过卷接口的方式 去引用configmap
配置文件
- 命令式: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根据其用途等,还有类型上的区分
常见示例 github.com/iKubernetes…
Image Pull Secret
dockercfg及dockerconfigjson类型的Secret主要用于从私有Image Registry中下载容器镜像
其引用定义在pod.spec.imagePullSecrets字段上