k8s
组件 资源清单
pod 生命周期
pod 控制器
服务发现
runcher
KubeSphere
Helm
helm命令
helm 常用内置对象
helm 内置函数
helm 的逻辑 和 流程控制
helm 中变量在作用域、列表、元祖、字典中的引用
helm 使用define定义子模版、template和include调用
helm 获取其他文件的内容和文件名
社区的Helm chart仓库
helm几个常用仓库
存储 configMap
进入k8s pod
k8s Node节点的调试
k8s 部署
sealos 部署
kubeadm 1.28部署
增加 node 节点
在aws 上自建k8s
利用NFS动态提供Kubernetes后端存储卷
rook-ceph
CephFS挂载
Ceph Dashboard
ingress
k8s集成kube-prometheus
ServiceMonitor 添加配置
Prometheus 长期远程存储方案 VictoriaMetrics
解决ControllerManager、Scheduler、watchdog监控问题
抓取配置说明
kubernetes配置imagePullSecrets秘钥来拉取镜像
在 Kubernetes 裡跑 curl 來測試內部服務
MetalLB
cloudflare-tunnel-ingress-controller
K8S kubectl 自动补全
argocd
helm部署redis-culster集群
改变默认 StorageClass
自定义指标HPA
istio
kiali
k8s接入graylog
Labels
DNS
HPA
ConfigMap挂载导致容器目录覆盖的问题
污点容忍度
身份认证与权限 RBAC
command
运行crictl ps -a 报错
etcd
cka证书
cert-manager
Kubernetes 创建普通账号
部署 metrics-server 指标
deployment 重启
Kubernetes中如何优雅的解决Pod时区问题
alertmanager
oom killed
eks挂载efs
eks创建集群
eksctl awscli kubectl
污点和容忍度
Kubernetes 删除namespace Terminating解决脚本
k8s 部署 kafka 集群
ack ingress获取客户端客户端真实IP
ingress 反向代理 ws
本文档使用 MrDoc 发布
-
+
首页
存储 configMap
## configmap 你可以通过命令kubectl create configmap -h帮助信息查看具体的创建。 configmap有三种常见创建方式: 1. 通过yaml / json文件创建(推荐) 这种是我比较推荐的方式,创建configmap.yaml: ```yaml apiVersion: v1 kind: ConfigMap metadata: name: test-conf namespace: test data: # 类属性键;每一个键都映射到一个简单的值 player_initial_lives: "3" ui_properties_file_name: "user-interface.properties" # 类文件键 game.properties: | enemy.types=aliens,monsters player.maximum-lives=5 user-interface.properties: | color.good=purple color.bad=yellow allow.textmode=true test-conf: |+ SESSION_LIFETIME: 3600 URL: "http://test-server:8080" ``` 执行命令: ``` kubectl create -f configmap.yaml ``` 若报错:"namespace 'test' not found",则需要先创建namespace: ``` kubectl create namespace test ``` 2. 通过--from-file 分别指定单个文件和目录,指定目录可以创建一个包含该目录中所有文件的configmap: ``` kubectl create configmap *** --from-file=/path ``` 将--from-file指定为单个文件就可以从单个文件中创建: ``` kubectl create configmap *** --from-file=file1 ``` 其中,--from-file可以使用多次,比如: ``` kubectl create configmap *** --from-file=file1 --from-file=file2 ``` 3. 通过key-value字符串创建 ``` kubectl create configmap *** --from-literal=config1=123 --from-literal=config2=234 ``` 4. 通过env文件创建 通过环境文件创建: ``` kubectl create configmap *** --from-env-file=env.txt ``` 其中,env.txt的文件格式为: ``` config1=*** config2=*** ``` 当使用多个--from-env-file从多个数据源创建configmap时,仅最后一个env文件有效。 ### 查看 可以使用以下命令查看创建成功的configmap: ![](/media/202307/2023-07-07_101434_7448020.6348953971346708.png) ### 使用 configmap创建成功之后,如何在pod中使用呢?有以下几种方法: #### env 用作环境变量 通过环境变量获取ConfigMap中的内容。 首先创建configmap: ``` kubectl create configmap test-config --from-literal=env_model=prd -n test ``` 接下来用作环境变量,创建pod.yaml: ``` apiVersion: v1 kind: Pod metadata: name: test-pod namespace: test spec: containers: - name: test-container image: busybox command: ["/bin/sh","-c","sleep 60000"] env: - name: config_env1 #在pod中env的name valueFrom: configMapKeyRef: name: test-env #configmap name key: config_env1 #configmap 中的key ``` 执行命令创建Pod: ``` kubectl create -f pod.yaml ``` 创建成功之后,执行命令查看pod的详细信息,可以看到已经将configmap中的配置添加到环境变量: ``` kubectl describe pod test-pod -n test ``` 同时,也支持多个configmap共同创建环境变量。 #### volume 将config挂载到pod中 通过Volume挂载的方式将ConfigMap中的内容挂载为容器内部的文件或目录,这是我平时用的较多的方式。 接下来使用最开始创建的test-conf为例说明,将configmap挂载到特定目录,并保存为指定文件: ``` bash-5.1# kubectl get cm test-config -n test NAME DATA AGE test-config 1 115m bash-5.1# cat ./test-pod2.yaml apiVersion: v1 kind: Pod metadata: name: test-pod2 namespace: test spec: containers: - name: test-container image: busybox command: ["/bin/sh","-c","sleep 6000"] volumeMounts: - name: test-volume mountPath: /etc/config volumes: - name: test-volume configMap: name: test-config #configmap name items: - key: test-config.yaml #configmap 中文件名称 path: config.yaml ``` #### configmap 作为命令 将ConfigMap用作命令行参数时,需要先把ConfigMap的数据保存在环境变量中,然后通过$(VAR_NAME)的方式引用环境变量。 ``` bash-5.1# kubectl get cm test-env -n test NAME DATA AGE test-env 2 138m bash-5.1# cat ./test-pod3.yaml apiVersion: v1 kind: Pod metadata: name: test-pod3 namespace: test spec: containers: - name: test-container image: busybox command: [ "/bin/sh", "-c", "echo $(CONFIG_ENV1) $(CONFIG_ENV2)" ] env: - name: CONFIG_ENV1 valueFrom: configMapKeyRef: name: test-env #configmap name key: config_env1 - name: CONFIG_ENV2 valueFrom: configMapKeyRef: name: test-env #configmap name key: config_env2 restartPolicy: Never bash-5.1# kubectl logs test-pod3 -n test env1 env2 # 输出了configmap env 中的值 ``` ## configmap 官方实例 ```yaml apiVersion: v1 kind: ConfigMap metadata: name: game-demo data: # 类属性键;每一个键都映射到一个简单的值 player_initial_lives: "3" ui_properties_file_name: "user-interface.properties" # 类文件键 game.properties: | enemy.types=aliens,monsters player.maximum-lives=5 user-interface.properties: | color.good=purple color.bad=yellow allow.textmode=true ``` ```yaml apiVersion: v1 kind: Pod metadata: name: configmap-demo-pod spec: containers: - name: demo image: alpine command: ["sleep", "3600"] env: # 定义环境变量 - name: PLAYER_INITIAL_LIVES # 请注意这里和 ConfigMap 中的键名是不一样的 valueFrom: configMapKeyRef: name: game-demo # 这个值来自 ConfigMap key: player_initial_lives # 需要取值的键 - name: UI_PROPERTIES_FILE_NAME valueFrom: configMapKeyRef: name: game-demo key: ui_properties_file_name volumeMounts: - name: config mountPath: "/config" readOnly: true volumes: # 你可以在 Pod 级别设置卷,然后将其挂载到 Pod 内的容器中 - name: config configMap: # 提供你想要挂载的 ConfigMap 的名字 name: game-demo # 来自 ConfigMap 的一组键,将被创建为文件 items: - key: "game.properties" path: "game.properties" - key: "user-interface.properties" path: "user-interface.properties" ``` ## sercret ### secret tls ``` kubectl create secret tls test-noblameops-local-tls --key test.noblameops.local-key.pem --cert test.noblameops.local.pem kubectl get secret ``` ## volume ### emptydir emptyDir 类型的 Volume 在 Pod 分配到 Node 上时被创建,Kubernetes 会在 Node 上自动分配一个目录,因此无需指定宿主机 Node 上对应的目录文件。 这个目录的初始内容为空,当 Pod 从 Node 上移除时,emptyDir 中的数据会被永久删除。 注:容器的 crashing 事件并不会导致 emptyDir 中的数据被删除。 ``` apiVersion: v1 kind: Pod metadata: name: test-pod spec: containers: - image: busybox name: test-emptydir command: [ "sleep", "3600" ] volumeMounts: - mountPath: /data name: data-volume volumes: - name: data-volume emptyDir: {} ``` ### hostpath hostPath 类型则是映射 node 文件系统中的文件或者目录到 pod 里。在使用 hostPath 类型的存储卷时,也可以设置 type 字段,支持的类型有文件、目录、File、Socket、CharDevice 和 BlockDevice。 使用场景: * 当运行的容器需要访问 Docker 内部结构时,如使用 hostPath 映射/var/lib/docker 到容器; * 当在容器中运行 cAdvisor 时,可以使用 hostPath 映射/dev/cgroups 到容器中; ``` apiVersion: v1 kind: Pod metadata: name: test-pod2 spec: containers: - image: busybox name: test-hostpath command: [ "sleep", "3600" ] volumeMounts: - mountPath: /test-data name: test-volume volumes: - name: test-volume hostPath: # directory location on host path: /data # this field is optional type: Directory ``` ## pv 存储卷 pv是一个抽象的概念,说白了相当于一个存储接口,不管你真实存储用的是nfs还是ceph还是其他的存储,只要是实现了`csi规范`的存储都可以使用。 pv状态 - available 空闲未绑定 - Bound 已经被pvc绑定 - Released pvc 被删除,资源已回收,但是pv 未被重新使用。 - Failed 自动回收失败 --- 声明一个pv ``` apiVersion: v1 kind: PersistentVolume metadata: name: pv0003 spec: capacity: storage: 5Gi #pv的容量 volumeMode: Filesystem #存储类型为文件系统 accessModes: #访问模式。 - ReadWriteOnce #可被单节点 读写 persistentVolumeReclaimPolicy: Recycle #回收策略 storageClassName: slow #创建 pv 的存储类名 ,需要与 pvc 的相同 mountOptions: #加载配置 - hard - nfsvers=4.1 nfs: #连接到 nfs path: /tmp #存储路径 server: 172.17.0.2 #nfs 服务地址 ``` ## pvc 持久卷申领 ![](/media/202310/2023-10-19_181415_3586260.5936918940305248.png)
admin
2023年10月19日 19:02
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
分享
链接
类型
密码
更新密码