老男孩教育专注IT教育10余年,只培养IT技术精英

全国免费咨询电话(渠道合作):400-609-2893

Kubernetes基础之pod介绍!linux培训机构

老男孩IT教育

常见问题

2022年11月23日 09:31

pod是一组并置的容器,代表了kubernetes中的基本构建模块,在实际应用中,我们往往不会单独部署容器,更多的是针对组pod的容器进行部署和操作,以下是详细的内容:

       pod是一组并置的容器,代表了kubernetes中的基本构建模块,在实际应用中,我们往往不会单独部署容器,更多的是针对组pod的容器进行部署和操作,以下是详细的内容:

linux学习机构

       一、pod资源运行状态

       Pod的status定义在PodStatus对象中,其中有一个phase字段,它简单描述了Pod在其生命周期的阶段。

       熟悉Pod的各种状态对我们理解如何设置Pod的调度策略、重启策略是很有必要的,下面是phase可能的值,也就是pod常见的状态:

       挂起(Pending):我们在请求创建pod时,条件不满足,调度没有完成,没有任何一个节点能满足调度条件,已经创建了pod但是没有适合它运行的节点叫做挂起,调度没有完成,处于pending的状态会持续一段时间,包括调度Pod的时间和通过网络下载镜像的时间。

       运行中(Running):Pod已经绑定到了一个节点上,Pod中所有的容器都已被创建。至少有一个容器正在运行,或者正处于启动或重启状态。

       成功(Succeeded):Pod中的所有容器都被成功终止,并且不会再重启。

       失败(Failed):Pod中的所有容器都已终止了,并且至少有一个容器是因为失败终止。也就是说容器以非0状态退出或者被系统终止。

       未知(Unknown):未知状态,所谓pod是什么状态是apiserver和运行在pod节点的kubelet进行通信获取状态信息的,如果节点之上的kubelet本身出故障,那么apiserver就连不上kubelet,得不到信息了,就会看Unknown

       扩展状态信息如下:

       Evicted状态:出现这种情况,多见于系统内存或硬盘资源不足,可df-h查看docker存储所在目录的资源使用情况,如果百分比大于85%,就要及时清理下资源,尤其是一些大文件、docker镜像。

       CrashLoopBackOff:容器曾经启动了,但可能又异常退出了

       Error:Pod启动过程中发生了错误

       当以上异常状态信息出现时,可以利用以下命令进行获取问题信息,进而分析处理问题。

# kubectl describe
# kubectl logs

       二、pod资源重启策略

       Pod的重启策略(RestartPolicy)应用于Pod内的所有容器,并且仅在Pod所处的Node上由kubelet进行判断和重启操作。

       当某个容器异常退出或者健康检查失败时,kubelet将根据 RestartPolicy 的设置来进行相应的操作。

       Pod的重启策略包括:Always、OnFailure和Never,默认值为Always。

       Always:当容器失败时,由kubelet自动重启该容器;

       OnFailure:当容器终止运行且退出码不为0时,由kubelet自动重启该容器;

       Never:不论容器运行状态如何,kubelet都不会重启该容器;

[root@xianchaomaster1 ~]# vim pod.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: demo-pod
  namespace: default
  labels:
    app: myapp
spec:
  restartPolicy: Always   -- 设置重启策略信息为always
  containers:
  - name:  tomcat-pod-java
    ports:
    - containerPort: 8080
    image: tomcat:8.5-jre8-alpine
    imagePullPolicy: IfNotPresent

       三、pod资源生命周期

       初始化容器(init container)

       Pod里面可以有一个或者多个容器,部署应用的容器可以称为主容器,在创建Pod时候,Pod中可以有一个或多个先于主容器启动的Init容器,这个init容器就可以成为初始化容器,初始化容器一旦执行完,它从启动开始到初始化代码执行完就退出了,它不会一直存在。

       所以在主容器启动之前执行初始化,初始化容器可以有多个,多个初始化容器是要串行执行的,先执行初始化容器1,在执行初始化容器2等,等初始化容器执行完初始化就退出了,然后再执行主容器,主容器一退出,pod就结束了,主容器退出的时间点就是pod的结束点,它俩时间轴是一致的。

       Init容器就是做初始化工作的容器,可以有一个或多个,如果多个按照定义的顺序依次执行,只有所有的初始化容器执行完后,主容器才启动。由于一个Pod里的存储卷是共享的,所以Init Container里产生的数据可以被主容器使用到,Init Container可以在多种K8S资源里被使用到,如Deployment、DaemonSet, StatefulSet、Job等,但都是在Pod启动时,在主容器启动前执行,做初始化工作。

       Init容器与普通的容器区别是:

       Init容器不支持Readiness(探测),因为它们必须在Pod就绪之前运行完成;

       每个Init容器必须运行成功,下一个才能够运行;

       如果Pod的Init容器失败,Kubernetes会不断地重启该Pod,直到Init容器成功为止,然而,如果Pod对应的restartPolicy值为Never则不会重新启动;

       初始化容器实战配置信息:

# 编写含有初始化容器的资源配置文件
[root@k8s-master-01 init]# cat init.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: myapp-pod
  labels:
    app: myapp
spec:
  containers:
  - name: myapp-container
    image: busybox:1.28
    command: ['sh', '-c', 'echo The app is running! && sleep 3600']
  initContainers:  -- 配置的初始化容器信息
  - name: init-myservice
    image: busybox:1.28
    command: ['sh', '-c', "until nslookup myservice.$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace).svc.cluster.local; do echo waiting for myservice; sleep 2; done"]
  - name: init-mydb
    image: busybox:1.28
    command: ['sh', '-c', "until nslookup mydb.$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace).svc.cluster.local; do echo waiting for mydb; sleep 2; done"]

# 加载含有初始化容器的资源配置文件/并查看状态信息
[root@k8s-master-01 init]# kubectl apply -f init.yaml
[root@k8s-master-01 init]# kubectl get pods
NAME                READY    STATUS      RESTARTS   AGE
myapp-pod             0/1      Init:0/2    0           2m29s

# 编写含有服务资源配置文件
[root@k8s-master-01 init]# cat service.yaml 
---
apiVersion: v1
kind: Service
metadata:
  name: myservice
spec:
  ports:
  - protocol: TCP
    port: 80
    targetPort: 9376
---
apiVersion: v1
kind: Service
metadata:
  name: mydb
spec:
  ports:
  - protocol: TCP
    port: 80
    targetPort: 9377

# 加载服务资源配置文件/并查看状态信息
[root@k8s-master-01 init]# kubectl apply -f service.yaml
[root@k8s-master-01 init]# kubectl get pods
NAME               READY    STATUS     RESTARTS    AGE
myapp-pod           1/1      Running    0            3m36s

       主容器

       初始化容器启动之后,开始启动主容器,在主容器启动之前有一个post start hook(容器启动后钩子)和pre stop hook(容器结束前钩子),无论启动后还是结束前所做的事都可以把它放两个钩子,这个钩子就表示用户可以用它来钩住一些命令,来执行它,做开场前的预设,结束前的清理,如awk有begin,end,和这个效果类似;

       postStart:该钩子在容器被创建后立刻触发,通知容器它已经被创建。如果该钩子对应的hook handler执行失败,则该容器会被杀死,并根据该容器的重启策略决定是否要重启该容器,这个钩子不需要传递任何参数。

       preStop:该钩子在容器被删除前触发,其所对应的hook handler必须在删除该容器的请求发送给Docker daemon之前完成。在该钩子对应的hook handler完成后不论执行的结果如何,Docker daemon会发送一个SGTERN信号量给Docker daemon来删除该容器,这个钩子不需要传递任何参数。

       老男孩教育Linux运维云计算课程汇集了虚拟化、云计算、安全攻防、Python开发、SRE等技术,课堂效率高、内容丰富全面,由浅入深,循序渐进,帮助学员稳扎稳打,夯实基础,在有限的时间内帮助学员高效提升,成为符合企业需求的技术型人才。

   推荐阅读:

       Linux系统中的用户与组是什么?LinuxSRE培训班

       Linux系统下常用的3种网络测速工具!Linux运维培训

       选择Linux系统的五大好处!Linux培训机构

本文经授权发布,不代表老男孩教育立场。如若转载请联系原作者。