目 录CONTENT

文章目录

Pod

Sakura
2023-11-30 / 0 评论 / 1 点赞 / 21 阅读 / 9520 字 / 正在检测是否收录...

Pod

1. Pod 配置文件

1.1 Pod 资源

官方教程:

Kubernetes 对象 | Kubernetes

1.2 自定义 Pod 配置

  1. 首先编写 Pod 配置文件

apiVersion: v1 # api 文档版本
kind: Pod  # 资源对象类型,也可以配置为像Deployment、StatefulSet这一类的对象
metadata: # Pod 相关的元数据,用于描述 Pod 的数据
  name: nginx-demo # Pod 的名称
  labels: # 定义 Pod 的标签
    type: app # 自定义 label 标签,名字为 type,值为 app
    test: 1.0.0 # 自定义 label 标签,描述 Pod 版本号
  namespace: 'default' # 命名空间的配置
spec: # 期望 Pod 按照这里面的描述进行创建
  containers: # 对于 Pod 中的容器描述
  - name: nginx # 容器的名称
    image: nginx:1.7.9 # 指定容器的镜像
    imagePullPolicy: IfNotPresent # 镜像拉取策略,指定如果本地有就用本地的,如果没有就拉取远程的
    command: # 指定容器启动时执行的命令
    - nginx
    - -g
    - 'daemon off;' # nginx -g 'daemon off;'
    workingDir: /usr/share/nginx/html # 定义容器启动后的工作目录
    ports:
    - name: http # 端口名称
      containerPort: 80 # 描述容器内要暴露什么端口
      protocol: TCP # 描述该端口是基于哪种协议通信的
    - env: # 环境变量
      name: JVM_OPTS # 环境变量名称
      value: '-Xms128m -Xmx128m' # 环境变量的值
    reousrces:
      requests: # 最少需要多少资源
        cpu: 100m # 限制 cpu 最少使用 0.1 个核心
        memory: 128Mi # 限制内存最少使用 128兆
      limits: # 最多可以用多少资源
        cpu: 200m # 限制 cpu 最多使用 0.2 个核心
        memory: 256Mi # 限制 最多使用 256兆
  restartPolicy: OnFailure # 重启策略,只有失败的情况才会重启
  1. 通过配置文件创建 Pod

# 通过配置文件创建Pod
root@Sakura:~# kubectl create -f ngin-demo.yaml

# 可以详细查看容器信息
root@Sakura:~# Kubectl describe po nginx-demo

# 获取默认命名空间 Pod
root@Sakura:~# kubectl get po
NAME                     READY   STATUS    RESTARTS       AGE
nginx-85b98978db-sbvj8   1/1     Running   5 (3h2m ago)   3d1h

1.3 查看其他系统 Pod 的配置文件

# 查看 kube-system 命名空间下的 Pod
root@Sakura:~# kubectl get po -n kube-system
NAME                           READY   STATUS    RESTARTS        AGE
coredns-6d8c4cb4d-hqjgl        1/1     Running   5 (3h45m ago)   3d3h
coredns-6d8c4cb4d-whkxg        1/1     Running   5 (3h45m ago)   3d3h
etcd-node                      1/1     Running   5 (3h45m ago)   3d3h
kube-apiserver-node            1/1     Running   5 (3h45m ago)   3d3h
kube-controller-manager-node   1/1     Running   5 (3h45m ago)   3d3h
kube-proxy-fcg5t               1/1     Running   5 (3h45m ago)   3d2h
kube-proxy-hmrz4               1/1     Running   5 (3h45m ago)   3d3h
kube-proxy-rw6kt               1/1     Running   5 (3h45m ago)   3d2h
kube-scheduler-node            1/1     Running   5 (3h45m ago)   3d3h

# 编辑指定的 Pod 文件,需要加命名空间
root@Sakura:~# kubectl edit po -n kube-system coredns-6d8c4cb4d-whkxg
Edit cancelled, no changes made.

2. Pod 探针

容器内应用的监测机制,根据不同的探针来判断容器应用当前的状态

2.1 探针的三种类型

  • StartupPorbe

用于判断应用程序是否已经启动了。当配置了 startupProbe 后,会先禁用其他探针,直到 startupProbe 成功后,其他探针才会继续。

有时候不能判断 Pod 需要多长时间启动,所以配置 startupProbe 等到 Pod 启动后,再执行其他探针

startupProbe:
  httpGet:
    path: /api/startup
    port: 80
  • LiveressProbe

用于探测容器中的应用是否运行,如果探测失败,kubelet 会根据配置的重启策略进行重启,若没有配置,默认就认为容器启动成功,不会执行重启策略。

livenessProbe:
  failureThreshold: 5
  httpGet:
    path: /health
    port: 8080
    scheme: HTTP
  initialDelaySeconds: 60
  periodSeconds: 10
  successThreshold: 1
  timeoutSeconds: 5
  • ReadinessProbe

用于探测容器内的程序是否健康,它的返回值如果返回 success,那么就认为该容器已经完全启动,并且该容器是可以接收外部流量的。

readinessProbe:
  failureThreshold: 3 # 错误次数
  httpGet: # 探测方式httpGet
    path: /ready # 路径
    port: 8181 # 端口
    scheme: HTTP # 协议
  periodSeconds: 10 # 间隔时间
  successThreshold: 1 # 成功阈值
  timeoutSeconds: 1 # 超时时间

2.2 探测方式

  • ExecAction : 在容器内部执行一个命令,如果返回值为 0,则任务容器时健康的。

  • TCPSocketAction : 通过 tcp 连接监测容器内端口是否开放,如果开放则证明该容器健康

  • HTTPGetAction : 生产环境用的较多的方式,发送 HTTP 请求到容器内的应用程序,如果接口返回的状态码在 200~400 之间,则认为容器健康。

2.3 参数配置

# 初始化时间
initialDelaySeconds: 60 # 在60秒范围内,LiveresssProbe和ReadinessProbe,一定程度上可以替代StartupProbe,但是不能保证应用一定能在时间中初始化完成

# 超时时间
timeoutSeconds: 2 # 执行检测操作多长时间为超时

# 监测间隔时间
periodSeconds: 5 # 上一次失败后隔多长时间在检测

# 检查
successThreshold: 1 # 1 次成功就表示成功

# 监测失败
failureThreshold: 2 # 2 次就表示失败

2.4 应用

  1. 启动探针的使用

Linux 小技巧: set paste 可以使得复制的内容变为粘贴模式,格式就不会错误了

	contsiners: # 对于 Pod 中的容器描述
	- name: nginx # 容器的名称
	  image: nginx:latest
	  imagePullPlicy: IfNotPresent # 镜像拉取策略
	  startupProbe: # 应用启动探针配置
	    httpGet: # 探测方式基于http探测
		  path: /index.html # http请求路径
		tcpSocket:
		  port: 80 # 请求窗口
	    exec:
		  command:
		  - sh
		  - -c
		  - "sleep 5; echo 'success' > /inited;"

完成后启动 Pod , 并且使用 kubectl descibe po nginx-demo 查看 Pod 详细信息

# 进入容器 
# -c 指定容器
kubctl exec -it nainx-po -c nginx /bin/bash
# -- 结束指令,不会增加指令
kubctl exec -it nainx-po -c nginx -- cat /inited
  1. Liverness 探针的使用

startupProbe: # 应用启动探针配置
  httpGet: # 探测方式基于http探测
    path: /sakura.html # http请求路径
	port: 80
  faileureThreshold: 3 # 失败多少次
  periodSeconds: 10 # 间隔时间
  successThreshold: 1 # 多少次数成功算成功
  timeoutSeconds: 5 # 请求的超时时间

上面写的 path 必然是请求不到的,所以 Liverness 探针会对 Pod 重启

# 使用get po查看重启次数
kubectl get po

# 使用 descibe 查看详细信息
kubectl descibe po nginx-po

# 使用 cp 命令复制文件到路径下
kubectl cp started.html ngins-po:/usr/share/nginx/html
  1. Readiness 探针的使用

readinessProbe: # 应用启动探针配置
  httpGet: # 探测方式基于http探测
    path: /sakura.html # http请求路径
	port: 80
  faileureThreshold: 3 # 失败多少次酸失败
  periodSeconds: 10 # 间隔时间
  successThreshold: 1 # 多少次数成功算成功
  timeoutSeconds: 5 # 请求的超时时间

通过 get po 可以看到即使状态是 Running , 但是 READY 是 0 ,也是访问不了的

root@Sakura:~# kubectl get po                                        
NAME                     READY   STATUS    RESTARTS     AGE
nginx-85b98978db-sbvj8   0/1     Running   5 (8h ago)   3d6h

root@Sakura:~# kubectl get po -o wide
NAME                     READY   STATUS    RESTARTS     AGE    IP           NODE          NOMINATED NODE   READINESS GATES
nginx-85b98978db-sbvj8   1/1     Running   5 (8h ago)   3d6h   10.244.1.7   sakuranode2   <none>           <none>

3. Pod 生命周期

一般情况下,只会用到 preStop,postStart 基本不会用,会使用初始化容器来替代 postStart

因为 Pod 主容器中也会用 command,两者可能会同时执行

preStop 的应用:

  1. 1. 数据清理,数据保存

  2. 2. 注册中心下线

删除操作的流程,

  1. endPotint 删除 pod 的 ip 地址

  2. Pod 变成 Terminating 状态 ( 变为删除中的状态后,会给 pod 一个宽限期,让 pod 去执行一些清理或销毁操作 )

  3. 执行 preStop 状态

# 默认 Terminating 的时间是30秒,可以手动设置(和containers是同级的)
terminationGracePeriodSeconds: 30
containers:

# 配置postStart 和 preStop
lifecycle:
  postStar: # 生命周期启动阶段做的事情,不一定在容器的command之前运行
    exec:
      command:
      - sh
      - -c
      - "echo "start" > index.html"
  preStop:
    exec:
      command:
      - sh
      - -c
      - "echo "stop" > index.html"

# 实时监听pod状态,如果pod状态发送变化会实时打印信息
kubectl get po -w

1

评论区