• ConfigMap-secrets-静态pod


    一.ConfigMap

    1.概述

            ConfigMap资源,简称CM资源,它生成的键值对数据,存储在ETCD数据库中

            应用场景:主要是对应用程序的配置

            pod通过env变量引入ConfigMap,或者通过数据卷挂载volume的方式引入ConfigMap资源

    官方解释:

            configMap 卷提供了向 Pod 注入配置数据的方法。 ConfigMap 对象中存储的数据可以被 configMap 类型的卷引用,然后被 Pod 中运行的容器化应用使用。

            引用 configMap 对象时,你可以在卷中通过它的名称来引用。 你可以自定义 ConfigMap 中特定条目所要使用的路径。 下面的配置显示了如何将名为 log-config 的 ConfigMap 挂载到名为 configmap-pod 的 Pod 中

    2.查看k8s集群系统中都有哪些资源类型

    [root@master demo]# kubectl api-resources 

    3.ConfigMap资源管理

    · 创建工作目录

    1. [root@master demo]# mkdir configmap
    2. [root@master demo]# cd configmap

    · 创建ConfigMap资源

    1.声明式创建ConfigMap资源
    · 编辑ConfigMap资源清单
    1. [root@master a]# cat 01-cm.yaml
    2. apiVersion: v1
    3. kind: ConfigMap
    4. metadata:
    5. name: cm01
    6. #声明cm资源的数据
    7. data:
    8. #第一种写法【keyvalue
    9. demo: demo-cm
    10. k8s: kubernets
    11. #第二种写法【key:| value value value...】
    12. test: |
    13. a=a
    14. b=b
    15. c=c

    · 创建查看configMap资源

    1. [root@master a]# kubectl apply -f 01-cm.yaml
    2. configmap/cm01 created
    3. [root@master a]# kubectl get cm cm01
    4. NAME DATA AGE
    5. cm01 3 15s
    2.响应式创建ConfigMap资源
    · 命令行创建ConfigMap资源
    1. [root@master a]# kubectl create cm cm02 --from-literal=test=111 --from-literal=d=ddd
    2. configmap/cm02 created
    · 查看cm资源
    1. [root@master a]# kubectl get cm cm02
    2. NAME DATA AGE
    3. cm02 2 14s
    3.指定文件方式创建cm资源
    · 编辑一个文件
    1. [root@master a]# cat > 1.txt <<EOF
    2. > aaaa
    3. > bbbb
    4. > cccc
    5. > dddd
    6. > 1111
    7. > 2222
    8. > 3333
    9. > 4444
    10. > EOF
    ·创建查看ConfigMap资源
    1. [root@master a]# kubectl create cm cm03 --from-file=1.txt=1.txt
    2. configmap/cm03 created
    3. [root@master a]# kubectl get cm cm03
    4. NAME DATA AGE
    5. cm03 1 8s
    4.查看cm资源的详细信息
    1. [root@master a]# kubectl describe cm cm03
    2. Name: cm03
    3. Namespace: default
    4. Labels: <none>
    5. Annotations: <none>
    6. Data
    7. ====
    8. 1.txt:
    9. ----
    10. aaaa
    11. bbbb
    12. cccc
    13. dddd
    14. 1111
    15. 2222
    16. 3333
    17. 4444
    18. BinaryData
    19. ====
    20. Events: <none>
    5.删除cm资源
    1. [root@master a]# kubectl delete cm --all
    2. configmap "cm01" deleted
    3. configmap "cm02" deleted
    4. configmap "cm03" deleted
    5. configmap "kube-root-ca.crt" deleted

    4.pod引入CM资源

            pod引入cm资源的方式,有两种,env变量引入和volume挂载卷引入

    ·env变量引入

    1.编辑并创建cm资源
    1. [root@master a]# cat 01-cm.yaml
    2. apiVersion: v1
    3. kind: ConfigMap
    4. metadata:
    5. name: cm01
    6. #声明cm资源的数据
    7. data:
    8. #第一种写法【keyvalue
    9. demo: demo-cm
    10. k8s: kubernets
    11. #第二种写法【key:| value value value。。。】
    12. test: |
    13. a=a
    14. b=b
    15. c=c
    1. [root@master a]# kubectl apply -f 01-cm.yaml
    2. configmap/cm01 created
    2.创建pod资源,env变量引入cm
    1. [root@master a]# cat pod-env.yaml
    2. apiVersion: v1
    3. kind: Pod
    4. metadata:
    5. name: demo111
    6. spec:
    7. containers:
    8. - name: demo-e
    9. image: nginx:1.20.1-alpine
    10. env:
    11. #引入一个变量
    12. - name: env-cm01
    13. #从其他位置引入变量
    14. valueFrom:
    15. #声明从ConfigMap中引入变量
    16. configMapKeyRef:
    17. #引入变量ConfigMap的名称
    18. name: cm01
    19. key: demo
    20. #引入第二个变量
    21. - name: env-cm02
    22. valueFrom:
    23. configMapKeyRef:
    24. name: cm01
    25. #引用ConfigMap中的哪个key
    26. key: test
    1. [root@master a]# kubectl apply -f pod-env.yaml
    2. pod/demo111 created
    3. [root@master a]# kubectl get pods
    4. NAME READY STATUS RESTARTS AGE
    5. demo 1/1 Running 1 (48m ago) 52m
    6. demo111 1/1 Running 0 9s
    3.进入容器查看变量是否引入成功
    1. [root@master a]# kubectl exec demo111 -it -- sh
    2. / # env

    · volume挂载卷引入cm

    1.编辑pod资源清单
    1. [root@master a]# cat pod-env.yaml
    2. apiVersion: v1
    3. kind: Pod
    4. metadata:
    5. name: demo111
    6. spec:
    7. #声明pod存储卷
    8. volumes:
    9. - name: vol-cm
    10. #声明挂载cm资源
    11. configMap:
    12. #指定cm组员名称
    13. name: cm01
    14. #如果不写items,则引用cm资源中全部的key:value作为文件挂载
    15. items:
    16. #cm资源的key是什么
    17. - key: demo
    18. #keyvalue值挂载到容器中变成文件内容,文件名叫什么
    19. path: demo.txt
    20. - key: test
    21. path: test.txt
    22. containers:
    23. - name: demo-d
    24. image: nginx:1.20.1-alpine
    25. volumeMounts:
    26. - name: vol-cm
    27. mountPath: /demo
     2.创建查看资源
    1. [root@master a]# kubectl apply -f pod-env.yaml
    2. pod/demo111 created
    3. [root@master a]# kubectl get pods
    4. NAME READY STATUS RESTARTS AGE
    5. demo111 1/1 Running 0 35s
    3. 进入pod容器查看是否挂载成功,变成文件
    1. [root@master a]# kubectl exec demo111 -it -- sh
    2. / # ls
    3. bin docker-entrypoint.sh media root sys
    4. demo etc mnt run tmp
    5. dev home opt sbin usr
    6. docker-entrypoint.d lib proc srv var
    7. / # cd demo
    8. /demo # ls
    9. demo.txt test.txt
    10. /demo # cat demo.txt
    11. demo-cm
    12. /demo # cat test.txt
    13. a=a
    14. b=b
    15. c=c

    注:当pod挂载cm资源到容器的目录后,若容器的原目录中有文件,则会被清空,那么如何做到,及把cm资源挂载成为文件到容器的指定目录,又能保证容器原目录中的文件不清空呐?

            subPath

    1. [root@master a]# cat pod-env.yaml
    2. apiVersion: v1
    3. kind: Pod
    4. metadata:
    5. name: demo111
    6. spec:
    7. volumes:
    8. - name: vol-cm
    9. configMap:
    10. name: cm01
    11. items:
    12. - key: demo
    13. path: demo.txt
    14. - key: test
    15. path: test.txt
    16. containers:
    17. - name: demo-d
    18. image: nginx:1.20.1-alpine
    19. volumeMounts:
    20. - name: vol-cm
    21. mountPath: /demo
    22. #如果subPath不指定任何值(默认),则默认容器挂载路径为空,表示清空挂载点;
    23. #如果subPath指定名称和cm的Path相同,表示仅仅挂载这个文件,不清空挂在的目录保留原本容器路径的文件;
    24. #也就是说volumes>>configMap>items>path只有与subPath的值相等时,才是挂载文件;否则就是挂载目录;会清空目录;
    25. subPath: test
    26. #resdOnly: true #只读设置;表示不允许容器内编辑或删除这个文件;

    二.secrets

            secrets资源,类似于configmap资源,只是secrets资源是用来传递重要的信息的;

            secret資源就是將value的值使用base64编译后传输,当pod引用secret后,k8s会自动将其base64的编码,反编译回正常的字符串;

    官方解释: 

            Secret 是一种包含少量敏感信息例如密码、令牌或密钥的对象。 这样的信息可能会被放在 Pod 规约中或者镜像中。 使用 Secret 意味着你不需要在应用程序代码中包含机密数据。

            由于创建 Secret 可以独立于使用它们的 Pod, 因此在创建、查看和编辑 Pod 的工作流程中暴露 Secret(及其数据)的风险较小。 Kubernetes 和在集群中运行的应用程序也可以对 Secret 采取额外的预防措施, 例如避免将敏感数据写入非易失性存储。

    1.创建secrets资源

    ·准备将“想要的数据”使用base64进行编码

    1. #正向编码
    2. [root@worker2 ~]# echo demotest | base64
    3. ZGVtb3Rlc3QK
    4. [root@worker2 ~]# echo kubernets | base64
    5. a3ViZXJuZXRzCg==
    6. #反向编码
    7. [root@worker2 ~]# echo ZGVtb3Rlc3QK | base64 -d
    8. demotest

    ·声明式创建secrets资源

    1.编辑secrets资源清单
    1. [root@master secrets]# cat 01-secret.yaml
    2. apiVersion: v1
    3. kind: Secret
    4. metadata:
    5. name: demo1
    6.  #用户自定义的类型(Opaque为自定义类型)
    7. type: Opaque
    8. data:
    9. demotest: ZGVtb3Rlc3QK
    10. kubernets: a3ViZXJuZXRzCg==
    2.创建查看secret资源
    1. [root@master secrets]# kubectl apply -f .
    2. secret/demo1 created
    3. [root@master secrets]# kubectl get secrets
    4. NAME TYPE DATA AGE
    5. default-token-rnwqs kubernetes.io/service-account-token 3 9d
    6. demo1 Opaque 2 2m40s

     ·响应式创建secret

    [root@master secrets]# kubectl create secret generic demo2 --from-literal=testa=dGVzdGEK --from-literal=testb=dGVzdGIK
    
    查看secrets资源
    1. [root@master secrets]# kubectl get secrets
    2. NAME TYPE DATA AGE
    3. default-token-rnwqs kubernetes.io/service-account-token 3 9d
    4. demo1 Opaque 2 2m40s
    5. demo2 Opaque 2 15s

    Opaque为自定义类型

    generic: 从本地file, directory或者literal value创建一个 secret(这是大多数情况使用的)

                         也就是资源清单中的type:Opaque是一个意思

    docker-registry:创建一个给Docker registry容器镜像仓库使用的secret

    tls: 创建一个TLS secret

    原文链接:https://blog.csdn.net/flq18210105507/article/details/120749275

    2.pod引用secret资源

     · pod资源env环境变量引用secret资源

    1.编辑pod资源
    1. [root@master secrets]# cat 01-pod.yaml
    2. apiVersion: v1
    3. kind: Pod
    4. metadata:
    5. name: demo323
    6. spec:
    7. containers:
    8. - name: nginx-d
    9. image: nginx:1.20.1-alpine
    10. env:
    11. - name: secret-env01
    12. valueFrom:
    13. #声明引用sercet
    14. secretKeyRef:
    15. #声明secret名称
    16. name: demo1
    17. #声明secret的key
    18. key: demotest
    19. - name: secret-env02
    20. valueFrom:
    21. secretKeyRef:
    22. name: demo1
    23. key: kubernets
    2.创建查看pod
    1. [root@master secrets]# kubectl apply -f 01-pod.yaml
    2. pod/demo323 created
    3. [root@master secrets]# kubectl get pods -o wide
    4. NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
    5. demo323 1/1 Running 0 13s 10.100.1.35 worker1 <none> <none>
    3.登录pod资源查看env变量
    1. [root@master secrets]# kubectl exec demo323 -it -- sh
    2. / # env

    · pod资源volume存储卷引用secret资源

    1.编辑pod资源
    1. [root@master secrets]# cat 01-pod.yaml
    2. apiVersion: v1
    3. kind: Pod
    4. metadata:
    5. name: demo333
    6. spec:
    7. volumes:
    8. - name: vol-secret
    9. secret:
    10. secretName: demo1
    11. containers:
    12. - name: nginx-d
    13. image: nginx:1.20.1-alpine
    14. volumeMounts:
    15. - name: vol-secret
    16. mountPath: /demos
    2.创建查看pod
    1. [root@master secrets]# kubectl apply -f 01-pod.yaml
    2. pod/demo333 created
    3. [root@master secrets]# kubectl get pods -o wide
    4. NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
    5. demo333 1/1 Running 0 11s 10.100.1.36 worker1 <none> <none>
    3.进入容器内查看是否挂在为文件
    1. [root@master secrets]# kubectl exec demo333 -it -- sh
    2. / # ls
    3. bin docker-entrypoint.sh media root sys
    4. demos etc mnt run tmp
    5. dev home opt sbin usr
    6. docker-entrypoint.d lib proc srv var
    7. / # cd demos
    8. /demos # ls
    9. demotest kubernets
    10. /demos # cat demotest
    11. demotest
    12. /demos # cat kubernets
    13. kubernets

    3.secret类型之-私有镜像仓库使用

            创建Docker harbor的secret信息:

            因为,k8s拉取镜像与Docker拉取镜像是不同的方式,所以k8s需要创建一个属于自己的拉取镜像的方式

    generic: 从本地file, directory或者literal value创建一个 secret(这是大多数情况使用的)

                         也就是资源清单中的type:Opaque是一个意思

    docker-registry:创建一个给Docker registry容器镜像仓库使用的secret

    tls: 创建一个TLS secret

    ·harbor创建私有仓库

            harbor创建私有仓库

    · 推送镜像到私有仓库

    1. [root@worker2 ~]# docker login -uadmin -p111aaa.. harbor.test.com
    2. [root@worker2 ~]# docker tag nginx:1.20.1-alpine harbor.test.com/demo/nginx:1.20.1-alpine
    3. [root@worker2 ~]# docker push harbor.test.com/demo/nginx:1.20.1-alpine
    4. The push refers to repository [harbor.test.com/demo/nginx]
    5. 9d5b000ce7c7: Pushed
    6. b8dbe22b95f7: Pushed
    7. c39c1c35e3e8: Pushed
    8. 5f66747c8a72: Pushed
    9. 15d7cdc64789: Pushed
    10. 7fcb75871b21: Pushed
    11. 1.20.1-alpine: digest: sha256:34c4a6f3b4d5e5f886bfa6a32642ecf023282c82c03d37901bc1f30823abbd5d size: 1568

     

    · 创建拉取镜像的secret资源

    1.响应式创建secret资源
    [root@master secrets]# kubectl create secret docker-registry demo-harbor --docker-username=admin --docker-password=111aaa.. --docker-email=123@qq.com --docker-server=harbor.test.com
    
    1. [root@master secrets]# kubectl get secret
    2. NAME TYPE DATA AGE
    3. default-token-rnwqs kubernetes.io/service-account-token 3 9d
    4. demo-harbor kubernetes.io/dockerconfigjson 1 11s

    · 创建pod引用拉取镜像的secret资源

    1. [root@master secrets]# cat 01-pod.yaml
    2. apiVersion: v1
    3. kind: Pod
    4. metadata:
    5. name: demo-harbor00
    6. spec:
    7. imagePullSecrets:
    8. - name: demo-harbor
    9. containers:
    10. - name: harbortest
    11. image: harbor.test.com/demo/nginx:1.20.1-alpine

     

    1. [root@master secrets]# kubectl apply -f 01-pod.yaml
    2. pod/demo-harbor00 created
    3. [root@master secrets]# kubectl get pods -o wide
    4. NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
    5. demo-harbor00 1/1 Running 0 14s 10.100.1.37 worker1 <none> <none>

    三.静态pod

            pod创建流程        

    用户通过 kubectl create 命令(或其他等效方式)向 Kubernetes API Server 发起一个创建 Pod 的请求。这个请求包含了 Pod 的定义,通常是一个 YAML 或 JSON 格式的文件。 API Server 接收请求并处理:

            Kubernetes API Server 接收到创建 Pod 的请求后,会对请求进行验证和授权检查。 API Server 不会直接创建 Pod,而是将这个请求转化为一个内部表示(如一个含有 Pod 创建信息的 YAML 格式的对象)。 写入 Etcd 数据库:

            API Server 将这个 Pod 对象的信息写入到 Etcd 数据库。Etcd 作为 Kubernetes 的数据存储,保存了集群的状态和配置。 Scheduler 进行调度:

            Kubernetes Scheduler 持续监视 API Server,检查新的或未被调度的 Pod。 当 Scheduler 发现一个新的 Pod(pod.spec.Node == null 表示这个 Pod 还没有被调度到任何节点),它将根据资源需求、亲和性规则、污点和容忍度等因素选择一个合适的节点。 一旦选择了节点,Scheduler 将更新该 Pod 的信息,指定其运行在选择的节点上,并将这个更新写回到 Etcd。 Kubelet 监听并创建 Pod:

            每个节点上的 Kubelet 进程持续监视 Etcd,查找分配给自己节点的新任务。 当 Kubelet 发现有新的 Pod 分配到它所在的节点,它会根据 Pod 定义开始创建和启动 Pod 中的容器。 Kubelet 调用容器运行时(如 Docker)来实际启动容器,并设置必要的网络和存储配置。 Pod 状态更新和汇报:

            在 Pod 创建过程中,Kubelet 将 Pod 的状态更新回 API Server。这些状态信息包括 Pod 是否成功启动,运行中的容器等。 API Server 更新 Etcd 中的状态信息,确保集群状态的一致性。                    
    原文链接:https://blog.csdn.net/weixin_48126010/article/details/136690275

    1.查看静态pod的路径

    1. [root@master ~]# vim /var/lib/kubelet/config.yaml
    2. ......
    3. staticPodPath: /etc/kubernetes/manifests

    2.静态pod的查看与含义

    这里面的名称都是我们的k8s集群中master节点的组成组件

    1. [root@master secrets]# ll /etc/kubernetes/manifests/
    2. 总用量 16
    3. -rw------- 1 root root 2274 75 14:44 etcd.yaml
    4. -rw------- 1 root root 3403 710 20:26 kube-apiserver.yaml
    5. -rw------- 1 root root 2880 75 14:44 kube-controller-manager.yaml
    6. -rw------- 1 root root 1465 75 14:44 kube-scheduler.yaml

            静态pod就是kubelet自己监视的目录,如果这个目录有pod资源清单,则会在当前节点自动创建pod;不需要手动kubectl apply -f  xxx.yaml

            静态pod的创建,只在当前节点上创建,pod的名称会自动给你加一个当前节点名称后缀;

            静态pod,只要有yaml文件在这个目录,就无法删除;

    · 示例

    1. [root@master pod]# mv 01-pod-nginx.yaml /etc/kubernetes/manifests/
    2. [root@master pod]# kubectl get pods -o wide
    3. NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
    4. m-nginx-master 0/1 ContainerCreating 0 9s <none> master <none> <none>

  • 相关阅读:
    嵌入式开发:如何调试Arm Cortex-M上的硬故障
    QGIS编译(跨平台编译)之四十六:GrassGIS安装(Windows、Linux、MacOS环境下编译)
    【机器学习】支持向量机【下】软间隔与核函数
    taobao.trade.get( 获取单笔交易的部分信息(性能高),淘宝R2接口,淘宝开发平台oAuth2.0接口
    Java项目:ssm在线选课管理系统
    走近棒球运动·亚洲职棒大赛·MLB棒球创造营
    python打通hive数据库实现CRUD
    进来了解实现官网搜索引擎的三种方法
    Java多线程之线程同步【synchronized、Lock、volatitle】
    LeetCode-538. Convert BST to Greater Tree [C++][Java]
  • 原文地址:https://blog.csdn.net/weixin_46466657/article/details/140417121