Kubernetes(三) Pod 详解与 YAML 配置实战指南
Kubernetes Pod 详解与 YAML 配置实战指南
一、Pod 基础概念详解
1.1 Pod 的核心概念
Pod 是 Kubernetes 中的最小部署单元,代表集群中的一个运行进程。一个 Pod 可以包含一个或多个紧密耦合的容器,这些容器共享网络和存储资源。
1.2 Pod 的两种使用方式
单容器 Pod(最常见)
apiVersion: v1
kind: Pod
metadata:name: single-container-pod
spec:containers:- name: nginximage: nginx:1.14
多容器 Pod
apiVersion: v1
kind: Pod
metadata:name: multi-container-pod
spec:containers:- name: appimage: my-app:latest- name: sidecarimage: log-collector:latest
1.3 Pause 容器(基础容器)
在每个 Pod 中,都有一个特殊的 Pause 容器,负责提供 Pod 的 Linux 命名空间基础:
维护整个 Pod 的网络和存储空间
其他容器共享其网络和存储资源
对用户透明,自动运行
1.4 Pod 中的共享资源
网络共享
每个 Pod 分配唯一 IP 地址
Pod 内所有容器共享该 IP 和端口
容器间通过
localhost
直接通信与外界通信需使用宿主机端口映射
存储共享
Pod 可指定多个共享 Volume
所有容器都可访问共享存储
确保容器重启后数据不丢失
二、Pod 容器的分类
2.1 基础容器(Infrastructure Container)
# 查看 kubelet 配置中的基础容器镜像
cat /opt/kubernetes/cfg/kubelet | grep pause
2.2 初始化容器(Init Containers)
特性
必须在应用容器启动前运行完成
按顺序执行,前一个成功后才运行下一个
提供阻塞或延迟应用容器启动的机制
使用场景
apiVersion: v1
kind: Pod
metadata:name: myapp-pod
spec:containers:- name: myapp-containerimage: busybox:1.28command: ['sh', '-c', 'echo The app is running! && sleep 3600']initContainers:- name: init-myserviceimage: busybox:1.28command: ['sh', '-c', 'until nslookup myservice; do echo waiting for myservice; sleep 2; done;']- name: init-mydbimage: busybox:1.28command: ['sh', '-c', 'until nslookup mydb; do echo waiting for mydb; sleep 2; done;']
2.3 应用容器(Main Container)
并行启动
运行业务逻辑的主要容器
三、Pod 的核心配置
3.1 镜像拉取策略(imagePullPolicy)
策略 | 说明 | 使用场景 |
---|---|---|
IfNotPresent | 本地有则用本地,否则拉取 | 默认策略,生产环境推荐 |
Always | 每次都拉取新镜像 | 开发环境,需要最新版本 |
Never | 只用本地镜像 | 离线环境 |
spec:containers:- name: nginximage: nginx:1.15imagePullPolicy: IfNotPresent
3.2 重启策略(restartPolicy)
策略 | 说明 | 适用控制器 |
---|---|---|
Always | 总是重启 | Deployment、StatefulSet |
OnFailure | 失败时重启 | Job、CronJob |
Never | 从不重启 | 自主式Pod |
spec:restartPolicy: Always
四、Pod 资源限制
4.1 资源请求与限制
resources:requests:memory: "64Mi"cpu: "250m"limits:memory: "128Mi"cpu: "500m"
4.2 资源单位详解
CPU 资源单位
1 CPU
=1000m
500m
= 0.5个CPU100m
= 0.1个CPU
内存资源单位
1 Gi = 1024 Mi
1 Mi = 1024 Ki
1 G = 1000 M
1 M = 1000 K
4.3 实战案例
apiVersion: v1
kind: Pod
metadata:name: frontend
spec:containers:- name: webimage: nginxresources:requests:memory: "64Mi"cpu: "250m"limits:memory: "128Mi"cpu: "500m"- name: dbimage: mysqlresources:requests:memory: "512Mi"cpu: "0.5"limits:memory: "1Gi"cpu: "1"
五、健康检查(探针)
5.1 三种探针类型
探针类型 | 作用 | 失败后果 |
---|---|---|
livenessProbe | 检查容器是否运行 | 重启容器 |
readinessProbe | 检查是否就绪接收请求 | 从Service endpoints中剔除 |
startupProbe | 检查应用是否启动 | 在成功前其他探针无效 |
5.2 三种检查方法
exec 方式
livenessProbe:exec:command:- cat- /tmp/healthyinitialDelaySeconds: 5periodSeconds: 5
httpGet 方式
livenessProbe:httpGet:path: /healthzport: 8080httpHeaders:- name: Custom-Headervalue: AwesomeinitialDelaySeconds: 3periodSeconds: 3
tcpSocket 方式
livenessProbe:tcpSocket:port: 8080initialDelaySeconds: 15periodSeconds: 20
5.3 就绪检测实战
apiVersion: v1
kind: Pod
metadata:name: readiness-httpget
spec:containers:- name: readiness-httpget-containerimage: nginxports:- name: httpcontainerPort: 80readinessProbe:httpGet:port: 80path: /index1.htmlinitialDelaySeconds: 1periodSeconds: 3livenessProbe:httpGet:port: httppath: /index.htmlinitialDelaySeconds: 1periodSeconds: 3timeoutSeconds: 10
六、YAML 配置详解
6.1 YAML 语法规范
使用空格缩进,禁止使用Tab
缩进空格数不重要,但要同级对齐
---
表示YAML文件开始#
表示注释
6.2 快速生成YAML模板
# 生成Pod模板
kubectl run nginx-test --image=nginx --port=80 --dry-run=client -o yaml# 生成Deployment模板
kubectl create deployment nginx-deploy --image=nginx --port=80 --replicas=3 --dry-run=client -o yaml# 导出现有资源配置
kubectl get svc nginx-service -o yaml
6.3 完整Deployment配置示例
apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-deploymentlabels:app: nginx
spec:replicas: 3selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx:1.15.4ports:- containerPort: 80resources:requests:memory: "64Mi"cpu: "250m"limits:memory: "128Mi"cpu: "500m"livenessProbe:httpGet:path: /index.htmlport: 80initialDelaySeconds: 5periodSeconds: 5
6.4 Service配置示例
apiVersion: v1
kind: Service
metadata:name: nginx-service
spec:type: NodePortports:- port: 80targetPort: 80nodePort: 30080selector:app: nginx
七、端口类型详解
7.1 四种端口对比
端口类型 | 作用 | 示例 |
---|---|---|
containerPort | 容器内部暴露的端口 | 80 |
targetPort | Pod的端口,Service转发目标 | 80 |
port | Service的端口,集群内部访问 | 80 |
nodePort | 节点端口,外部访问入口 | 30080-32767 |
7.2 端口映射关系
外部用户 → nodeIP:nodePort → Service:port → Pod:targetPort → Container:containerPort
八、实战技巧总结
8.1 常用命令速查
# 查看API版本
kubectl api-versions# 查看资源字段说明
kubectl explain pods.spec.containers# 动态查看Pod状态
kubectl get pods -w# 查看Pod详细事件
kubectl describe pod <pod-name># 进入Pod容器
kubectl exec -it <pod-name> -- bash
8.2 故障排查命令
# 查看Pod日志
kubectl logs <pod-name># 查看特定容器日志
kubectl logs <pod-name> -c <container-name># 查看节点资源分配
kubectl describe nodes <node-name># 查看Endpoints
kubectl get endpoints
8.3 最佳实践建议
资源设置:始终设置requests和limits,避免资源竞争
健康检查:配置完整的探针,确保应用稳定性
镜像策略:生产环境使用IfNotPresent,开发环境可用Always
版本控制:使用稳定的API版本,避免使用beta版本
标签管理:使用有意义的标签,便于服务发现和管理
通过本文的详细讲解和实战案例,您应该能够深入理解Kubernetes Pod的各个方面,并能够熟练编写和管理YAML配置文件。记得在实际工作中多练习、多实践,逐步掌握Kubernetes的强大功能。