k8s-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的相关信息。
posted @   wangyetao  阅读(25)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示