侧边栏壁纸
  • 累计撰写 72 篇文章
  • 累计创建 22 个标签
  • 累计收到 2 条评论

目 录CONTENT

文章目录

【kubernetes】Pod的基本概念

Administrator
2024-11-30 / 0 评论 / 0 点赞 / 59 阅读 / 12977 字 / 正在检测是否收录...

官网直达:https://kubernetes.io/zh-cn/docs/concepts/workloads/pods/

Pod 是可以在 Kubernetes 中创建和管理的、最小的可部署的计算单元。 共享名字空间并共享文件系统卷的一组容器。

微信截图_20241130153956.png

Pod可以简单地理解为一组、一个或多个容器,每个Pod还包含一个Pause容器,Pause容器为Pod的父容器,通过Pause容器可以使同一个Pod里面的不同容器共享存储、网络、PID等。

1. 创建一个Pod

定义Pod

# vim nginx.yaml

apiVersion: v1 # 必选, API 的版本号
kind: Pod # 必选,类型 Pod
metadata: # 必选,元数据
  name: nginx # 必选,符合 RFC 1035 规范的 Pod 名称
spec: # 必选,用于定义 Pod 的详细信息
  containers: # 必选,容器列表
  - name: nginx # 必选,符合 RFC 1035 规范的容器名称
    image: registry.cn-beijing.aliyuncs.com/jiangxiaonan/nginx:1.22.1  # 必选,容器所用的镜像的地址
    ports: # 可选,容器需要暴露的端口号列表
    - containerPort: 80 # 端口号

创建pod

kubectl create -f nginx.yaml

查看 Pod 状态:

kubectl get po nginx

使用 kubectl run 创建一个 Pod:

kubectl run nginx-run --image=nginx:1.15.12

2. Pod 状态及 Pod 故障排查命令

状态

说明

Pending(挂起)

Pod已被Kubernetes系统接收,但仍有一个或多个容器未被创建,可以通过kubectl describe查看处于Pending状态的原因。

Running(运行中)

Pod已经被绑定到一个节点上,并且所有的容器都已经被创建,而且至少有一个是运行状态、正在启动或者重启,可以通过kubectl logs查看Pod的日志。

Succeeded(成功)

所有容器执行成功并终止,并且不会再次重启,可以通过kubectl logs查看Pod的日志。

Failed(失败)

所有容器都已终止,并且至少有一个容器以失败的方式终止,也就是说这个容器要么以非零状态退出,要么被系统终止,可以通过logs和decsribe查看Pod的日志和状态。

Unknown(未知)

通常是由于通信问题造成的无法获得Pod的状态。

ImagePullBackOffErrImagePull

镜像拉取失败,一般是由于镜像不存在、网络不通或者需要登录认证引起的,可以使用describe命令查看具体原因。

CrashLoopBackOff

容器启动失败,可以通过logs命令查看具体的原因,一般为启动命令不正确、健康检查不通过等。

OOMKilled

容器内存溢出,一般是容器的内存Limit设置的过小,或者程序本身有内存溢出,可以通过logs查看程序的启动日志。

Terminating

Pod正在被删除,可以通过describe查看状态。

SysctlForbidden

Pod自定义了内核配置,但kubectl没有添加内核配置或配置的内核参数不支持,可以通过describe查看具体原因。

Completed

容器内部主进程退出,一般计划任务执行结束会显示该状态,此时可以通过logs查看容器日志。

ContainerCreating

Pod正在被创建,一般为正在下载镜像,或者有配置不当的地方,可以通过describe查看具体原因。

说明:Pod的Pause字段只有Pending、Running、Succeeded、Failed、Unknown5种,其余的为处于上述状态的原因,可以通过kubectl get pod xxx -o yaml查看。

3. Pod的镜像拉取策略和重启策略

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

操作方式

说明

Always

总是拉取,当镜像tag为latest时,默认为Always。

Never

无论是否存在都不会拉取。

IfNotPresent

镜像不存在时拉取镜像,默认,排除latest。

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

操作方法

说明

Always

默认策略。容器失败时,自动重启该容器。

OnFailure

容器不以0的状态码终止,自动重启该容器。

Nerver

无论何种状态,都不会重启。

4. Pod探针

在使用裸机或者裸容器部署时,一般很难对应用做很完善的健康检查,而Pod提供的探针可以很方便地用来检测容器内的应用是否正常。

探针的种类:

种类

说明

startupProbe

kubernetes 1.16新加的探测方式,用于判断容器内的应用程序是否已经启动。如果配置了startupProbe,就会先禁用其他探测,知道它成功为止。如果探测失败,kubectl会杀死容器,之后根据重启策略进行处理,如果探测成功,或没有配置startupProbe,则状态为成功,之后就不再探测。

livenessProbe

用于探测容器是否在运行,如果探测失败,kubectl会杀死容器并根据重启策略进行相应的处理。如果未指定该探针,将默认为Success。

readinessProbe

一般用于探测容器内的程序是否健康,即判断容器是否为就绪(Ready)状态。如果是,则可以处理请求,否则Endpoints Controller将从所有Service的Endpoints中删除此容器所在Pod的IP地址。如果未指定,将默认为Success。

探针的实现方式:

实现方式

说明

ExecAction

在容器内执行一个指定的命令,如果命令返回值为0,则认为容器健康。

TCPSockerAction

通过TCP连接检查容器指定的端口,如果端口开放,则认为容器健康。

HTTPGetAction

对指定的URL进行Get请求,如果状态码在200-400,则认为容器健康。

Pod探针检查容器后可能得到的状态:

状态

说明

Success(成功)

容器通过检测。

Failure(失败)

容器检测失败。

Unknown(未知)

诊断失败,因此不采取任何措施。

示例:

apiVersion: v1 # 必选, API 的版本号
kind: Pod # 必选,类型 Pod
metadata: # 必选,元数据
  name: nginx # 必选,符合 RFC 1035 规范的 Pod 名称
spec: # 必选,用于定义 Pod 的详细信息
  containers: # 必选,容器列表
  - name: nginx # 必选,符合 RFC 1035 规范的容器名称
    image: registry.cn-beijing.aliyuncs.com/jiangxiaonan/nginx:1.22.1  # 必选,容器所用的镜像的地址
    imagePullPolicy: IfNotPresent  # 镜像拉取策略
    command: # 可选,容器启动执行的命令
    - sh
    - -c
    - sleep 30; nginx -g "daemon off;"
    startupProbe:
      tcpSocket: # 端口检测方式
        port: 80
      initialDelaySeconds: 80 # 初始化时间
      timeoutSeconds: 2 # 超时时间
      periodSeconds: 5 # 检测间隔
      successThreshold: 1 # 检查成功为 2 次表示就绪
      failureThreshold: 5 # 检测失败 1 次表示未就绪
    readinessProbe: # 可选,健康检查。注意三种检查方式同时只能使用一种。
      httpGet: # 接口检测方式
        path: /index.html # 检查路径
        port: 80
        scheme: HTTP # HTTP or HTTPS
        #httpHeaders: # 可选, 检查的请求头
        #- name: end-user
        # value: Jason
      initialDelaySeconds: 10 # 初始化时间, 健康检查延迟执行时间
      timeoutSeconds: 2 # 超时时间
      periodSeconds: 5 # 检测间隔
      successThreshold: 1 # 检查成功为 2 次表示就绪
      failureThreshold: 2 # 检测失败 1 次表示未就绪
    livenessProbe: # 可选,健康检查
      exec: # 端口检测方式
        command:
        - sh
        - -c
        - pgrep nginx
      initialDelaySeconds: 10 # 初始化时间
      timeoutSeconds: 2 # 超时时间
      periodSeconds: 5 # 检测间隔
      successThreshold: 1 # 检查成功为 2 次表示就绪
      failureThreshold: 2 # 检测失败 1 次表示未就绪
    ports: # 可选,容器需要暴露的端口号列表
    - containerPort: 80 # 端口号
  restartPolicy: Never   # 容器重启策略

5. preStop 和 postStart

postStart用于容器创建完执行的指令。

preStop用于容器停止前执行的指令。

apiVersion: v1 # 必选, API 的版本号
kind: Pod # 必选,类型 Pod
metadata: # 必选,元数据
  name: nginx-new1 # 必选,符合 RFC 1035 规范的 Pod 名称
spec: # 必选,用于定义 Pod 的详细信息
  containers: # 必选,容器列表
  - name: nginx # 必选,符合 RFC 1035 规范的容器名称
    image: registry.cn-beijing.aliyuncs.com/jiangxiaonan/nginx:1.22.1  # 必选,容器所用的镜像的地址
    imagePullPolicy: IfNotPresent
    lifecycle:
      postStart: # 容器创建完成后执行的指令, 可以是 exec httpGet TCPSocket
        exec:
          command:
          - sh
          - -c
          - 'mkdir -p /data/hello/'
      preStop:
        exec:
          command:
          - sh
          - -c
          - sleep 10
    ports: # 可选,容器需要暴露的端口号列表
    - containerPort: 80 # 端口号
  restartPolicy: Never

0
博主关闭了所有页面的评论