第6章 K8s管理应用程序生命周期(下)
• Pod对象:
• 基本概念
• 存在的意义
• 资源共享实现机制
• 管理命令
• Pod设计思想
• 应用自修复(重启策略+健康检查)
• 环境变量
• Init container
• 静态Pod
6.1Pod对象:基本概念
Pod是Kubernetes创建和管理的最小单元,一个pod由一个容器或多个容器组成,这些容器共享存储、网络。
6.1.1Pod特点:
- 一个pod可以理解为是一个应用实例,提供服务
- Pod中容器始终部署在一个Node节点上
- Pod中容器共享网络,存储资源
- Kubernetes直接管理pod,而不是容器
6.2 Pod对象:存在的意义
6.2.1Pod主要用法:
1) 运行单个容器:最常见的用法,在这种情况下,可以将pod看做是单个容器的抽象封装
2) 运行多个容器:封装多个紧密耦合且需要共享自愿的应用程序
6.2.2如果有这些需求,你可以运行多个容器:
1) 两个应用之间发生文件交互
2) 两个应用需要通过127.0.0.1或者socket通信
3) 两个应用需要发生频繁的调用
6.3Pod对象:资源共享实例机制
共享网络:将业务容器网络加入到"负责网络的容器"实现网络共享
共享存储: 容器通过数据卷共享数据
6.3.1 Pod对象:共享网络/共享存储
(1)共享网络实例:
apiVersion: v1 kind: Pod metadata: labels: app: test name: pod-net-test namespace: default spec: containers: - image: busybox name: test command: ["/bin/sh","-c","sleep 12h"] - image: nginx name: web
结果:
[root@k8s-master1 network-gongxiang]# kubectl exec -it pod-net-test -c web -- sh # cd /usr/share/nginx/html # ls 50x.html index.html # echo web>index.html # exit [root@k8s-master1 network-gongxiang]# kubectl exec -it pod-net-test -c test -- sh / # wget 127.0.0.1:80 Connecting to 127.0.0.1:80 (127.0.0.1:80) saving to 'index.html' index.html 100% |********************************************************| 4 0:00:00 ETA 'index.html' saved / # ls bin etc index.html root tmp var dev home proc sys usr / # cat index.html
(2)共享存储示例
apiVersion: v1 kind: Pod metadata: labels: app: test name: pod-volume-test namespace: default spec: containers: - image: busybox name: test command: ["/bin/sh","-c","sleep 12h"] volumeMounts: # 数据卷挂载 - name: log # 指定挂载的数据卷名称 mountPath: /data # 数据卷挂载到容器中的路径 - image: nginx name: web volumeMounts: - name: log mountPath: /usr/share/nginx/html volumes: # 定义数据卷 - name: log # 数据卷名称 emptyDir: {} # 数据卷类型
结果:
kubectl apply -f pod-volume-test.yaml kubectl exec -it pod-volume-test -c web -- sh [root@k8s-master1 network-gongxiang]# kubectl get pods NAME READY STATUS RESTARTS AGE pod-volume-test 2/2 Running 0 4m51s [root@k8s-master1 network-gongxiang]# [root@k8s-master1 network-gongxiang]# [root@k8s-master1 network-gongxiang]# kubectl exec -it pod-volume-test -c test -- sh / # cd /data/ /data # ls /data # touch a.txt /data # exit [root@k8s-master1 network-gongxiang]# kubectl exec -it pod-volume-test -c web -- sh # cd /usr/share/nginx/html/ # ls a. txt # touch b.txt # exit [root@k8s-master1 network-gongxiang]# kubectl exec -it pod-volume-test -c test -- sh / # cd /data /data # ls a.txt b.txt
6.4pod对象:管理命令
创建Pod: kubectl apply -f pod.yaml 或者使用命令:kubectl run nginx --image=nginx 查看Pod: kubectl get pods kubectl describe pod <Pod名称> 查看日志: kubectl logs <Pod名称> [-c CONTAINER] kubectl logs <Pod名称> [-c CONTAINER] -f 进入容器终端: kubectl exec <Pod名称> [-c CONTAINER] -- bash 删除Pod: kubectl delete pod <Pod名称>
定义pod
apiVersion: v1 kind: Pod metadata: name: my-pod spec: containers: - name: container1 image: nginx - name: container2 image: centos
6.5 Pod对象:重启策略和健康检查(应用自修复)
6.5.1重启策略(restartPolicy):
- Always:当容器终止退出后,总是重启容器,默认策略。
- OnFailure:当容器异常退出(退出状态码非0)时,才重启容器。
- Never:当容器终止退出,从不重启容器。
6.5.2健康检查有以下两种类型:
- StartupProbe:(主要应用容器启动慢的场景)
k8s1.16版本后新加的探测方式,用于判断容器内应用程序是否已经启动。如果配置了startupProbe,
就会先禁止其他的探测,直到它成功为止,成功后将不在进行探测。
- livenessProbe(存活检查):用于探测容器是否运行,如果探测失败,kubelet会根据配置的重启策略进行相应的处理。若没有配置该探针,默认就是success。(根据Pod的restartPolicy来操作。)
- readinessProbe(就绪检查):一般用于探测容器内的程序是否健康,他的返回值如果为success,那么就代表这个容器已经完成启动,并且程序已经是可以接受流量的状态。如果检查失败,Kubernetes会把Pod从service endpoints中剔除。
6.5.3支持以下三种检查方法:
• httpGet:通过应用程序暴露的API地址来检查程序是否是正常的(发送HTTP请求),返回200-400范围状态码为成功。
• exec:执行Shell命令返回状态码是0为成功。
• tcpSocket:发起TCP Socket建立成功。
6.5.4 探针检查参数配置
InitialDelaySeconds:60 #初始化时间
timeoutSeconds:2 #超时时间
PeriodSeconds:5 #检测间隔
SuccessThreshold:1 #检查成功为1次表示就绪
FailureThreshold:2 #检测失败2次就表示外就绪
PostStart:#容器创建完成后执行的指令,可以是exec,httpGet,TCPSocket
案例:
apiVersion: apps/v1 kind: Deployment metadata: labels: app: pod-check name: pod-check spec: replicas: 3 selector: matchLabels: app: pod-check strategy: {} template: metadata: labels: app: pod-check spec: containers: - image: nginx name: nginx resources: {} livenessProbe: httpGet: path: /index.html port: 80 initialDelaySeconds: 30 #启动容器后多少秒健康检查 periodSeconds: 10 #以后每间隔多少秒检查一次 readinessProbe: httpGet: path: /index.html port: 80 initialDelaySeconds: 10 periodSeconds: 10 status: {}
service:
apiVersion: v1 kind: Service metadata: creationTimestamp: null labels: app: pod-check name: pod-check spec: ports: - port: 80 protocol: TCP targetPort: 80 selector: app: pod-check type: NodePort
验证:livenessProbe
Kubectl logs pod-check-7f9bb5c47b-2bzw4 -f
验证:readinessProbe
6.6Pod的环境变量
创建pod时,可以为其下的容器设置环境变量
应用场景:
- 容器内应用程序获取pod信息
- 容器内应用程序通过用户定义的变量改变默认行为
变量值几种定义方式:
- 自定义变量值
- 变量值从pod属性获取
- 变量值从Secret、ConfigMap获取

apiVersion: v1 kind: Pod metadata: name: pod-envars spec: containers: - name: test image: busybox command: [ "sh", "-c", "sleep 36000"] env: # 变量值从Pod属性获取 - name: MY_NODE_NAME valueFrom: fieldRef: fieldPath: spec.nodeName - name: MY_POD_NAME valueFrom: fieldRef: fieldPath: metadata.name - name: MY_POD_NAMESPACE valueFrom: fieldRef: fieldPath: metadata.namespace - name: MY_POD_IP valueFrom: fieldRef: fieldPath: status.podIP - name: ABC # 自定义变量值 value: "123456"
6.7Pod对象:Init Container
Init Container:顾名思义,用于初始化工作,执行完就结束,可以理解为一次性任务。
• 支持大部分应用容器配置,但不支持健康检查
• 优先应用容器执行
应用场景:
• 环境检查:例如确保应用容器依赖的服务启动后再启动应用容器
• 初始化配置:例如给应用容器准备配置文件
6.7.1 Pod对象:Init Container案例:
示列:部署一个web网站,网站程序没有打到镜像中,而是希望从代码仓库中动态拉取到应用容器中。
apiVersion: v1 kind: Pod metadata: name: init-demo spec: initContainers: - name: download image: busybox command: - wget - "-O" - "/opt/index.html" - http://www.ctnrs.com volumeMounts: - name: wwwroot mountPath: "/opt" containers: - name: nginx image: nginx ports: - containerPort: 80 volumeMounts: - name: wwwroot mountPath: /usr/share/nginx/html volumes: - name: wwwroot emptyDir: {}
6.8Pod对象,Init Container
因此,Pod中会有这几种类型的容器:
• Infrastructure Container:基础容器
• 维护整个Pod网络空间
• InitContainers:初始化容器
• 先于业务容器开始执行
• Containers:业务容器
• 并行启动
6.9 Pod对象:静态Pod
静态Pod特点:
1) Pod由特定节点上的kubelet管理
2) 不能使用控制器
3) Pod名称标识当前节点名称
在kubelet配置文件启用静态pod的参数:
staticPodPath: /etc/kubernetes/manifests
注意:将部署的Pod yaml放到该目录会由kubelet自动创建
apiVersion: v1 kind: Pod metadata: creationTimestamp: null labels: run: static-pod name: static-pod spec: containers: - image: nginx name: static-pod #kubectl run static-pod --image=nginx --dry-run=client -o yaml>static-pod.yaml
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!