当前位置:   article > 正文

Kubernetes(K8s)之Pod_k8s的话就是pod

k8s的话就是pod

1.Pod概述

        Pod 是 k8s 系统中可以创建和管理的最小单元,是资源对象模型中由用户创建或部署的最
小资源对象模型,也是在 k8s 上运行容器化应用的资源对象,其他的资源对象都是用来支
撑或者扩展 Pod 对象功能的,比如控制器对象是用来管控 Pod 对象的,Service 或者
Ingress 资源对象是用来暴露 Pod 引用对象的,PersistentVolume 资源对象是用来为 Pod
提供存储等等,k8s 不会直接处理容器,而是 Pod,Pod 是由一个或多个 container 组成。
        Pod 是 Kubernetes 的最重要概念,每一个 Pod 都有一个特殊的被称为”根容器“的 Pause
容器。Pause 容器对应的镜 像属于 Kubernetes 平台的一部分,除了 Pause 容器,每个 Pod
还包含一个或多个紧密相关的用户业务容器。

(1)d Pod s vs  应用
每个 Pod 都是应用的一个实例,有专用的 IP
(2 )d Pod s vs  容器
一个 Pod 可以有多个容器,彼此间共享网络和存储资源,每个 Pod 中有一个 Pause 容器保
存所有的容器状态, 通过管理 pause 容器,达到管理 pod 中所有容器的效果
(3)d Pod s vs  节点
同一个 Pod 中的容器总会被调度到相同 Node 节点,不同节点间 Pod 的通信基于虚拟二层网
络技术实现
(4)d Pod s vs  Pod
普通的 Pod 和静态 Pod 

2.Pod特性

(1)资源共享
一个 Pod 里的多个容器可以共享存储和网络,可以看作一个逻辑的主机。共享的如
namespace,cgroups 或者其他的隔离资源。
多个容器共享同一 network namespace,由此在一个 Pod 里的多个容器共享 Pod 的 IP 和
端口 namespace,所以一个 Pod 内的多个容器之间可以通过 localhost 来进行通信,所需要
注意的是不同容器要注意不要有端口冲突即可。不同的 Pod 有不同的 IP,不同 Pod 内的多
个容器之前通信,不可以使用 IPC(如果没有特殊指定的话)通信,通常情况下使用 Pod
的 IP 进行通信。
一个 Pod 里的多个容器可以共享存储卷,这个存储卷会被定义为 Pod 的一部分,并且可
以挂载到该 Pod 里的所有容器的文件系统上。
(2)生命周期短暂
Pod 属于生命周期比较短暂的组件,比如,当 Pod 所在节点发生故障,那么该节点上的 Pod
会被调度到其他节点,但需要注意的是,被重新调度的 Pod 是一个全新的 Pod,跟之前的
Pod 没有半毛钱关系。
(3)平坦的网络
K8s 集群中的所有 Pod 都在同一个共享网络地址空间中,也就是说每个 Pod 都可以通过其
他 Pod 的 IP 地址来实现访问。

3.Pod定义

(1)下面是 yaml 文件定义的 Pod 的完整内容

  1. apiVersion: v1
  2. kind: Pod
  3. metadata: //元数据
  4. name: string
  5. namespace: string
  6. labels:
  7. -name: string
  8. annotations:
  9. -name: string
  10. spec:
  11. containers: //pod 中的容器列表,可以有多个容器
  12. - name: string //容器的名称
  13. image: string //容器中的镜像
  14. imagesPullPolicy: [Always|Never|IfNotPresent]//获取镜像的策略,默认值为
  15. Always,每次都尝试重新下载镜像
  16. command: [string] //容器的启动命令列表(不配置的话使用镜像内部的命令) args:
  17. [string] //启动参数列表
  18. workingDir: string //容器的工作目录 volumeMounts: //挂载到到容器内部的存储
  19. 卷设置
  20. -name: string
  21. mountPath: string //存储卷在容器内部 Mount 的绝对路径 readOnly: boolean //
  22. 默认值为读写
  23. ports: //容器需要暴露的端口号列表
  24. -name: string
  25. containerPort: int //容器要暴露的端口
  26. hostPort: int //容器所在主机监听的端口(容器暴露端口映射到宿主机的端口,设置
  27. hostPort 时同一 台宿主机将不能再启动该容器的第 2 份副本)
  28. protocol: string //TCP 和 UDP,默认值为 TCP env: //容器运行前要设置的环境
  29. 列表
  30. -name: string value: string
  31. resources:
  32. limits: //资源限制,容器的最大可用资源数量 cpu: Srting
  33. memory: string
  34. requeste: //资源限制,容器启动的初始可用资源数量 cpu: string
  35. memory: string
  36. livenessProbe: //pod 内容器健康检查的设置 exec:
  37. command: [string] //exec 方式需要指定的命令或脚本 httpGet: //通过 httpget 检
  38. 查健康
  39. path: string port: number host: string scheme: Srtring httpHeaders:
  40. - name: Stirng value: string
  41. tcpSocket: //通过 tcpSocket 检查健康
  42. port: number initialDelaySeconds: 0//首次检查时间 timeoutSeconds: 0 //检查超时
  43. 时间
  44. periodSeconds: 0 //检查间隔时间
  45. successThreshold: 0
  46. failureThreshold: 0 securityContext: //安全配置
  47. privileged: falae
  48. restartPolicy: [Always|Never|OnFailure]//重启策略,默认值为 Always
  49. nodeSelector: object //节点选择,表示将该 Pod 调度到包含这些 label 的 Node 上,以
  50. key:value 格式指定
  51. imagePullSecrets:
  52. -name: string
  53. hostNetwork: false //是否使用主机网络模式,弃用 Docker 网桥,默认否
  54. volumes: //在该 pod 上定义共享存储卷列表
  55. -name: string emptyDir: {} hostPath:
  56. path: string secret:
  57. secretName: string item:
  58. -key: string path: string
  59. configMap: name: string items:
  60. -key: string
  61. path: string

  4 .Pod的基本使用方法

         在 kubernetes 中对运行容器的要求为:容器的主程序需要一直在前台运行,而不是后台运
行。应用需要改造成前 台运行的方式。如果我们创建的 Docker 镜像的启动命令是后台执行程序,则在 kubelet 创建包含这个容器的 pod 之 后运行完该命令,即认为 Pod 已经结束,将立刻销毁该 Pod。如果为该 Pod 定义了 RC,则创建、销毁会陷入一个无 限循环的过程中。Pod 可以由 1 个或多个容器组合而成。

(1)一个容器组成的Pod 的yaml 

  1. # 一个容器组成的 Pod
  2. apiVersion: v1 kind: Pod metadata:
  3. name: mytomcat labels:
  4. name: mytomcat spec:
  5. containers:
  6. - name: mytomcat image: tomcat ports:
  7. - containerPort: 8000

(2)多个容器组成的Pod的yaml 

  1. #两个紧密耦合的容器
  2. apiVersion: v1 kind: Pod metadata:
  3. name: myweb labels:
  4. name: tomcat-redis
  5. spec:
  6. containers:
  7. -name: tomcat image: tomcat ports:
  8. -containerPort: 8080
  9. -name: redis image: redis ports:
  10. -containerPort: 6379

(3)Pod相关命令

创建pod

kubectl create -f xxx.yaml

查看

  1. kubectl get pod/po <Pod_name>
  2. kubectl get pod/po <Pod_name> -o wide
  3. kubectl describe pod/po <Pod_name>

删除

  1. kubectl delete -f pod pod_name.yaml
  2. kubectl delete pod --all/[pod_name]

5.Pod的分类

Pod有两种类型

(1)普通Pod

        普通 Pod 一旦被创建,就会被放入到 etcd 中存储,随后会被 Kubernetes Master 调度到某
个具体的 Node 上并进行绑定,随后该 Pod 对应的 Node 上的 kubelet 进程实例化成一组相
关的 Docker 容器并启动起来。在默认情 况下,当 Pod 里某个容器停止时,Kubernetes 会
自动检测到这个问题并且重新启动这个 Pod 里某所有容器, 如果 Pod 所在的 Node 宕机,
则会将这个 Node 上的所有 Pod 重新调度到其它节点上。

(2)静态Pod

        静态 Pod 是由 kubelet 进行管理的仅存在于特定 Node 上的 Pod,它们不能通过 API Server
进行管理,无法与 ReplicationController、Deployment 或 DaemonSet 进行关联,并且
kubelet 也无法对它们进行健康检查。

6.Pod生命周期和重启策略

(1)Pod的状态

状态值说明
PendingAPI Server已经创建了该Pod,但Pod中的一个或多个容器还没有创建,包括镜像下载过程
RunningPod内所有的容器已创建,且至少一个容器处于运行状态、正在启动状态或正在重启状态
CompletedPod内所有的容器均成功执行退出,且不会再重启
Failed

Pod内所有容器均已退出,但至少一个容器退出失败

Unknown由于某种原因无法获取Pod状态,例如网络通信不畅

(2)Pod重启策略

Pod的重启策略包括Always、OnFailure和Never,默认值是Always。

重启策略说明
Always当容器失效时,由Kubelet自动重启该容器
OnFailure当容器终止运行且退出码不为0时,由Kubelet自动重启该容器
Never不论容器运行状态如何,Kubelet都不会重启该容器

7.Pod资源配置

        每个 Pod 都可以对其能使用的服务器上的计算资源设置限额,Kubernetes 中可以设置限额
的计算资源有 CPU 与 Memory 两种,其中 CPU 的资源单位为 CPU 数量,是一个绝对值而非相
对值。Memory 配额也是一个绝对值,它的单 位是内存字节数。

        Kubernetes 里,一个计算资源进行配额限定需要设定以下两个参数: Requests 该资源最
小申请数量,系统必须满足要求 Limits 该资源最大允许使用的量,不能突破,当容器试
图使用超过这个量的资源时,可能会被 Kubernetes Kill 并重启

举例

  1. sepc
  2. containers:
  3. - name: db
  4. image: mysql
  5. resources:
  6. requests:
  7. memory: "64Mi"
  8. cpu: "250m"
  9. limits:
  10. memory: "128Mi"
  11. cpu: "500m"

上述代码表明 MySQL 容器申请最少 0.25 个 CPU 以及 64MiB 内存,在运行过程中容器所能使
用的资源配额为 0.5 个 CPU 以及 128MiB 内存。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/162274
推荐阅读
相关标签
  

闽ICP备14008679号