首页 > 其他分享 >Pod

Pod

时间:2024-02-02 14:11:56浏览次数:28  
标签:容器 必选 1.1 nginx Pod pod

1.1 Pod

目录

1.1.1 创建一个pod

定义一个pod

vim pod.yaml

apiVersion: v1
kind: Pod
metadata:
  name: pod
spec:
  containers:
  - name: nginx
    image: nginx
    ports:
    - name: http
      containerPort: 80

创建pod

kubectl apply -f pod.yaml

查看pod状态

[root@k8s-master01 ~]# kubectl get po
NAME                       READY   STATUS    RESTARTS      AGE
busybox-5569669777-r4cpb   1/1     Running   1 (46m ago)   15h
pod                        1/1     Running   0             61s

使用run创建一个pod

kubectl run test-po --image=nginx:latest

1.1.2 更改pod的启动命令和参数

vim pod.yaml

apiVersion: v1 			# 必选,API 的版本号
kind: Pod 				# 必选,类型 Pod
metadata:				# 必选,元数据
  name: nginx 			# 必选,符合 RFC 1035 规范的 Pod 名称
spec: 					# 必选,用于定义 Pod 的详细信息
  containers: 			# 必选,容器列表
  - name: nginx 		# 必选,符合 RFC 1035 规范的容器名称
    image: nginx:1.15.12 # 必选,容器所用的镜像的地址
    command: 			# 可选,容器启动执行的命令
    - sleep
    - "10"
    ports:				# 可选,容器需要暴露的端口号列表
    - containerPort: 80 # 端口号

1.1.3 pod的状态以及pod故障排查命令

状态 说明
Running(运行中) Pod 已经被绑定到一个节点上,并且所有的容器都已经被创建,而且至少有一个是运行状态,或者是正在启动或者重启,可以通过 kubectl logs 查看 Pod 的日志
Succeeded(成功) 所有容器执行成功并终止,并且不会再次重启,可以通过 kubectl logs 查看 Pod日志
Failed(失败) 所有容器都已终止,并且至少有一个容器以失败的方式终止,也就是说这个容器要么以非零状态退出,要么被系统终止,可以通过 logs 和 describe 查看 Pod 日志和状态
Unknown(未知) 通常是由于通信问题造成的无法获得 Pod 的状态
ImagePullBackOff ErrImagePull 镜像拉取失败,一般是由于镜像不存在、网络不通或者需要登录认证引起的,可以使用 describe 命令查看具体原因
CrashLoopBackOff 容器启动失败,可以通过 logs 命令查看具体原因,一般为启动命令不正确,健康检查不通过等
OOMKilled 容器内存溢出,一般是容器的内存 Limit 设置的过小,或者程序本身有内存溢出,可以通过 logs 查看程序启动日志
Terminating Pod 正在被删除,可以通过 describe 查看状态
SysctlForbidden Pod 自定义了内核配置,但 kubelet 没有添加内核配置或配置的内核参数不支持,可以通过 describe 查看具体原因
Completed 容器内部主进程退出,一般计划任务执行结束会显示该状态,此时可以通过 logs查看容器日志
ContainerCreating Pod 正在创建,一般为正在下载镜像,或者有配置不当的地方,可以通过 describe查看具体原因
Pending(挂起) Pod 已被 Kubernetes 系统接收,但仍有一个或多个容器未被创建,可以通过kubectl describe 查看处于 Pending 状态的原因

注意:Pod 的 Phase 字段只有 Pending、Running、Succeeded、Failed、Unknown,其余的为处于上述状态的原因,可以通过 kubectl get po xxx –o yaml 查看。

1.1.4镜像拉取策略

通过 spec.containers[].imagePullPolicy 参数可以指定镜像的拉取策略,目前支持的策略如下:

操作方式 说明
Always 总是拉取,当镜像 tag 为 latest 时,且 imagePullPolicy 未配置,默认为 Always
Never 不管是否存在都不会拉取
IfNotPresent 镜像不存在时拉取镜像,如果 tag 为非 latest,且 imagePullPolicy 未配置,默认为 IfNotPresent

更改镜像拉取策略为 IfNotPresent:

apiVersion: v1 # 必选,API 的版本号
kind: Pod # 必选,类型 Pod
metadata: # 必选,元数据
  name: nginx # 必选,符合 RFC 1035 规范的 Pod 名称
spec: # 必选,用于定义 Pod 的详细信息
  containers: # 必选,容器列表
  - name: nginx # 必选,符合 RFC 1035 规范的容器名称
    image: nginx:1.15.12 # 必选,容器所用的镜像的地址
    imagePullPolicy: IfNotPresent #本地有使用本地的,反之则拉取
    command: # 可选,容器启动执行的命令
    - sleep
    - "10"
    ports: # 可选,容器需要暴露的端口号列表
    - containerPort: 80 # 端口号

1.1.5 Pod重启策略

可以使用 spec.restartPolicy 指定容器的重启策略

操作方式 说明
Always 默认策略。容器失效时,自动重启该容器
OnFailure 容器以不为 0 的状态码终止,自动重启该容器
Never 无论何种状态,都不会重启

指定重启策略为 Never:

apiVersion: v1 # 必选,API 的版本号
kind: Pod # 必选,类型 Pod
metadata: # 必选,元数据
  name: nginx # 必选,符合 RFC 1035 规范的 Pod 名称
spec: # 必选,用于定义 Pod 的详细信息
  containers: # 必选,容器列表
  - name: nginx # 必选,符合 RFC 1035 规范的容器名称
    image: nginx:1.15.12 # 必选,容器所用的镜像的地址
    restartPolicy: Never #无论哪种情况,都不重启
    imagePullPolicy: IfNotPresent #本地有使用本地的,反之则拉取
    command: # 可选,容器启动执行的命令
    - sleep
    - "10"
    ports: # 可选,容器需要暴露的端口号列表
    - containerPort: 80 # 端口号

1.1.6 Pod的三种探针

种类 说明
startupProbe Kubernetes1.16 新加的探测方式,用于判断容器内的应用程序是否已经启动。如果配置了 startupProbe,就会先禁用其他探测,直到它成功为止。如果探测失败,Kubelet会杀死容器,之后根据重启策略进行处理,如果探测成功,或没有配置 startupProbe,则状态为成功,之后就不再探测。
livenessProbe 用于探测容器是否在运行,如果探测失败,kubelet 会“杀死”容器并根据重启策略进行相应的处理。如果未指定该探针,将默认为 Success
readinessProbe 一般用于探测容器内的程序是否健康,即判断容器是否为就绪(Ready)状态。如果是,则可以处理请求,反之 Endpoints Controller 将从所有的 Service 的 Endpoints中删除此容器所在 Pod 的 IP 地址。如果未指定,将默认为 Success

1.1.7 探针实现的方式

实现方式 说明
ExecAction 在容器内执行一个指定的命令,如果命令返回值为 0,则认为容器健康
TCPSocketAction 通过 TCP 连接检查容器指定的端口,如果端口开放,则认为容器健康
HTTPGetAction 对指定的 URL 进行 Get 请求,如果状态码在 200~400 之间,则认为容器健康

1.1.8 livenessProbe和readinessProbe

创建一个没有探针的 Pod:

apiVersion: v1 # 必选,API 的版本号
kind: Pod # 必选,类型 Pod
metadata: # 必选,元数据
  name: nginx # 必选,符合 RFC 1035 规范的 Pod 名称
spec: # 必选,用于定义 Pod 的详细信息
  containers: # 必选,容器列表
  - name: nginx # 必选,符合 RFC 1035 规范的容器名称
    image: nginx:1.15.12 # 必选,容器所用的镜像的地址
    command: # 可选,容器启动执行的命令
    - sh
    - -c
    - sleep 10; nginx -g "daemon off;" # 10秒之后启动nginx
    ports: # 可选,容器需要暴露的端口号列表
    - containerPort: 80 # 端口号
  restartPolicy: Never
  restartPolicy: Never

配置健康检查:

apiVersion: v1
kind: Pod
metadata:
  name: nginx  # Pod 名称
spec:
  containers:
  - name: nginx  # 容器名称
    image: nginx:1.15.12  # 使用的镜像
    imagePullPolicy: IfNotPresent  # 镜像拉取策略
    command:
    - sh
    - -c
    - sleep 10; nginx -g "daemon off;"  # 容器启动命令
    readinessProbe:  # 就绪探测
      httpGet:  # HTTP 接口检测方式
        path: /index.html  # 检测路径
        port: 80  # 检测端口
        scheme: HTTP  # 协议
      initialDelaySeconds: 10  # 初始化延迟时间
      timeoutSeconds: 2  # 超时时间
      periodSeconds: 5  # 检测间隔
      successThreshold: 1  # 成功检测次数
      failureThreshold: 2  # 失败检测次数
    livenessProbe:  # 存活探测
      tcpSocket:  # TCP 端口检测方式
        port: 80  # 检测端口
      initialDelaySeconds: 10  # 初始化延迟时间
      timeoutSeconds: 2  # 超时时间
      periodSeconds: 5  # 检测间隔
      successThreshold: 1  # 成功检测次数
      failureThreshold: 2  # 失败检测次数
    ports:  # 暴露的端口列表
    - containerPort: 80  # 容器端口

1.1.9 配置startupProbe

apiVersion: v1
kind: Pod
metadata:
  name: nginx  # Pod 名称
spec:
  containers:
  - name: nginx  # 容器名称
    image: nginx:1.15.12  # 使用的镜像
    imagePullPolicy: IfNotPresent  # 镜像拉取策略
    command:
    - sh
    - -c
    - sleep 10; nginx -g "daemon off;"  # 容器启动命令
    startupProbe:  # 存活探测
      tcpSocket:  # TCP 端口检测方式
        port: 80  # 检测端口
      initialDelaySeconds: 10  # 初始化延迟时间
      timeoutSeconds: 2  # 超时时间
      periodSeconds: 5  # 检测间隔
      successThreshold: 1  # 成功检测次数
      failureThreshold: 2  # 失败检测次数
    readinessProbe:  # 就绪探测
      httpGet:  # HTTP 接口检测方式
        path: /index.html  # 检测路径
        port: 80  # 检测端口
        scheme: HTTP  # 协议
      initialDelaySeconds: 10  # 初始化延迟时间
      timeoutSeconds: 2  # 超时时间
      periodSeconds: 5  # 检测间隔
      successThreshold: 1  # 成功检测次数
      failureThreshold: 2  # 失败检测次数
    livenessProbe:  # 存活探测
      tcpSocket:  # TCP 端口检测方式
        port: 80  # 检测端口
      initialDelaySeconds: 10  # 初始化延迟时间
      timeoutSeconds: 2  # 超时时间
      periodSeconds: 5  # 检测间隔
      successThreshold: 1  # 成功检测次数
      failureThreshold: 2  # 失败检测次数
    ports:  # 暴露的端口列表
    - containerPort: 80  # 容器端口

1.1.10 prestop 和 poststart

apiVersion: v1
kind: Pod
metadata:
  name: lifecycle  # Pod 名称
spec:
  containers:
  - name: lifecycle  # 容器名称
    image: nginx:latest  # 使用的镜像
    imagePullPolicy: IfNotPresent  # 镜像拉取策略
    lifecycle:  # 生命周期钩子
      postStart:  # 容器启动后钩子
        exec:  # 执行命令
          command:  # 命令列表
          - sh
          - -c
          - mkdir /data  # 创建 /data 目录
      preStop:  # 容器停止前钩子
        exec:  # 执行命令
          command:  # 命令列表
          - sh
          - -c
          - sleep 10  # 等待 10 秒
    ports:  # 暴露的端口列表
    - name: http  # 端口名称
      containerPort: 80  # 容器端口

1.1.11 gRPC探测

这个可以自己去百度了解下

1.1.12 pod的创建流程

  1. 用户(User)通过kubectl命令行工具发起请求,执行创建Pod的操作。
  2. kubectl将用户的请求发送给API Server。在发送之前,kubectl会通过kubeconfig文件进行认证。
  3. API Server接收到请求后,将Pod和节点绑定的信息写入etcd存储。
  4. Controller Manager中的Scheduler组件通过watch接口从API Server获取新创建的Pod信息。
  5. Scheduler根据预设的调度策略为Pod选择合适的节点,并将节点信息更新到API Server。
  6. API Server将更新后的Pod信息传递给Controller Manager。
  7. Controller Manager负责维护Pod的复制数量,它通过watch接口监控RC(Replication Controller)信息的变化,并将RC信息写入etcd。
  8. 节点上的kubelet组件通过watch接口从API Server获取到被调度到该节点的Pod信息。
  9. kubelet调用CNI(Container Network Interface)插件为Pod创建网络。
  10. 如果Pod需要挂载存储卷,kubelet会调用CSI(Container Storage Interface)插件来创建卷并挂载到Pod。
  11. 最后,kubelet调用CRI(Container Runtime Interface)接口启动容器

1.1.13 pod的销毁流程

  1. 用户(User)通过kubectl命令行工具发起请求,执行删除Pod的操作。
  2. kubectl将用户的删除请求发送给API Server。在发送之前,kubectl会通过kubeconfig文件进行认证。
  3. API Server接收到删除请求后,将Pod的状态标记为Terminating。此时,Pod仍然存在于etcd中,但不再接受新的流量。
  4. API Server将Pod状态的改变通知给Controller Manager。
  5. Controller Manager通过watch接口监控到Pod状态的改变,然后更新RC(Replication Controller)或Deployment等资源对象的副本数。
  6. Scheduler不再为被标记为Terminating的Pod分配新的节点。
  7. 当Pod内的所有容器都停止运行后,kubelet会从API Server获取到Pod的状态变化。
  8. kubelet调用CRI接口停止容器,并调用CNI接口释放网络资源。
  9. 如果Pod使用了存储卷,kubelet会调用CSI接口卸载卷。
  10. 最后,kubelet向API Server发送消息,确认Pod已经被完全销毁。
  11. API Server接收到消息后,从etcd中删除Pod的相关信息。

标签:容器,必选,1.1,nginx,Pod,pod
From: https://www.cnblogs.com/wytblog/p/18003080

相关文章

  • Pod
    1.1Pod1.1.1创建一个pod定义一个podvimpod.yamlapiVersion:v1kind:Podmetadata:name:podspec:containers:-name:nginximage:nginxports:-name:httpcontainerPort:80创建podkubectlapply-fpod.yaml查看pod状态[root@k......
  • 使用kubectl中的强制删除pod命令
    1.使用kubectl中的强制删除命令kubectldeletepodnginx-nmmp--force--grace-period=02.删除非正常的poda.查询出所有要删除的podNamekubectlgetpo|grepUnknown|awk'{print$1}'b.批量删除kubectldeletepod`kubectlgetpo|grepUnknown|awk'{print$1}'`-......
  • 在K8S中,创建pod过程?
    在Kubernetes(简称K8s)中创建Pod的过程涉及多个组件的交互,以下是简化版的Pod创建流程:客户端请求:用户通过kubectlapply命令、控制台界面或者API调用提交一个Pod的定义文件(YAML或JSON格式),向集群中的kube-apiserver发送创建Pod的请求。验证与准入控制:kube-apiserver接收到......
  • 在K8S中,flannel能固定节点IP和Pod的IP地址吗?
    Flannel作为一个Kubernetes集群的网络插件,其设计目标之一是为Pod分配固定的IP地址,并确保不同节点上的PodIP地址不会冲突。具体来说:PodIP固定:Flannel在每个节点上预分配一个子网供Pod使用,当创建新Pod时,Flannel会从该节点的子网中分配一个唯一的IP地址给Pod,从而确保Pod在整个生......
  • 在K8S中,Pod亲和性概念是什么?
    在Kubernetes(简称K8S)中,Pod亲和性和反亲和性(AffinityandAnti-Affinity)是集群调度策略的重要组成部分,它们用于控制Pod如何与节点或其他Pod相对应地放置或避免放置在一起。Pod亲和性(Affinity):Pod亲和性允许用户指定某种规则,使得Pod更倾向于被调度到满足特定条件的节点上运行,或者与......
  • 在K8S中,静态、动态、自主式Pod有何区别?
    在Kubernetes(简称K8s)中,静态Pod、自主式Pod和动态Pod是不同管理方式下的Pod类型,它们的区别主要体现在创建和管理方式上:静态Pod:静态Pod是由kubelet直接管理的,其配置文件存储在节点本地而非通过APIServer创建。kubelet会根据指定路径下的静态Pod配置文件来创建和管理Pod,这些Po......
  • 在K8S中,Pod生命周期包含哪些?
    在Kubernetes(简称K8s)中,Pod的生命周期经历了一系列状态变化。以下是Pod可能处于的一些主要状态:Pending:当创建一个Pod时,它首先会进入Pending状态。这个状态下,Kubernetes正在为Pod分配节点、拉取容器镜像或等待其他资源就绪。在这个阶段,Pod尚未被调度到具体的Node上或者其依赖的......
  • 在K8S中,Pod删除过程会发生什么?
    在Kubernetes(简称K8s)中,删除一个Pod时会发生以下一系列事件:发出删除命令:用户通过kubectl命令行工具或者API接口发出删除Pod的请求,例如执行kubectldeletepod<pod-name>。APIServer响应:KubernetesAPIServer接收到删除请求后,验证权限并更新其内部状态,标记指定Pod为待删......
  • 在K8S中,Pod创建过程包括什么?
    在Kubernetes(K8s)中,Pod的创建过程通常包括以下步骤:提交Pod定义:用户通过kubectl命令行工具或者调用APIServer接口,提交一个包含Pod配置信息的YAML或JSON文件。这个配置文件详细描述了Pod的元数据(如名称、标签等)、容器镜像、环境变量、端口映射、卷挂载以及其他运行时参数。接......
  • k8s 报错: node(s) didn't match Pod's node affinity.
    前言k8s集群中,有pod出现了Affinity,使用kubectldescribepod命令,发现了报错2node(s)didn'tmatchPod'snodeaffinity.这是因为节点被打上了污点,导致了pod没有节点可以起来解决kubectlgetnodes-ojson|jq'.items[].spec'orkubectlgetnodes-oyaml找到......