Kubernetes
一、基础知识
1. 概念和术语
2. Kubernetes特性
3. 集群组件
4. 抽象对象
5. 镜像加速下载
二、安装部署kubeadm
1. 基础环境准备
2. 安装runtime容器(Docker)
3. 安装runtime容器(Contained)
4. Containerd进阶使用
5. 部署kubernets集群
6. 部署calico网络组件
7. 部署NFS文件存储
8. 部署ingress-nginx代理
9. 部署helm包管理工具
10. 部署traefik代理
11. 部署dashboard管理面板(官方)
12. 部署kubesphere管理面板(推荐)
12. 部署metrics监控组件
13. 部署Prometheus监控
14. 部署elk日志收集
15. 部署Harbor私有镜像仓库
16. 部署minIO对象存储
17. 部署jenkins持续集成工具
三、kubectl命令
1. 命令格式
2.node操作常用命令
3. pod常用命令
4.控制器常用命令
5.service常用命令
6.存储常用命令
7.日常命令总结
8. kubectl常用命令
四、资源对象
1. K8S中的资源对象
2. yuml文件
3. Kuberbetes YAML 字段大全
4. 管理Namespace资源
5. 标签与标签选择器
6. Pod资源对象
7. Pod生命周期与探针
8. 资源需求与限制
9. Pod服务质量(优先级)
五、资源控制器
1. Pod控制器
2. ReplicaSet控制器
3. Deployment控制器
4. DaemonSet控制器
5. Job控制器
6. CronJob控制器
7. StatefulSet控制器
8. PDB中断预算
六、Service和Ingress
1. Service资源介绍
2. 服务发现
3. Service(ClusterIP)
4. Service(NodePort)
5. Service(LoadBalancer)
6. Service(ExternalName)
7. 自定义Endpoints
8. HeadlessService
9. Ingress资源
10. nginx-Ingress案例
七、Traefik
1. 知识点梳理
2. 简介
3. 部署与配置
4. 路由(IngressRoute)
5. 中间件(Middleware)
6. 服务(TraefikService)
7. 插件
8. traefikhub
9. 配置发现(Consul)
10. 配置发现(Etcd)
八、存储
1. 配置集合ConfigMap
6. downwardAPI存储卷
3. 临时存储emptyDir
2. 敏感信息Secret
5. 持久存储卷
4. 节点存储hostPath
7. 本地持久化存储localpv
九、rook
1. rook简介
2. ceph
3. rook部署
4. rbd块存储服务
5. cephfs共享文件存储
6. RGW对象存储服务
7. 维护rook存储
十、网络
1. 网络概述
2. 网络类型
3. flannel网络插件
4. 网络策略
5. 网络与策略实例
十一、安全
1. 安全上下文
2. 访问控制
3. 认证
4. 鉴权
5. 准入控制
6. 示例
十二、pod调度
1. 调度器概述
2. label标签调度
3. node亲和调度
4. pod亲和调度
5. 污点和容忍度
6. 固定节点调度
十三、系统扩展
1. 自定义资源类型(CRD)
2. 自定义控制器
十四、资源指标与HPA
1. 资源监控及资源指标
2. 监控组件安装
3. 资源指标及其应用
4. 自动弹性缩放
十五、helm
1. helm基础
2. helm安装
3. helm常用命令
4. HelmCharts
5. 自定义Charts
6. helm导出yaml文件
十六、k8s高可用部署
1. kubeadm高可用部署
2. 离线二进制部署k8s
3. 其他高可用部署方式
十七、日常维护
1. 修改节点pod个数上限
2. 集群证书过期更换
3. 更改证书有效期
4. k8s版本升级
5. 添加work节点
6. master节点启用pod调度
7. 集群以外节点控制k8s集群
8. 删除本地集群
9. 日常错误排查
10. 节点维护状态
11. kustomize多环境管理
12. ETCD节点故障修复
13. 集群hosts记录
14. 利用Velero对K8S集群备份还原与迁移
15. 解决K8s Namespace无法正常删除的问题
16. 删除含指定名称的所有资源
十八、k8s考题
1. 准备工作
2. 故障排除
3. 工作负载和调度
4. 服务和网络
5. 存储
6. 集群架构、安装和配置
本文档使用 MrDoc 发布
-
+
home page
1. 配置集合ConfigMap
# 简介 1. 一个ConfigMap对象就是一系列配置数据的集合,这些数据可“注入”到Pod对象中,并为容器应用所使用,注入方式有挂载为存储卷和传递为环境变量两种。 2. ConfigMap对象将配置数据以键值对的形式进行存储,这些数据可以在Pod对象中使用或者为系统组件提供配置。无论应用程序如何使用ConfigMap对象中的数据,用户都完全可以通过在不同的环境中创建名称相同但内容不同的ConfigMap对象,从而为不同环境中同一功能的Pod资源提供不同的配置信息。 # 创建ConfigMap对象 用户可以根据目录、文件或直接值创建ConfigMap对象。命令的语法格式为:`kubectl create configmap <map-name> <data-source>` - <map-name>即为ConfigMap对象的名称,而<data-source>是数据源,它可以通过直接值、文件或目录来获取。无论是哪一种数据源供给方式,它都要转换为ConfigMap对象中的Key-Value数据,其中Key由用户在命令行给出或是文件数据源的文件名,它仅能由字母、数字、连接号和点号组成,而Value则是直接值或文件数据源的内容。 ## 基于值创建 使用“--from-literal”选项可在命令行直接给出键值对来创建ConfigMap对象,重复使用此选项则可以传递多个键值对 ```bash [root@k8s-master ~]# kubectl create configmap test-config --from-literal=username=root --from-literal=port=8888 configmap/test-config created ``` 查看ConfigMap对象test-config的相关信息 ```bash [root@k8s-master ~]# kubectl get configmaps test-config -o yaml apiVersion: v1 data: port: "8888" username: root kind: ConfigMap metadata: creationTimestamp: "2023-06-01T07:36:11Z" name: test-config namespace: default resourceVersion: "1260566" uid: 029e2a81-8295-41e8-bee7-cef82ef0eb99 [root@k8s-master ~]# kubectl describe configmaps test-config Name: test-config Namespace: default Labels: <none> Annotations: <none> Data ==== port: ---- 8888 username: ---- root BinaryData ==== Events: <none> ``` ## 基于文件创建 使用“--from-file”选项即可基于文件内容来创建ConfigMap对象,可以重复多次使用“--from-file”选项以传递多个文件内容: ```bash [root@k8s-master ~]# kubectl create configmap resolv-conf --from-file=/etc/resolv.conf configmap/resolv-conf created ``` 查看ConfigMap对象,其数据存储的键为文件名,值为文件内容 ```bash [root@k8s-master ~]# kubectl get configmaps resolv-conf -o yaml apiVersion: v1 data: resolv.conf: | # Generated by NetworkManager nameserver 114.114.114.114 kind: ConfigMap metadata: creationTimestamp: "2023-06-01T07:38:47Z" name: resolv-conf namespace: default resourceVersion: "1260855" uid: aa534bec-405f-4a7f-8692-0025e5ea36c8 [root@k8s-master ~]# kubectl describe configmaps resolv-conf Name: resolv-conf Namespace: default Labels: <none> Annotations: <none> Data ==== resolv.conf: ---- # Generated by NetworkManager nameserver 114.114.114.114 BinaryData ==== Events: <none> ``` ## 基于目录创建 将“--from-file”选项后面所跟的路径指向一个目录路径就能将目录下的所有文件一同创建于同一ConfigMap资源中,将/etc/docker/目录下的所有文件都保存于docker-config-files对象中: ```bash [root@k8s-master ~]# kubectl create configmap docker-config --from-file=/etc/docker/ configmap/docker-config created ``` 查看创建的configmap资源,此目录中包含daemon.json key.json两个配置文件。创建ConfigMap资源时,它们会被分别存储为两个键值数据 ```bash [root@k8s-master ~]# kubectl get configmaps docker-config -o yaml apiVersion: v1 data: daemon.json: | { "registry-mirrors": [ "https://mirror.ccs.tencentyun.com", "https://o2j0mc5x.mirror.aliyuncs.com" ], "insecure-registries": [ "http://192.168.10.100" ], "exec-opts": [ "native.cgroupdriver=systemd" ] } key.json: '{"crv":"P-256","d":"MGbNgukrge_1ti8--lAoldTBH2biZU-P_1eiR6GLov4","kid":"R3S5:BX3W:DP3O:XRSY:7PJF:FOTL:N3RC:PXWN:L27S:EHPM:P22A:HY7N","kty":"EC","x":"ehNIu7K5qekvIGYffIUf1-iIIhO7qJ-YK79H54otT9k","y":"lsTOxp-7BNIMmWFLHuO1Jrl3my2LzDeNmMOejylGYy4"}' kind: ConfigMap metadata: creationTimestamp: "2023-06-01T07:40:59Z" name: docker-config namespace: default resourceVersion: "1261096" uid: 2ae86fd7-e193-4798-9ef9-511ebbc9086b [root@k8s-master ~]# kubectl describe configmaps docker-config Name: docker-config Namespace: default Labels: <none> Annotations: <none> Data ==== daemon.json: ---- { "registry-mirrors": [ "https://mirror.ccs.tencentyun.com", "https://o2j0mc5x.mirror.aliyuncs.com" ], "insecure-registries": [ "http://192.168.10.100" ], "exec-opts": [ "native.cgroupdriver=systemd" ] } key.json: ---- {"crv":"P-256","d":"MGbNgukrge_1ti8--lAoldTBH2biZU-P_1eiR6GLov4","kid":"R3S5:BX3W:DP3O:XRSY:7PJF:FOTL:N3RC:PXWN:L27S:EHPM:P22A:HY7N","kty":"EC","x":"ehNIu7K5qekvIGYffIUf1-iIIhO7qJ-YK79H54otT9k","y":"lsTOxp-7BNIMmWFLHuO1Jrl3my2LzDeNmMOejylGYy4"} BinaryData ==== Events: <none> ``` ## 使用清单创建配置值 基于配置文件创建ConfigMap资源时,它所使用的字段包括通常的apiVersion、kind和metadata字段,以及用于存储数据的关键字段“data” ```yaml [root@k8s-master ~]# cat config-value.yaml apiVersion: v1 kind: ConfigMap metadata: name: myconfigmap data: log_level: INFO log_file: /var/log/my.log [root@k8s-master ~]# kubectl create -f config-value.yaml configmap/myconfigmap created ``` 查看资源信息 ```yaml [root@k8s-master ~]# kubectl get configmaps myconfigmap -o yaml apiVersion: v1 data: log_file: /var/log/my.log log_level: INFO kind: ConfigMap metadata: creationTimestamp: "2023-06-01T07:44:24Z" name: myconfigmap namespace: default resourceVersion: "1261474" uid: a77af1ff-deb7-4e73-a14e-f5e72da21696 [root@k8s-master ~]# kubectl describe configmaps myconfigmap Name: myconfigmap Namespace: default Labels: <none> Annotations: <none> Data ==== log_file: ---- /var/log/my.log log_level: ---- INFO BinaryData ==== Events: <none> ``` ## 基于清单创建配置文件 可以使用资源清单创建服务的配置文件,用法如下: ```yaml [root@k8s-master ~]# cat config-file.yaml apiVersion: v1 kind: ConfigMap metadata: name: redis-conf data: redis.conf : |- # 配置文件名称,下面存放配置文件内容 port 6379 tls-port 16379 [root@k8s-master ~]# kubectl apply -f config-file.yaml configmap/redis-conf created ``` 查看资源信息 ```yaml [root@k8s-master ~]# kubectl get configmaps redis-conf -o yaml apiVersion: v1 data: redis.conf: |- port 6379 tls-port 16379 kind: ConfigMap metadata: annotations: kubectl.kubernetes.io/last-applied-configuration: | {"apiVersion":"v1","data":{"redis.conf":"port 6379\ntls-port 16379"},"kind":"ConfigMap","metadata":{"annotations":{},"name":"redis-conf","namespace":"default"}} creationTimestamp: "2023-06-01T07:46:58Z" name: redis-conf namespace: default resourceVersion: "1261758" uid: 5ba13d66-8a61-4998-85eb-ce02bfed56dd [root@k8s-master ~]# kubectl describe configmaps redis-conf Name: redis-conf Namespace: default Labels: <none> Annotations: <none> Data ==== redis.conf: ---- port 6379 tls-port 16379 BinaryData ==== Events: <none> ``` # 环境变量使用configmap ## 环境变量使用部分键值 在env字段name的值为要引用的ConfigMap对象的名称,字段key可用于指定要引用ConfigMap对象中某键的键名在容器中使用envFrom字段直接将ConfigMap资源中的所有键值一次性地完成导入。<br />创建configmap资源 ```yaml [root@k8s-master ~]# cat config-value.yaml apiVersion: v1 kind: ConfigMap metadata: name: myconfigmap data: log_level: INFO log_file: /var/log/my.log log_size: 1G [root@k8s-master ~]# kubectl apply -f config-value.yaml configmap/myconfigmap created ``` 创建pod,在env中使用部分键值 ```yaml root@k8s-master ~]# cat pod.yaml apiVersion: v1 kind: Pod metadata: name: mypod labels: name: mypod spec: containers: - name: mypod image: busybox command: ["/bin/sh", "-c", "env"] env: - name: LOG_LEVEL # 环境变量名称 valueFrom: configMapKeyRef: key: log_level # configmap的键 name: myconfigmap # configmap资源名 [root@k8s-master ~]# kubectl apply -f pod.yaml pod/mypod created ``` 查看pod日志环境变量信息 ```yaml [root@k8s-master ~]# kubectl logs mypod | grep LOG LOG_LEVEL=INFO ``` ## 环境变量使用全部键值 修改pod,在env中使用全部键值 ```yaml [root@k8s-master ~]# cat pod.yaml apiVersion: v1 kind: Pod metadata: name: mypod labels: name: mypod spec: containers: - name: mypod image: busybox command: ["/bin/sh", "-c", "env"] envFrom: - configMapRef: name: myconfigmap # configmap资源名 [root@k8s-master ~]# kubectl apply -f pod.yaml pod/mypod created ``` 查看pod日志环境变量信息 ```yaml [root@k8s-master ~]# kubectl logs mypod | grep log log_size=1G log_file=/var/log/my.log log_level=INFO ``` ## 命令行参数使用ConfigMap 创建pod资源,在启动参数中echo变量信息 ```yaml [root@k8s-master ~]# cat pod.yaml apiVersion: v1 kind: Pod metadata: name: mypod labels: name: mypod spec: containers: - name: mypod image: busybox command: ["/bin/sh", "-c", "echo", "$(LOG_LEVEL)"] env: - name: LOG_LEVEL # 环境变量名称 valueFrom: configMapKeyRef: key: log_level # configmap的键 name: myconfigmap # configmap资源名 [root@k8s-master ~]# kubectl apply -f pod.yaml pod/mypod created ``` 查看pod输出信息 ```yaml [root@k8s-master ~]# kubectl logs mypod INFO ``` # 容器挂载使用config ## 通过数据卷使用整个ConfigMap 创建pod资源,将configmap挂载到/etc/config<br />![未命名图片.png](/media/202406/8.1.15278154_image1.png)<br />进入pod容器查看文件内容<br />![未命名图片.png](/media/202406/8.1.15278154_image2.png) ## 通过数据卷使用部分ConfigMap值 创建pod资源,将configmap挂载到/etc/config<br />![未命名图片.png](/media/202406/8.1.15278154_image3.png)<br />进入pod查看文件内容<br />![未命名图片.png](/media/202406/8.1.15278154_image4.png) ## configmap权限问题 k8s中configmap挂载文件的权限默认是420。这是十进制表示,转换成八进制就是644,如果容器中使用非root用户,此时文件没有可执行权限,需要修改文件权限。修改文件权限的方法如下:<br />在volumes字段中修改defaultMode参数的值。 ```yaml volumes: - name: postgresql-config configMap: defaultMode: 493 name: postgresql-config ``` **yaml中权限定义是用十进制的**,权限设置成493,转换成八进制就是755。 # configmap热更新 创建资源清单,变量log_level: INFO,数据卷挂载到deployment中<br />![未命名图片.png](/media/202406/8.1.15278154_image5.png)<br />进入pod容器查看文件内容<br />![未命名图片.png](/media/202406/8.1.15278154_image6.png)<br />修改configmap<br />`# kubectl edit configmap log-config` <br />![未命名图片.png](/media/202406/8.1.15278154_image7.png)<br />进入pod查看文件内容<br />![未命名图片.png](/media/202406/8.1.15278154_image8.png) # 注意事项 1. ConfigMap是名称空间级的资源,因此,引用它的Pod必须处于同一名称空间中。 2. ConfigMap 更新后滚动更新 Pod更新 ConfigMap 目前并不会触发相关 Pod<br />的滚动更新,可以通过修改 pod annotations 的方式强制触发滚动更新 3. 在.spec.template.metadata.annotations中添加version/config,每次通过修改version/config来触发滚动更新 4. 更新 ConfigMap 后:使用该 ConfigMap 挂载的 Env 不会同步更新使用该 ConfigMap<br />挂载的 Volume 中的数据需要一段时间(实测大概10秒)才能同步更新
Nathan
June 22, 2024, 12:46 p.m.
转发文档
Collection documents
Last
Next
手机扫码
Copy link
手机扫一扫转发分享
Copy link
Markdown文件
PDF文件
Docx文件
share
link
type
password
Update password