• 深入理解Pod对象:基本管理


    目录

    一、Pod 基本概念

    二、pod 常用命令

    三、Pod 资源共享实现机制

    3.1 共享网络

    3.2 共享存储

    四、Pod 状态管理

    五、重启策略和健康检查

    5.1 基本概念

    5.1.1 重启策略

    5.1.2 健康检查有以下三种类型:

    5.1.3 支持以下三种检查方法:

    5.2 示例讲解

    5.2.1 就绪健康检查示例

    六、Pod环境变量注入

    6.1 变量定义方式

    6.2 Pod属性中获取

    6.3 ConfigMap获取

    七、Init Container

    7.1 概念

    7.2 应用场景

    7.3 使用 Init 容器示例


    一、Pod 基本概念


    Pod 是可以在 Kubernetes 中创建和管理的、最小的可部署的计算单元。

    Pod (就像在鲸鱼荚或者豌豆荚中)是一组(一个或多个) 容器; 这些容器共享存储、网络、以及怎样运行这些容器的声明。

    Pod 特点

            • 一个Pod可以理解为是一个应用实例,提供服务

            • Pod中容器始终部署在一个Node上

            • Pod中容器共享网络、存储资源

            • Kubernetes直接管理Pod,而不是容器

           Pod 的共享上下文包括一组 Linux 名字空间、控制组(cgroup)和可能一些其他的隔离 ,即用来隔离 Docker 容器的技术。 在 Pod 的上下文中,每个独立的应用可能会进一步实施隔离。

    就 Docker 概念的术语而言,Pod 类似于共享命令空间和文件系统卷的一组 Docker 容器。


    二、pod 常用命令


    1. 创建Pod:
    2. kubectl apply -f pod.yaml
    3. 或者使用命令 kubectl run nginx --image=nginx
    4. 查看Pod:
    5. kubectl get pods
    6. kubectl describe pod <Pod名称>
    7. 查看日志:
    8. kubectl logs <Pod名称> [-c CONTAINER]
    9. kubectl logs <Pod名称> [-c CONTAINER] -f
    10. 进入容器终端:
    11. kubectl exec <Pod名称> [-c CONTAINER] -- bash
    12. 删除Pod:
    13. kubectl delete <Pod名称>

    三、Pod 资源共享实现机制


    3.1 共享网络

    将业务容器网络加入到“负责网络的容器”实现网络共享

     在一个pod 中运行两个容器,两个容器之间网络是互通的。

    1. apiVersion: v1
    2. kind: Pod
    3. metadata:
    4. labels:
    5. app: test
    6. name: pod-net-test
    7. namespace: default
    8. spec:
    9. containers:
    10. - image: busybox
    11. name: test01
    12. command: ["/bin/sh","-c","sleep 360000"]
    13. - image: nginx:1.17
    14. name: web

     进入 web容器中在 index.html 页面中输入 “hello world” ,我们再从 test01 容器中下载 访问

    3.2 共享存储

    一个pod中的容器通过数据卷共享数据。

           通过在 web容器 /data 文件夹下创建一个文件 可以在容器 test 中查看 ,从而可以得出 pod 中容器中的部分数据是共享的。

    1. apiVersion: v1
    2. kind: Pod
    3. metadata:
    4. labels:
    5. app: test
    6. name: pod-volume-test
    7. namespace: default
    8. spec:
    9. containers:
    10. - image: busybox
    11. name: test
    12. command: ["/bin/sh","-c","sleep 360000"]
    13. volumeMounts:
    14. - name: log
    15. mountPath: /data
    16. - image: nginx
    17. name: web
    18. volumeMounts:
    19. - name: log
    20. mountPath: /data
    21. volumes:
    22. - name: log
    23. emptyDir: {}

            在web容器中的 /data 文件夹下创建 index.html 文件,我们可以看到 在test容器中可以 查看到 index.html文件。


    四、Pod 状态管理


    Pod 一共有 5 种状态,这个状态反映在 Pod 的 status 属性中

    • Pending:这个状态意味着,Pod 的 YAML 文件已经提交给了 Kubernetes,API 对象已经被创建并保存在 Etcd 当中。但是这个 Pod 还没有被调度成功,最常见的原因比如 Pod 中某个容器启动不成功
    • Running:这个状态下,Pod 已经调度成功。也就是它包含的容器都已经创建成功,并且至少有一个正在运行中
    • Succeeded:这个状态意味着,Pod 里的所有容器都正常运行成功并退出了。这种情况在运行一次性任务时最为常见
    • Failed:这个状态下,Pod 里至少有一个容器以不正常的状态退出。这个状态出现时,你得想办法 Debug 这个容器,比如查看 Pod 的事件和日志。
    • Unknown:这是一个异常状态,意味着 Pod 的状态不能集群检测到,这很有可能是主从节点(Master 和 Kubelet)间的通信出现了问题。

    五、重启策略和健康检查


    5.1 基本概念

    5.1.1 重启策略

    • Always:当容器终止退出后,总是重启容器,默认策略。

    • OnFailure:当容器异常退出(退出状态码非0)时,才重启容器。

    • Never:当容器终止退出,从不重启容器。

    5.1.2 健康检查有以下三种类型:

    livenessProbe(存活检查):如果检查失败,将杀死容器,根据Pod 的restartPolicy来操作。

    readinessProbe(就绪检查):如果检查失败,Kubernetes会把Pod从service endpoints中剔除。

    startupProbe(启动检查):指示容器中的应用是否已经启动。如果提供了启动探针(startup probe),则禁用所有其他探针,直到它成功为止。如果启动探针失败,kubelet 将杀死容器,容器服从其重启策略进行重启。如果容器没有提供启动探针,则默认状态为成功Success。

    5.1.3 支持以下三种检查方法:

    • httpGet:发送HTTP请求,返回200-400范围状态码为成功。

    • exec:执行Shell命令返回状态码是0为成功。

    • tcpSocket:发起TCP Socket建立成功。

    5.2 示例讲解

    官网示例:

    Configure Liveness, Readiness and Startup Probes | Kubernetes

    5.2.1 就绪健康检查示例

    运行一个 pod 在容器中 /tmp/healthy 目录下创建文件并 删除 ,存活检查 检查 此路径是否存在。

    1. apiVersion: v1
    2. kind: Pod
    3. metadata:
    4. labels:
    5. test: liveness
    6. name: pod-check
    7. spec:
    8. containers:
    9. - name: liveness
    10. image: busybox
    11. args:
    12. - /bin/sh
    13. - -c
    14. - touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600
    15. livenessProbe: # 存活检查
    16. exec:
    17. command:
    18. - cat
    19. - /tmp/healthy
    20. initialDelaySeconds: 5
    21. periodSeconds: 5
    22. readinessProbe: # 就绪检查
    23. exec:
    24. command:
    25. - cat
    26. - /tmp/healthy
    27. initialDelaySeconds: 5
    28. periodSeconds: 5
    29. ### Pod 健康检查示例
    30. kubectl apply -f pod-healthy-check.yaml
    31. ### 查看pod的详细信息
    32. kubectl describe pod pod-check
    33. ### 暴露服务端口
    34. kubectl expose pod pod-check --port=80 --target-port=80

               存活检查生效,可以看到 pod 的restarts 次数已经增加了 一次。

                就绪检查失败, K8s会把Pod从service endpoints中剔除, 从而失去此 service 。


    六、Pod环境变量注入


    6.1 变量定义方式

    • 自定义变量值
    • 变量值从Pod属性中获取
    • 变量值从Sectet、ConfigMap获取

    官方示例地址:通过环境变量将 Pod 信息呈现给容器 | Kubernetes

    6.2 Pod属性中获取

    1. apiVersion: v1
    2. kind: Pod
    3. metadata:
    4. name: pod-env-vars
    5. spec:
    6. containers:
    7. - name: test
    8. image: busybox
    9. command: [ "sh", "-c", "sleep 36000"]
    10. env:
    11. - name: MY_NODE_NAME
    12. valueFrom:
    13. fieldRef:
    14. fieldPath: spec.nodeName
    15. - name: MY_POD_NAME
    16. valueFrom:
    17. fieldRef:
    18. fieldPath: metadata.name
    19. - name: MY_POD_NAMESPACE
    20. valueFrom:
    21. fieldRef:
    22. fieldPath: metadata.namespace
    23. - name: MY_POD_IP
    24. valueFrom:
    25. fieldRef:
    26. fieldPath: status.podIP
    27. - name: MY_POD_SERVICE_ACCOUNT
    28. valueFrom:
    29. fieldRef:
    30. fieldPath: spec.serviceAccountName
    31. - name: Hello
    32. value: "helle Kubernetes!"
    33. restartPolicy: Never

               进入容器 查看Pod 信息,我们使用echo $可以输出结果

    6.3 ConfigMap获取

    官网示例地址: ConfigMap | Kubernetes

           ConfigMap 是一种 API 对象,用来将非机密性的数据保存到键值对中。使用时, Pods 可以将其用作环境变量、命令行参数或者存储卷中的配置文件。

           使用 ConfigMap 来将你的配置数据和应用程序代码分开。ConfigMap 在设计上不是用来保存大量数据的。在 ConfigMap 中保存的数据不可超过 1 MiB。如果你需要保存超出此尺寸限制的数据,你可能希望考虑挂载存储卷 或者使用独立的数据库或者文件服务。

    congfigMap.yaml 

    1. apiVersion: v1
    2. kind: ConfigMap
    3. metadata:
    4. name: game-demo
    5. data:
    6. # 类属性键:每一个键都映射到一个值
    7. player_initial_lives: "3"
    8. ui_properties_file_name: "user-interface.properties"
    9. game.properties: |
    10. enemy.types=aliens,monsters
    11. player.maximum-lives=5
    12. user-interface.properties: |
    13. color.good=purple
    14. color.bad=yellow
    15. allow.textmode=true

     pod-configMap.yaml

    1. apiVersion: v1
    2. kind: Pod
    3. metadata:
    4. name: configmap-demo-pod
    5. spec:
    6. containers:
    7. - name: demo
    8. image: alpine
    9. command: ["sleep", "3600"]
    10. env:
    11. - name: PLAYER_INITIAL_LIVES # 请注意这里和 ConfigMap 中的键名是不一样的
    12. valueFrom:
    13. configMapKeyRef:
    14. name: game-demo # 这个值来自 ConfigMap
    15. key: player_initial_lives # 需要取值的键
    16. - name: UI_PROPERTIES_FILE_NAME
    17. valueFrom:
    18. configMapKeyRef:
    19. name: game-demo
    20. key: ui_properties_file_name
    21. volumeMounts:
    22. - name: config
    23. mountPath: "/config"
    24. readOnly: true
    25. volumes:
    26. - name: config
    27. configMap:
    28. name: game-demo
    29. items:
    30. - key: "game.properties"
    31. path: "game.properties"
    32. - key: "user-interface.properties"
    33. path: "user-interface.properties"

    创建Pod 

    1. kubectl apply -f configMap.yaml
    2. kubectl apply -f pod-configMap.yaml

    configmap-demo-pod运行, 进入容器可以看到 挂载目录成功。


    七、Init Container


    7.1 概念

    Init Container:顾名思义,用于初始化工作,执行完就结束,可以理解为一次性任务。

    • 支持大部分应用容器配置,但不支持健康检查

    • 优先应用容器执行

    7.2 应用场景

    • 环境检查:例如确保应用容器依赖的服务启动后再启动应用容器

    • 初始化配置:例如给应用容器准备配置文件,工具安装和安装脚本运行。

    7.3 使用 Init 容器示例

           部署一个web网站,网站程序没有打到镜像中,而是希望从代码仓库中动态拉取放到应用容器中。下面的例子定义了一个具有 一 个 Init 容器的简单 Pod。 等待 index下载成功 。 一旦这 Init容器 启动完成,Pod 将启动 spec 节中的应用容器。

    1. apiVersion: v1
    2. kind: Pod
    3. metadata:
    4. name: init-demo
    5. spec:
    6. initContainers:
    7. - name: download
    8. image: busybox
    9. command: ['wget','-O', '/opt/index.html','http://www.ctnrs.com']
    10. volumeMounts:
    11. - name: wwwroot
    12. mountPath: "/opt"
    13. containers:
    14. - name: nginx
    15. image: nginx
    16. ports:
    17. - containerPort: 80
    18. volumeMounts:
    19. - name: wwwroot
    20. mountPath: /usr/share/nginx/html
    21. volumes:
    22. - name: wwwroot
    23. emptyDir: {}

           从pod 的状态中我们可以看到 InitContainer 中的执行状态处于 Init 

                init-demo 已处于运行之中

    因此,Pod中会有这几种类型的容器:

    Infrastructure Container:基础容器,维护整个Pod网络空间

    InitContainers:初始化容器,先于业务容器开始执行

    Containers:业务容器,并行启动

    ------------------------ 感谢点赞!--------------------------------

  • 相关阅读:
    【iOS开发】(四)react Native第三方组件五个20240419-20
    【ONLYOFFICE震撼8.1】ONLYOFFICE8.1版本桌面编辑器测评
    树的表示——孩子兄弟表示法
    基于Delphi7的木马程序的查杀设计与实现
    史上最强 Cocos Shader 学习资源推荐!(建议收藏)
    金仓数据库KingbaseES数据库参考手册(动态性能视图3.8. sys_stat_progress_vacuum )
    iOS 消息推送面试题
    广读论文核心思路汇总笔记 (一些有意思的论文and论文在研究的一些有意思的问题or场景应用)
    【C++】.h文件与.c文件的区别
    Redis配置优化
  • 原文地址:https://blog.csdn.net/qq_35995514/article/details/125489846