第一章:什么是Pod

第二章:Pod探针

第一章:什么是Pod

  • Pod可以简单的理解为是一组、一个或多个容器构成,每个Pod还包含一个Pause容器。Pause容器是Pod容器的父进程,它主要负责僵尸进程的回收管理,同时通过Pause容器可以使得一个Pod里面的不同容器共享存储、网络、PID、IPC等,容器之间可以使用localhost:port的方式相互访问,可以使用volume等实现数据共享。根据docker的构造,Pod可被建模为一组具有共享命名空间、卷、IP地址和PORT端口的容器。
    在这里插入图片描述

1.1 创建一个Pod

1、使用这个命令把nginx:1.15.2版本的yaml文件拉取到本地
kubectl run nginx --image=nginx:1.15.2 -oyaml --dry-run > pod.yaml

2、下面是pod.yaml文件的内容
candidate@master01:~/practise$ cat pod.yaml
apiVersion: v1  #apiVersion版本
kind: Pod       #资源的数据类型,deployment ststefulset service
metadata:       #元数据信息
  creationTimestamp: null
  labels:       #标签
    run: nginx  #key=value
  name: nginx   #pod名称
spec:           #定义pod
  containers:   #配置容器的地方
  - image: nginx:1.21.6        #指定容器的镜像
    name: nginx                 #指定容器的名称
    resources: {}
    command: ["sleep","5"]
  dnsPolicy: ClusterFirst
  restartPolicy: Always
status: {}

3、创建一个pod
candidate@master01:~/practise$ kubectl create -f pod.yaml
pod/nginx created

4、查看此pod的状态,可以看到status是running,restarts表示的是重启的次数,age表示运行的时间
candidate@master01:~/practise$ kubectl get pod
NAME                            READY   STATUS    RESTARTS      AGE
11-factor-app                   1/1     Running   9 (21m ago)   127d
foo                             1/1     Running   9 (20m ago)   127d
front-end-55455ccf94-pjl2m      1/1     Running   9 (20m ago)   127d
nginx                           1/1     Running   0             66s
presentation-5f64bd874c-68z8p   1/1     Running   9 (20m ago)   127d

5、pod是不能被修改的,只能被删除,两种方式:
kubectl delete -f pod.yaml
kubectl delete pod  nginx

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

  • candidate@master01:~/practise$ kubectl explain pod.spec.containers
apiVersion: v1  #apiVersion版本
kind: Pod       #资源的数据类型,deployment ststefulset service
metadata:       #元数据信息
  creationTimestamp: null
  labels:       #标签
    run: nginx  #key=value
  name: nginx   #pod名称
spec:           #定义pod
  containers:   #配置容器的地方
  - image: nginx:1.21.6        #指定容器的镜像
    name: nginx                 #指定容器的名称
    resources: {}
    command: ["sleep","5"]
  dnsPolicy: ClusterFirst
  restartPolicy: Always
status: {}

1.3 pod状态及pod故障排查命令

状态说明
Pending(挂起)Pod 已被 Kubernetes 系统接收,但仍有一个或多个容器未被创建,可以通过kubectl describe 查看处于 Pending Pending(挂起) 状态的原因
Running(运行中)Pod已经被绑定到一个节点上,并且所有的容器都已经被创建,而且至少有一个是运行的状态,或者是正在启动或者重启,使用kubectl logs -f
Succeeded(成功)所有容器执行成功并终止,并且不会再次重启
Failed(成功)所有容器都已终止,并且至少有一个容器以失败的方式终止,也就是说这个容器要么以非零状态退出,要么被系统终止,可以通过 logs 和 describe 查看 Pod 日志和状态
Unknown(成功)通常是由于通信问题造成的无法获得 Pod 的状态
  • Pod处于running状态就一定是可用的么?
  • 答:status需要是running,并且ready 前后都需要是1才行
    在这里插入图片描述

1.4 pod状态及pod故障排查命令

  • 通过 spec.containers[].imagePullPolicy 参数可以指定镜像的拉取策略,目前支持的策略如下:
操作方式说明
Always总是拉取,当镜像 tag 为 latest 时,且 imagePullPolicy 未配置,默认为 Always
Nerver不管是否存在都不会拉取
IfNotPresent镜像不存在时拉取镜像,如果 tag 为非 latest,且 imagePullPolicy 未配置,默认为 IfNotPresent
1、进行测试修改,修改nginx的版本号(当前系统中并不存在),然后kubect delete -f pod.yaml或者kubectl delete pod nginx,再进行启动:kubectl create -f pod.yaml,

2、使用kubectl get pod nginx -o yaml可以看出nginx这个pod对应的yaml文件
spec:
  containers:
  - image: nginx:1.21.7
    imagePullPolicy: IfNotPresent
    name: nginx
    resources: {}
    terminationMessagePath: /dev/termination-log

1.5 pod重启策略

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

restartPolicy是pod级别的,不是container级别的:
如上图中,container级别下command参数启动5秒后就结束,查看pod的状态,发现启动一次以后不管是成功还是失败后都不会再次进行启动

spec:           #定义pod
  containers:   #配置容器的地方
  - image: nginx:1.21.7        #指定容器的镜像
    name: nginx                 #指定容器的名称
    resources: {}
    command: {"sleep","10"}
  dnsPolicy: ClusterFirst
  restartPolicy: Always
status: {}

修改restartPolicy参数为Always之后,再次启动查看状态
能够发现他这个状态是completed然后又变成running说明他是会不停的进行重启的

第二章:Pod探针

2.1、 Pod的三种探针

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

2.2、 Pod探针的实现方式

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

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐